Kubernetes 的核心功能之一在于确保各个资源对象的当前状态status,以匹配用户希望的状态spec,使当前状态不断地向希望状态和解来完成容器应用管理这就是控制器

PS:Kubernetes的控制器有十几种,这里仅说明常用的。

Pod 控制器的组成

Pod 控制器资源至少包含三个基本的组成部分:

  • 标签选择器: 匹配并关联Pod资源对象,并据此完成受其管控的Pod资源计数
  • 期望的副本数:期望在集群中精确运行着的Pod资源对象数量
  • Pod模板:用于新建Pod资源对象的Pod模板资源
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. annotations:
  5. deployment.kubernetes.io/revision: '4'
  6. # 资源标签
  7. labels:
  8. app: admin-client-nginx
  9. module: nginx
  10. name: admin-client-nginx
  11. namespace: interests
  12. # 期望的用户状态
  13. spec:
  14. progressDeadlineSeconds: 600
  15. # 期望的副本数
  16. replicas: 1
  17. revisionHistoryLimit: 10
  18. # 标签选择器
  19. selector:
  20. matchLabels:
  21. app: admin-client-nginx
  22. strategy:
  23. rollingUpdate:
  24. maxSurge: 25%
  25. maxUnavailable: 25%
  26. type: RollingUpdate
  27. # Pod模板
  28. template:
  29. metadata:
  30. annotations:
  31. labels:
  32. app: admin-client-nginx
  33. spec:
  34. containers:
  35. - image: 'nginx:1.20'
  36. imagePullPolicy: IfNotPresent
  37. name: admin-client-nginx
  38. ports:
  39. - containerPort: 80
  40. name: http
  41. protocol: TCP
  42. # 资源请求
  43. resources:
  44. requests:
  45. cpu: 250m
  46. memory: 512Mi
  47. terminationMessagePath: /dev/termination-log
  48. terminationMessagePolicy: File
  49. volumeMounts:
  50. - mountPath: /etc/localtime
  51. name: volume-1648780685822
  52. - mountPath: /etc/nginx/conf.d
  53. name: volume-1648791000841
  54. dnsPolicy: ClusterFirst
  55. restartPolicy: Always
  56. schedulerName: default-scheduler
  57. securityContext: {}
  58. terminationGracePeriodSeconds: 30
  59. volumes:
  60. - hostPath:
  61. path: /etc/localtime
  62. type: ''
  63. name: volume-1648780685822
  64. - name: volume-1648791000841
  65. secret:
  66. defaultMode: 420
  67. secretName: admin-client-nginx
  68. # 当前用户状态
  69. status:
  70. availableReplicas: 1
  71. conditions:
  72. - lastTransitionTime: '2022-04-01T05:12:35Z'
  73. lastUpdateTime: '2022-04-01T05:30:27Z'
  74. message: ReplicaSet "admin-client-nginx-5888bfd5b6" has successfully progressed.
  75. reason: NewReplicaSetAvailable
  76. status: 'True'
  77. type: Progressing
  78. - lastTransitionTime: '2022-04-11T02:47:14Z'
  79. lastUpdateTime: '2022-04-11T02:47:14Z'
  80. message: Deployment has minimum availability.
  81. reason: MinimumReplicasAvailable
  82. status: 'True'
  83. type: Available
  84. observedGeneration: 4
  85. readyReplicas: 1
  86. replicas: 1
  87. updatedReplicas: 1

Pod 控制器类型

Deployment 无状态

