• 售前

  • 售后

热门帖子
入门百科

K8S中五种控制器的介绍以及使用

[复制链接]
123457549 显示全部楼层 发表于 2022-1-7 16:33:06 |阅读模式 打印 上一主题 下一主题
目录


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

k8s的控制器范例

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

pod与控制器之间的关系

controllers:在集群上管理和运行容器的对象通过label-selector干系联
Pod通过控制器实现应用的运维,如伸缩,升级等


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. 1)deployment 认为所有的pod都是一样的
  2. 2)不用考虑顺序的要求
  3. 3)不用考虑在哪个node节点上运行
  4. 4)可以随意扩容和缩容
复制代码
有状态服务的特点:
  1. 1)实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper
  2. 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再次重试任务。

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范例            使用实例            行为            completions            parallelism                                    一次性Job            数据库迁徙            创建一个Pod直至其成功结束            1            1                            固定结束次数的Job            处置惩罚工作队列的Pod            依次创建一个Pod运行直至completions个成功结束            2+            1                            固定结束次数的并行Job            多个Pod同时处置惩罚工作队列            依次创建多个Pod运行直至completions个成功结束            2+            2+                            并行Job            多个Pod同时处置惩罚工作队列            创建一个或多个Pod直至有一个成功结束            1            2+        
  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<br />
复制代码
总结

到此这篇关于K8S中五种控制器及使用的文章就介绍到这了,更多干系K8S控制器使用内容请搜刮脚本之家从前的文章或继续欣赏下面的干系文章渴望各人以后多多支持脚本之家!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作