Kubernetes 的核心功能之一在于确保各个资源对象的当前状态
status
,以匹配用户希望的状态spec
,使当前状态不断地向希望状态和解
来完成容器应用管理这就是控制器
。
PS:Kubernetes的控制器有十几种,这里仅说明常用的。
Pod 控制器的组成
Pod 控制器资源至少包含三个基本的组成部分:
- 标签选择器: 匹配并关联Pod资源对象,并据此完成受其管控的Pod资源计数
- 期望的副本数:期望在集群中精确运行着的Pod资源对象数量
- Pod模板:用于新建Pod资源对象的Pod模板资源
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: '4'
# 资源标签
labels:
app: admin-client-nginx
module: nginx
name: admin-client-nginx
namespace: interests
# 期望的用户状态
spec:
progressDeadlineSeconds: 600
# 期望的副本数
replicas: 1
revisionHistoryLimit: 10
# 标签选择器
selector:
matchLabels:
app: admin-client-nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
# Pod模板
template:
metadata:
annotations:
labels:
app: admin-client-nginx
spec:
containers:
- image: 'nginx:1.20'
imagePullPolicy: IfNotPresent
name: admin-client-nginx
ports:
- containerPort: 80
name: http
protocol: TCP
# 资源请求
resources:
requests:
cpu: 250m
memory: 512Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /etc/localtime
name: volume-1648780685822
- mountPath: /etc/nginx/conf.d
name: volume-1648791000841
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- hostPath:
path: /etc/localtime
type: ''
name: volume-1648780685822
- name: volume-1648791000841
secret:
defaultMode: 420
secretName: admin-client-nginx
# 当前用户状态
status:
availableReplicas: 1
conditions:
- lastTransitionTime: '2022-04-01T05:12:35Z'
lastUpdateTime: '2022-04-01T05:30:27Z'
message: ReplicaSet "admin-client-nginx-5888bfd5b6" has successfully progressed.
reason: NewReplicaSetAvailable
status: 'True'
type: Progressing
- lastTransitionTime: '2022-04-11T02:47:14Z'
lastUpdateTime: '2022-04-11T02:47:14Z'
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: 'True'
type: Available
observedGeneration: 4
readyReplicas: 1
replicas: 1
updatedReplicas: 1
Pod 控制器类型
Deployment 无状态
Deployment 构建与
ReplicaSet
控制器之上,主要职责同样是为了保证Pod资源的健康运行,主要包括:
- 事件状态查看:查看对象升级详细进度状态
- 回滚:升级操作完成后可以回滚机制将应该返回到前一个
- 版本记录:对每一次操作都给予保存
- 暂停和启动:对于每一次升级,都能够随时暂停和启动
- 多种自动更新方案:
Recreate
重建更新,全面停止、删除旧的Pod后启用新版本替代;另一个是RollingUpdate
即滚动升级机制,逐步替换旧有的Pod至新的版本。
apiVersion: apps/v1
# 无状态类型
kind: Deployment
metadata:
annotations:
generation: 1
labels:
app: billbear-hotel-client
module: api
name: billbear-hotel-client
namespace: interests
# 期望配置
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
# 更新策略
strategyType: RollingUpdate
selector:
matchLabels:
app: billbear-hotel-client
# 模板
template:
metadata:
labels:
app: billbear-hotel-client
spec:
containers:
image: ''
imagePullPolicy: Always
name: billbear-hotel-client
ports:
- containerPort: 8080
name: http
protocol: TCP
resources:
requests:
memory: 512Mi
volumeMounts:
- mountPath: /etc/localtime
name: volume-localtime
- mountPath: /app/logs/
name: volumn-sls-16468903003157
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: aliyun-shanghai
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- hostPath:
path: /etc/localtime
type: ''
name: volume-localtime
- emptyDir: {}
name: volumn-sls-16468903003157
更新升级说明
Deployment 控制器支持
Recreate
重建更新,RollingUpdate
滚动更新重建更新:首选删除现有的Pod对象,而后由控制器基于新模板重新创建出新版本资源对象。通常只有在新的不兼容旧版本时使用。
滚动更新:是默认的升级策略,创建一部分新版本Pod对象,进行应用升级,其优势是升级期间,容器中应用提供的服务不会中断。
spec.minReadySeconds
控制升级时长spec.strategy.rollingUpdate.maxSurge
升级期间存在的总Pod对象数量最多超出期望值的个数spec.strategy.rollingUpdate.maxUnavailable
升级期间正常可用的Pod数量PS:使用升级命令时候,必须修改 spec 内内容否则不会触发更新
# 使用命令修改镜像并出发更新
kubectl path deployment [名称] -p '{"spec": {"containers": ["image":"xxx:v2"]}}'
DaemonSet 守护进程集
DaemonSet 用于在集群的全部节点上同时运行一份指定的Pod资源,它是一个特殊的控制器,它有特定的应用场景,通常运行那些执行系统级操作任务的应用
- 保证每个节点都会运行一个Pod
- 事件状态查看:查看对象升级详细进度状态
- 回滚:升级操作完成后可以回滚机制将应该返回到前一个
- 版本记录:对每一次操作都给予保存
- 暂停和启动:对于每一次升级,都能够随时暂停和启动
- 多种自动更新方案:
Recreate
重建更新,全面停止、删除旧的Pod后启用新版本替代;另一个是RollingUpdate
即滚动升级机制,逐步替换旧有的Pod至新的版本。
apiVersion: apps/v1
# 守护进程
kind: DaemonSet
metadata:
labels:
app: flannel
tier: node
name: kube-flannel-ds
namespace: kube-system
spec:
revisionHistoryLimit: 10
selector:
matchLabels:
app: flannel
tier: node
template:
metadata:
labels:
app: flannel
tier: node
spec:
containers:
image: >-
registry-vpc.cn-shanghai.aliyuncs.com/acs/flannel:v0.15.1.5-11d1c700-aliyun
imagePullPolicy: IfNotPresent
name: kube-flannel
resources:
requests:
cpu: 100m
memory: 100Mi
securityContext:
capabilities:
add:
- NET_ADMIN
- SYS_ADMIN
privileged: false
readOnlyRootFilesystem: false
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /run
name: run
- mountPath: /etc/kube-flannel/
name: flannel-cfg
dnsPolicy: ClusterFirst
# 共享宿主机网络
hostNetwork: true
nodeSelector:
kubernetes.io/os: linux
priorityClassName: system-node-critical
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: flannel
serviceAccountName: flannel
terminationGracePeriodSeconds: 30
tolerations:
- operator: Exists
volumes:
- hostPath:
path: /run
type: ''
name: run
- hostPath:
path: /etc/cni/net.d
type: ''
name: cni
- configMap:
defaultMode: 420
name: kube-flannel-cfg
name: flannel-cfg
更新升级说明
重建更新:首选删除现有的Pod对象,而后由控制器基于新模板重新创建出新版本资源对象。通常只有在新的不兼容旧版本时使用。
滚动更新:是默认的升级策略,先删除一个节点上的Pod资源,等待其新版本Pod资源重建完成后在开始操作另外一个节点上的Pod资源
StatefulSet 有状态
应用程序存在 “有状态” 和 “无状态”, 而无状态程序可以按需增加、减少、或者重构,而不会对服务有影响。 当程序与用户、设备、其他应用程序或外部组件进行通讯时,根据其是是否需要记录前一次或多次通信中的相关时间信息易作为下一次通讯分类标准,可以将那些需要记录系信息的应用程序称为有状态应用
StatefulSet 用于部署个扩展有状态应用的Pod,确保他们的运行顺序以及每个Pod资源的唯一性
- 稳定具有唯一的网络标识符
- 稳定且持久的存储
- 有序、优雅的部署和扩展
- 有序、优雅的删除和终止
- 有序而自动的滚动更新
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app: rabbitmq
name: rabbitmq
namespace: base
spec:
podManagementPolicy: OrderedReady
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: rabbitmq
serviceName: rabbitmq-svc
template:
metadata:
labels:
app: rabbitmq
spec:
affinity: {}
containers:
image: 'registry-vpc.cn-shanghai.aliyuncs.com/basis/rabbitmq:delayed'
imagePullPolicy: Always
name: rabbitmq
ports:
- containerPort: 15672
name: admin
protocol: TCP
- containerPort: 5672
name: tcp
protocol: TCP
resources:
requests:
memory: 1Gi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /etc/localtime
name: volume-localtime
- mountPath: /var/lib/rabbitmq/mnesia/rabbit@rabbitmq-0
name: volume-rabbitmq-pvc
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: aliyun-shanghai
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- hostPath:
path: /etc/localtime
type: ''
name: volume-localtime
- name: volume-rabbitmq-pvc
persistentVolumeClaim:
claimName: rabbitmq-pvc
updateStrategy:
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
apiVersion: apps/v1
# Job
kind: Job
metadata:
name: job-test
spec:
# 运行多少次
completions: 5
# 并发队列
parallelism: 1
# 最大执行时间,超过则强制停止
actuveDeadlineSecinds: 60
# 重试次数
backoffLimit: 3
template:
spec:
containers:
- name: test
image: xxx:v1
command: ["/bin/sh", "-c", "sleep 20"]
# 默认是Always 始终重启,单对于Job 建议禁用
restartPolicy: Never
CronJob 控制器
CronJob 控制器用于管理Job 控制器资源的运行时间。CronJob 类似Linux操作系统的周期性任务作业计划(Cron)的方式控制其运行的时间点及重复运行的方式。
- 在未来某时间点运行作业一次
- 在指定的时间点重复运行作业
spec.jobTemplate
JOB任务模板spec.schedule
Cron格式的作业调度运行spec.concurrencyPolicy
并发执行策略,Allow 允许,Fobid 禁用,Replace 替换,定义前一次任务没有执行完成时如何运行后一次的作业spec.failedJobHistoryLimit
为失败任务执行保留的历史记录数spec.successfulJobsHistoryLimit
为成功任务执行保留的历史记录数spec.startingDeadlineSeconds
执行超时,记录历史记录spec.suspend
是否挂起后续的任务执行,默认false
apiVersion: apps/v1
# Job
kind: CronJob
metadata:
name: job-test
spec:
# Cron 表达式
schedule: "**/2 * * * *"
# Job 模板
jobTemplate:
# 运行多少次
completions: 5
# 并发队列
parallelism: 1
# 最大执行时间,超过则强制停止
actuveDeadlineSecinds: 60
# 重试次数
backoffLimit: 3
template:
spec:
containers:
- name: test
image: xxx:v1
command: ["/bin/sh", "-c", "sleep 20"]
# 默认是Always 始终重启,单对于Job 建议禁用
restartPolicy: Never