Deployment 构建与ReplicaSet控制器之上,主要职责同样是为了保证Pod资源的健康运行,主要包括:

  • 事件状态查看:查看对象升级详细进度状态
  • 回滚:升级操作完成后可以回滚机制将应该返回到前一个
  • 版本记录:对每一次操作都给予保存
  • 暂停和启动:对于每一次升级,都能够随时暂停和启动
  • 多种自动更新方案Recreate重建更新,全面停止、删除旧的Pod后启用新版本替代;另一个是RollingUpdate即滚动升级机制,逐步替换旧有的Pod至新的版本。
  1. apiVersion: apps/v1
  2. # 无状态类型
  3. kind: Deployment
  4. metadata:
  5. annotations:
  6. generation: 1
  7. labels:
  8. app: billbear-hotel-client
  9. module: api
  10. name: billbear-hotel-client
  11. namespace: interests
  12. # 期望配置
  13. spec:
  14. progressDeadlineSeconds: 600
  15. replicas: 1
  16. revisionHistoryLimit: 10
  17. # 更新策略
  18. strategyType: RollingUpdate
  19. selector:
  20. matchLabels:
  21. app: billbear-hotel-client
  22. # 模板
  23. template:
  24. metadata:
  25. labels:
  26. app: billbear-hotel-client
  27. spec:
  28. containers:
  29. image: ''
  30. imagePullPolicy: Always
  31. name: billbear-hotel-client
  32. ports:
  33. - containerPort: 8080
  34. name: http
  35. protocol: TCP
  36. resources:
  37. requests:
  38. memory: 512Mi
  39. volumeMounts:
  40. - mountPath: /etc/localtime
  41. name: volume-localtime
  42. - mountPath: /app/logs/
  43. name: volumn-sls-16468903003157
  44. dnsPolicy: ClusterFirst
  45. imagePullSecrets:
  46. - name: aliyun-shanghai
  47. restartPolicy: Always
  48. schedulerName: default-scheduler
  49. securityContext: {}
  50. terminationGracePeriodSeconds: 30
  51. volumes:
  52. - hostPath:
  53. path: /etc/localtime
  54. type: ''
  55. name: volume-localtime
  56. - emptyDir: {}
  57. name: volumn-sls-16468903003157

更新升级说明

Deployment 控制器支持Recreate重建更新,RollingUpdate滚动更新

重建更新:首选删除现有的Pod对象,而后由控制器基于新模板重新创建出新版本资源对象。通常只有在新的不兼容旧版本时使用。

滚动更新:是默认的升级策略,创建一部分新版本Pod对象,进行应用升级,其优势是升级期间,容器中应用提供的服务不会中断。

  • spec.minReadySeconds 控制升级时长
  • spec.strategy.rollingUpdate.maxSurge升级期间存在的总Pod对象数量最多超出期望值的个数
  • spec.strategy.rollingUpdate.maxUnavailable 升级期间正常可用的Pod数量

PS:使用升级命令时候,必须修改 spec 内内容否则不会触发更新

  1. # 使用命令修改镜像并出发更新
  2. kubectl path deployment [名称] -p '{"spec": {"containers": ["image":"xxx:v2"]}}'

Pod 控制器 - 图1

DaemonSet 守护进程集

DaemonSet 用于在集群的全部节点上同时运行一份指定的Pod资源,它是一个特殊的控制器,它有特定的应用场景,通常运行那些执行系统级操作任务的应用

  • 保证每个节点都会运行一个Pod
  • 事件状态查看:查看对象升级详细进度状态
  • 回滚:升级操作完成后可以回滚机制将应该返回到前一个
  • 版本记录:对每一次操作都给予保存
  • 暂停和启动:对于每一次升级,都能够随时暂停和启动
  • 多种自动更新方案Recreate重建更新,全面停止、删除旧的Pod后启用新版本替代;另一个是RollingUpdate即滚动升级机制,逐步替换旧有的Pod至新的版本。
  1. apiVersion: apps/v1
  2. # 守护进程
  3. kind: DaemonSet
  4. metadata:
  5. labels:
  6. app: flannel
  7. tier: node
  8. name: kube-flannel-ds
  9. namespace: kube-system
  10. spec:
  11. revisionHistoryLimit: 10
  12. selector:
  13. matchLabels:
  14. app: flannel
  15. tier: node
  16. template:
  17. metadata:
  18. labels:
  19. app: flannel
  20. tier: node
  21. spec:
  22. containers:
  23. image: >-
  24. registry-vpc.cn-shanghai.aliyuncs.com/acs/flannel:v0.15.1.5-11d1c700-aliyun
  25. imagePullPolicy: IfNotPresent
  26. name: kube-flannel
  27. resources:
  28. requests:
  29. cpu: 100m
  30. memory: 100Mi
  31. securityContext:
  32. capabilities:
  33. add:
  34. - NET_ADMIN
  35. - SYS_ADMIN
  36. privileged: false
  37. readOnlyRootFilesystem: false
  38. terminationMessagePath: /dev/termination-log
  39. terminationMessagePolicy: File
  40. volumeMounts:
  41. - mountPath: /run
  42. name: run
  43. - mountPath: /etc/kube-flannel/
  44. name: flannel-cfg
  45. dnsPolicy: ClusterFirst
  46. # 共享宿主机网络
  47. hostNetwork: true
  48. nodeSelector:
  49. kubernetes.io/os: linux
  50. priorityClassName: system-node-critical
  51. restartPolicy: Always
  52. schedulerName: default-scheduler
  53. securityContext: {}
  54. serviceAccount: flannel
  55. serviceAccountName: flannel
  56. terminationGracePeriodSeconds: 30
  57. tolerations:
  58. - operator: Exists
  59. volumes:
  60. - hostPath:
  61. path: /run
  62. type: ''
  63. name: run
  64. - hostPath:
  65. path: /etc/cni/net.d
  66. type: ''
  67. name: cni
  68. - configMap:
  69. defaultMode: 420
  70. name: kube-flannel-cfg
  71. name: flannel-cfg

