咔叽游戏

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 687|回复: 2

[云和虚拟化] K8S中五种控制器的介绍以及使用

[复制链接]
  • TA的每日心情
    无聊
    2019-6-2 14:11
  • 签到天数: 4 天

    [LV.2]圆转纯熟

    发表于 2022-1-10 19:48:41 | 显示全部楼层 |阅读模式
    目录

      k8s的控制器类型pod与控制器之间的关系Deployment(无状态化应用)状态与无状态化对特点Deployment的更新Deployment的回滚CronJob控制器总结


    k8s的控制器类型

    Kubernetes中内建了很多controller(控制器),这些相当于一个状态机,用来控制Pod的具体状态和行为
    Deployment:适合无状态的服务部署
    StatefullSet:适合有状态的服务部署
    DaemonSet:一次部署,所有的node节点都会部署,例如一些典型的应用场景:
    运行集群存储 daemon,例如在每个Node上运行 glusterd、ceph
    在每个Node上运行日志收集 daemon,例如 fluentd、 logstash
    在每个Node上运行监控 daemon,例如 Prometheus Node Exporter
    Job:一次性的执行任务
    Cronjob:周期性的执行任务
    总体来说,K8S有五种控制器,分别对应处理无状态应用、有状态应用、守护型应用和批处理应用

    pod与控制器之间的关系

    controllers:在集群上管理和运行容器的对象通过label-selector相关联
    Pod通过控制器实现应用的运维,如伸缩,升级等
    K8S中五种控制器的介绍以及使用-1.png


    Deployment(无状态化应用)

    应用场景:web服务
    Deployment中文意思为部署、调度,通过Deployment我们能操作RS(ReplicaSet),你可以简单的理解为它是一种通过yml文件的声明,在Deployment 文件里可以定义Pod数量、更新方式、使用的镜像,资源限制等。无状态应用都用Deployment来创建
    通过Deployment对象,你可以轻松的做到以下事情:
      创建ReplicaSet和Pod滚动升级(不停止旧服务的状态下升级)和回滚应用(将应用回滚到之前的版本)平滑地扩容和缩容暂停和继续Deployment
    1. Deployment创建
    2. [root@master shuai]# vim nginx-delpoy.yaml
    3. apiVersion: apps/v1
    4. kind: Deployment   '定义是Deployment'
    5. metadata:
    6.   name: nginx-deployment
    7.   labels:
    8.     app: nginx
    9. spec:
    10.   replicas: 3  '副本数量为3'
    11.   selector:
    12.     matchLabels:
    13.       app: nginx
    14.   template:
    15.     metadata:
    16.       labels:
    17.         app: nginx
    18.     spec:
    19.       containers:
    20.       - name: nginx
    21.         image: nginx:1.15.4
    22.         ports:
    23.         - containerPort: 80
    24. '创建资源'
    25. [root@master shuai]# kubectl apply -f nginx-delpoy.yaml
    26. deployment.apps/nginx-deployment created
    27. //Replicaset 是控制版本,副本数,回滚就是通过此来实现
    28. '//查看所有资源'
    29. [root@master shuai]# kubectl get all
    30. NAME                                  READY   STATUS    RESTARTS   AGE
    31. pod/nginx-deployment-d55b94fd-cndf2   1/1     Running   0          3m31s
    32. pod/nginx-deployment-d55b94fd-ghlwk   1/1     Running   0          3m31s
    33. pod/nginx-deployment-d55b94fd-tm4sw   1/1     Running   0          3m31s
    34. pod/pod-example                       1/1     Running   0          10h
    35. NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    36. service/kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   3d6h
    37. NAME                               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    38. deployment.apps/nginx-deployment   3         3         3            3           3m31s
    39. NAME                                        DESIRED   CURRENT   READY   AGE
    40. replicaset.apps/nginx-deployment-d55b94fd   3         3         3       3m31s
    41. 查看控制器信息
    42. kubectl deit deployment/nginx-deployment
    43. .....省略信息.....
    44. strategy:
    45.     rollingUpdate:         '版本更新为滚动更新机制'
    46.       maxSurge: 25%        '最大更新副本数是25%,最多扩容125%' '为了保持副本数量,增加的百分比同时要销毁多少'
    47.       maxUnavailable: 25%  '最大删除副本是25%,最多缩容到75%'
    48.     type: RollingUpdate
    49. ...省略信息....
    50. '执行kubectl describe deploy nginx-deployment 也可以查看'
    51. ....省略信息....
    52. RollingUpdateStrategy:  25% max unavailable, 25% max surge
    53. 查看历史版本
    54. [root@master shuai]# kubectl rollout history deploy/nginx-deployment
    55. deployment.extensions/nginx-deployment
    56. REVISION  CHANGE-CAUSE
    57. 1         <none>   '//这边只有一个,证明还没有滚动更新'
    复制代码
    状态与无状态化对特点

    无状态服务的特点:
    1)deployment 认为所有的pod都是一样的
    2)不用考虑顺序的要求
    3)不用考虑在哪个node节点上运行
    4)可以随意扩容和缩容
    有状态服务的特点:
    1)实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper
    2)实例之间不对等的关系,以及依靠外部存储的应用。

    Deployment的更新
    1. 如果想要让 nginx pod 使用 nginx:1.9.1 的镜像来代替原来的 nginx的镜像,运行以下命令
    2. [root@master ~]# kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
    3. deployment.apps/nginx-deployment image updated
    4. 或者我们可以使用 edit 命令来编辑 Deployment,将image从nginx改写成 nginx:1.9.1
    5. kubectl edit deployment/nginx-deployment
    6. 查看更新进度
    7. [root@master ~]# kubectl rollout status deployment/nginx-deployment
    8. Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
    9. Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
    10. deployment "nginx-deployment" successfully rolled out
    复制代码
    Deployment更新时会创建一个新的ReplicaSet,然后将新的ReplicaSet中的Pod慢慢扩容到指定的副本数,将旧的ReplicaSet慢慢缩容到0。因此,更新时总能够确保旧的服务不会停止,这就是滚动更新。

    Deployment的回滚

    当我们像上文一样更新了Deployment之后,我们发现nginx:1.9.1的镜像不是很稳定,因此想要修改回nginx:1.7.9的版本,此时我们不需要手动更改Deployment文件,而是利用Deployment的回滚功能。
    使用rollout history命令查看Deployment的版本(revision):
    1. [root@master ~]# kubectl rollout history deployment/nginx-deployment
    2. deployment.apps/nginx-deployment
    3. REVISION  CHANGE-CAUSE
    4. 1         kubectl create --filename=deploy.yml --record=true
    5. 2         kubectl create --filename=deploy.yml --record=true
    复制代码
    因为我们创建 Deployment 的时候使用了 recored 参数可以记录命令,我们可以很方便的查看每次 revison 的变化。
    1. 查看单个 revision 的详细信息:
    2. [root@master ~]# kubectl rollout history deployment/nginx-deployment --revision=2
    3. deployment.apps/nginx-deployment with revision #2
    4. Pod Template:
    5.   Labels:       app=nginx
    6.         pod-template-hash=658d7f4b4b
    7.   Annotations:  kubernetes.io/change-cause: kubectl create --filename=deploy.yml --record=true
    8.   Containers:
    9.    nginx:
    10.     Image:      nginx:1.9.1
    11.     Port:       80/TCP
    12.     Host Port:  0/TCP
    13.     Environment:        <none>
    14.     Mounts:     <none>
    15.   Volumes:      <none>
    16. 可以使用rollout undo命令回滚到前一个revision
    17. [root@master ~]# kubectl rollout undo deployment/nginx-deployment
    18. deployment.apps/nginx-deployment rolled back
    19. [root@master ~]# kubectl describe deployment/nginx-deployment
    20. Name:                   nginx-deployment
    21. Namespace:              default
    22. CreationTimestamp:      Fri, 24 Dec 2021 22:24:10 +0800
    23. Labels:                 <none>
    24. Annotations:            deployment.kubernetes.io/revision: 3
    25.                         kubernetes.io/change-cause: kubectl create --filename=deploy.yml --record=true
    26. Selector:               app=nginx
    27. Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
    28. StrategyType:           RollingUpdate
    29. MinReadySeconds:        0
    30. RollingUpdateStrategy:  25% max unavailable, 25% max surge
    31. Pod Template:
    32.   Labels:  app=nginx
    33.   Containers:
    34.    nginx:
    35.     Image:        nginx
    36.     Port:         80/TCP
    37.     Host Port:    0/TCP
    38.     Environment:  <none>
    39.     Mounts:       <none>
    40.   Volumes:        <none>
    41. 也可以使用to-revision参数指定某个历史版本:
    42. [root@master ~]#  kubectl rollout undo deployment/nginx-deployment --to-revision=2
    43. deployment.apps/nginx-deployment rolled back
    44. [root@master ~]# kubectl describe deployment/nginx-deployment
    45. Name:                   nginx-deployment
    46. Namespace:              default
    47. CreationTimestamp:      Fri, 24 Dec 2021 22:24:10 +0800
    48. Labels:                 <none>
    49. Annotations:            deployment.kubernetes.io/revision: 4
    50.                         kubernetes.io/change-cause: kubectl create --filename=deploy.yml --record=true
    51. Selector:               app=nginx
    52. Replicas:               3 desired | 3 updated | 4 total | 3 available | 1 unavailable
    53. StrategyType:           RollingUpdate
    54. MinReadySeconds:        0
    55. RollingUpdateStrategy:  25% max unavailable, 25% max surge
    56. Pod Template:
    57.   Labels:  app=nginx
    58.   Containers:
    59.    nginx:
    60.     Image:        nginx:1.9.1
    61.     Port:         80/TCP
    62.     Host Port:    0/TCP
    63.     Environment:  <none>
    64.     Mounts:       <none>
    65.   Volumes:        <none>
    复制代码
    你可以通过设置 .spec.revisonHistoryLimit 项来指定 deployment 最多保留多少 revison 历史记录。默认的会保留所有的 revision;如果将该项设置为 0,Deployment 就不允许回退了。
    只有 Deployment 的 rollout 被触发才会创建一个 revision!注意!当且仅当 Deployment 的 Pod template被更改,例如更新 template 中的 label 和容器镜像时,才会触发一个rollout,从而为Deployment创建出一个新的 revision。
    rollout命令的更多用法:
      history(查看历史版本)pause(暂停Deployment)resume(恢复暂停的Deployment)status(查看资源状态)undo(回滚版本)
    Job Controller负责根据Job Spec创建Pod,并持续监控Pod的状态,直至其成功结束。如果失败,则根据restartPolicy(只支持OnFailure和Never,不支持Always)决定是否创建新的Pod再次重试任务。
    K8S中五种控制器的介绍以及使用-2.png

    Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。
    Kubernetes支持以下几种Job:
      非并行Job:通常创建一个Pod直至其成功结束固定结束次数的Job:设置.spec.completions,创建多个Pod,直到.spec.completions个Pod成功结束带有工作队列的并行Job:设置.spec.Parallelism但不设置.spec.completions,当所有Pod结束并且至少一个成功时,Job就认为是成功根据.spec.completions和.spec.Parallelism的设置,可以将Job划分为以下几种pattern
    JOB类型使用实例行为completionsparallelism
    一次性Job数据库迁移创建一个Pod直至其成功结束11
    固定结束次数的Job处理工作队列的Pod依次创建一个Pod运行直至completions个成功结束2+1
    固定结束次数的并行Job多个Pod同时处理工作队列依次创建多个Pod运行直至completions个成功结束2+2+
    并行Job多个Pod同时处理工作队列创建一个或多个Pod直至有一个成功结束12+
    1. .job的使用
    2. [root@master ~]# vi job.yml
    3. ---
    4. apiVersion: batch/v1
    5. kind: Job
    6. metadata:
    7.   name: myjob
    8. spec:
    9.   template:
    10.     spec:
    11.       containers:
    12.       - name: myjob
    13.         image: busybox
    14.         command: ["echo",  "hello k8s job"]
    15.       restartPolicy: Never
    16. [root@master ~]# kubectl apply -f job.yml
    17. job.batch/myjob created
    18. [root@master ~]# kubectl get pods
    19. NAME          READY   STATUS      RESTARTS   AGE
    20. myjob-gq27p   0/1     Completed   0          37s
    21. #查看这个 pod的任务
    22. [root@master ~]# kubectl get job
    23. NAME    COMPLETIONS   DURATION   AGE
    24. myjob   1/1           19s        5m11s
    25. #查看这个 pod的日志
    26. [root@master ~]# kubectl logs myjob-gq27p
    27. hello k8s job
    复制代码
    CronJob控制器

    CronJob 可以用来执行基于时间计划的定时任务,类似于Linux/Unix系统中的 crontable (opens new window)。
    CronJob 执行周期性的重复任务时非常有用,例如备份数据、发送邮件等。CronJob 也可以用来指定将来某个时间点执行单个任务,例如将某项任务定时到系统负载比较低的时候执行。
    一个 CronJob 对象就像 crontab (cron table) 文件中的一行。 它用Cron格式进行编写, 并周期性地在给定的调度时间执行 Job。
    注意:
      所有 CronJob 的 schedule: 时间都是基于kube-controller-manager. 的时区。如果你的控制平面在 Pod 或是裸容器中运行了 kube-controller-manager, 那么为该容器所设置的时区将会决定 Cron Job 的控制器所使用的时区。为 CronJob 资源创建清单时,请确保所提供的名称是一个合法的DNS 子域名. 名称不能超过 52 个字符。 这是因为 CronJob 控制器将自动在提供的 Job 名称后附加 11 个字符,并且存在一个限制, 即 Job 名称的最大长度不能超过 63 个字符。CronJob 用于执行周期性的动作,例如备份、报告生成等。 这些任务中的每一个都应该配置为周期性重复的(例如:每天/每周/每月一次); 你可以定义任务开始执行的时间间隔。
    下面的 CronJob 示例清单会在每分钟打印出当前时间和问候消息:
    1. [root@master kubenetres]# vi cronjob.yml
    2. ---
    3. apiVersion: batch/v1beta1
    4. kind: CronJob
    5. metadata:
    6.   name: hello
    7. spec:
    8.   schedule: "*/1 * * * *"
    9.   jobTemplate:
    10.     spec:
    11.       template:
    12.         spec:
    13.           containers:
    14.           - name: hello
    15.             image: busybox
    16.             imagePullPolicy: IfNotPresent
    17.             command:
    18.             - /bin/sh
    19.             - -c
    20.             - date; echo Hello nihao
    21.           restartPolicy: OnFailure
    22. 创建pod查看
    23. [root@master ~]# kubectl apply -f cronjob.yml
    24. Warning: batch/v1beta1 CronJob is deprecated in v1.21+, unavailable in v1.25+; use batch/v1 CronJob
    25. cronjob.batch/hello created
    26. #等一分钟查看
    27. [root@master ~]# kubectl get pods
    28. NAME                   READY   STATUS      RESTARTS   AGE
    29. hello-27339330-kkfxv   0/1     Completed   0          2s
    30. #查看日志
    31. [root@master ~]# kubectl logs hello-27339330-kkfxv
    32. Fri Dec 24 15:30:00 UTC 2021
    33. Hello nihao
    复制代码
    总结

    到此这篇关于K8S中五种控制器及使用的文章就介绍到这了,更多相关K8S控制器使用内容请搜索咔叽论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持咔叽论坛!

    原文地址:https://www.jb51.net/article/233249.htm
  • TA的每日心情
    开心
    2022-9-24 02:33
  • 签到天数: 4 天

    [LV.2]圆转纯熟

    发表于 2022-9-21 21:07:42 | 显示全部楼层
    6666666666666666666666
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-9-24 02:33
  • 签到天数: 4 天

    [LV.2]圆转纯熟

    发表于 2022-9-21 21:08:46 | 显示全部楼层
    66666666666666666
    回复 支持 反对

    使用道具 举报

    QQ|免责声明|小黑屋|手机版|Archiver|咔叽游戏

    GMT+8, 2024-3-29 06:35

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表