更新升级说明

重建更新:首选删除现有的Pod对象,而后由控制器基于新模板重新创建出新版本资源对象。通常只有在新的不兼容旧版本时使用。

滚动更新:是默认的升级策略,先删除一个节点上的Pod资源,等待其新版本Pod资源重建完成后在开始操作另外一个节点上的Pod资源

StatefulSet 有状态

应用程序存在 “有状态” 和 “无状态”, 而无状态程序可以按需增加、减少、或者重构,而不会对服务有影响。 当程序与用户、设备、其他应用程序或外部组件进行通讯时,根据其是是否需要记录前一次或多次通信中的相关时间信息易作为下一次通讯分类标准,可以将那些需要记录系信息的应用程序称为有状态应用

StatefulSet 用于部署个扩展有状态应用的Pod,确保他们的运行顺序以及每个Pod资源的唯一性

  • 稳定具有唯一的网络标识符
  • 稳定且持久的存储
  • 有序、优雅的部署和扩展
  • 有序、优雅的删除和终止
  • 有序而自动的滚动更新
  1. apiVersion: apps/v1
  2. kind: StatefulSet
  3. metadata:
  4. labels:
  5. app: rabbitmq
  6. name: rabbitmq
  7. namespace: base
  8. spec:
  9. podManagementPolicy: OrderedReady
  10. replicas: 1
  11. revisionHistoryLimit: 10
  12. selector:
  13. matchLabels:
  14. app: rabbitmq
  15. serviceName: rabbitmq-svc
  16. template:
  17. metadata:
  18. labels:
  19. app: rabbitmq
  20. spec:
  21. affinity: {}
  22. containers:
  23. image: 'registry-vpc.cn-shanghai.aliyuncs.com/basis/rabbitmq:delayed'
  24. imagePullPolicy: Always
  25. name: rabbitmq
  26. ports:
  27. - containerPort: 15672
  28. name: admin
  29. protocol: TCP
  30. - containerPort: 5672
  31. name: tcp
  32. protocol: TCP
  33. resources:
  34. requests:
  35. memory: 1Gi
  36. terminationMessagePath: /dev/termination-log
  37. terminationMessagePolicy: File
  38. volumeMounts:
  39. - mountPath: /etc/localtime
  40. name: volume-localtime
  41. - mountPath: /var/lib/rabbitmq/mnesia/rabbit@rabbitmq-0
  42. name: volume-rabbitmq-pvc
  43. dnsPolicy: ClusterFirst
  44. imagePullSecrets:
  45. - name: aliyun-shanghai
  46. restartPolicy: Always
  47. schedulerName: default-scheduler
  48. securityContext: {}
  49. terminationGracePeriodSeconds: 30
  50. volumes:
  51. - hostPath:
  52. path: /etc/localtime
  53. type: ''
  54. name: volume-localtime
  55. - name: volume-rabbitmq-pvc
  56. persistentVolumeClaim:
  57. claimName: rabbitmq-pvc
  58. updateStrategy:
  59. type: RollingUpdate

更新升级说明

重建更新:首选删除现有的Pod对象,而后由控制器基于新模板重新创建出新版本资源对象。通常只有在新的不兼容旧版本时使用。

滚动更新:是默认的升级策略,Pod资源以逆向的形式从其最大索引编号的Pod资源逐一进行,它在终止一个Pod资源,更新资源并待其就绪后启动更新下一个资源,即索引号比当前号小1的Pod资源。

暂缓更新:

  • spec.update-Strategy.rollingUpdate.partition 设置Pod资源的副本数量,比Pod资源最大索引号大1,则所有的Pod资源都不会处于可直接更新的分区之内

Job 控制器

Job 控制器用于调配Pod对象运行一次性任务,容器中的进程在正常运行结束后不会对其重启,而是将Pod对象置于 Completed(完成)状态

  • Job 控制器常用于管理那些运行一段时间便可”完成”的任务,例如数据库备份等操作
  • 单工作队列:多个一次性任务串行执行多次作业,直至满足期望的次数
  • 多工作队列:这个方式可以设置工作队列数,即作业数,每个队列仅负责运行一个或多个任务

spec.completions总任务数量 spec.parallelism并行度 spec.actuveDeadlineSecinds 最大活动时间长度,超出此时长的作业将被终止 spec.backoffLimit将作业标记为失败状态之前的重试次数

PS:restartPolicy默认是_**Always**_ 始终重启,单对于Job 不是很合适,使用 Never

  1. apiVersion: apps/v1
  2. # Job
  3. kind: Job
  4. metadata:
  5. name: job-test
  6. spec:
  7. # 运行多少次
  8. completions: 5
  9. # 并发队列
  10. parallelism: 1
  11. # 最大执行时间,超过则强制停止
  12. actuveDeadlineSecinds: 60
  13. # 重试次数
  14. backoffLimit: 3
  15. template:
  16. spec:
  17. containers:
  18. - name: test
  19. image: xxx:v1
  20. command: ["/bin/sh", "-c", "sleep 20"]
  21. # 默认是Always 始终重启,单对于Job 建议禁用
  22. restartPolicy: Never

CronJob 控制器

CronJob 控制器用于管理Job 控制器资源的运行时间。CronJob 类似Linux操作系统的周期性任务作业计划(Cron)的方式控制其运行的时间点及重复运行的方式。

  • 在未来某时间点运行作业一次
  • 在指定的时间点重复运行作业

spec.jobTemplateJOB任务模板 spec.scheduleCron格式的作业调度运行 spec.concurrencyPolicy 并发执行策略,Allow 允许,Fobid 禁用,Replace 替换,定义前一次任务没有执行完成时如何运行后一次的作业 spec.failedJobHistoryLimit为失败任务执行保留的历史记录数 spec.successfulJobsHistoryLimit为成功任务执行保留的历史记录数 spec.startingDeadlineSeconds执行超时,记录历史记录 spec.suspend是否挂起后续的任务执行,默认false

  1. apiVersion: apps/v1
  2. # Job
  3. kind: CronJob
  4. metadata:
  5. name: job-test
  6. spec:
  7. # Cron 表达式
  8. schedule: "**/2 * * * *"
  9. # Job 模板
  10. jobTemplate:
  11. # 运行多少次
  12. completions: 5
  13. # 并发队列
  14. parallelism: 1
  15. # 最大执行时间,超过则强制停止
  16. actuveDeadlineSecinds: 60
  17. # 重试次数
  18. backoffLimit: 3
  19. template:
  20. spec:
  21. containers:
  22. - name: test
  23. image: xxx:v1
  24. command: ["/bin/sh", "-c", "sleep 20"]
  25. # 默认是Always 始终重启,单对于Job 建议禁用
  26. restartPolicy: Never