pod控制器由控制器管理器kube-controller-manager组件提供,pod控制器主要用于对pod创建、修改、删除等操作。常见的pod控制器有Replication Controller、ReplicaSet、Deployment、DaemonSet、StatefulSet、Job、CronJob。

ReplicaSet控制器

ReplicaSet控制器主要用于保证pod的副本数在任何时候都能精确满足我们的期望值
(1)ReplicaSet控制器主要功能
1)保证pod的副本数满足期望值
2)保证pod健康运行
3)弹性伸缩
(2)资源清单
ReplicaSet控制器资源定义与pod相似,其spec字段嵌套的子字段及作用如下
replicas:期望的pod副本数目
selector:当前控制器匹配pod对象的标签选择器,支持matchLabels和matchExpressions两种匹配机制
template:用于创建pod时使用的pod资源模版
minReadySeconds:新建的pod在启动多长时间后,容器未发生崩溃等异常情况,则视为就绪,默认为0

apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: test-replicaset
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: twf/nginx:v1
ports:
- name: http
containerPort: 80

(3)维护期望的pod副本数目
修改一个pod的label后,ReplicaSet发现pod副本数目减上了,会重新再创建一个

#修改期望数
kubectl scale rs test-replicaset --replicas=3
kubectl label pods test-replicaset-t6lr6 app=twf --overwrite
kubectl get pods

(4)删除replicaset控制器资源
使用“kubectl delete”命令删除replicaset对象时默认会一并删除其管控的pod对象,有时,这些pod资源可能不是replicaset控制器创建的,此时可以使用“–cascade=false”选项,取消级联,删除相关的pod对象。

#删除名称为test-replicaset的replicaset控制器,并取消与pod的级联
kubectl delete replicaset test-replicaset --cascade=false
#kubectl get pods -l app=test-rep

Deployment控制器

Deployment是在RS控制器之上的,可为Pod和ReplicaSet资源提供声明式更新的一种控制器;Deployment控制器的主要作用还是为了Pod资源的健康运行,但大部分功能可以通过调节ReplicaSet控制器来实现,同时还添加了事件和状态查看、回滚、版本记录、暂停和启动、多种自动更新方案等特性。
(1)创建Deployment控制器

apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: twf/nginx:v2
ports:
- name: http
containerPort: 80

(2)Deployment控制器更新策略
相对于RS控制器,Deployment控制器更新只需要用于指定在pod模版中需要修改的内容,剩下的步骤由其自动完成
Deployment控制器也支持两种更新策略,重新创建和滚动更新,默认更新策略是滚动更新
1)重新创建(recreate):重新创建是先删除现有的pod对象,然后由控制器基于新模版重新创建出新版本的资源对象
2)滚动更新(rolling update):在删除一部分旧版本pod的同时。补充新建一部分新版本的pod对象。
(3)更新

#更新镜像
kubectl set image deployment test-deployment nginx=twf/nginx:v1 --record
#暂停更新
kubectl rollout pause deployments test-deployment
#查看更新过程中的状态信息
kubectl rollout status deployments test-deployment
#继续之前的更新
kubectl rollout resume deployments test-deployment

(4)回滚
在更新过程中,如果更新失败时,可能需要回滚到之前的版本或者指定的版本

#回滚到上个版本
kubectl rollout undo deployments test-deployment
#查看历史版本
kubectl rollout history deployments test-deployment
#回退指定版本
kubectl rollout undo deployments test-deployment --to-revision=1

DaemonSet控制器

DaemonSet确保全部(或者一些)Node上运行一个pod副本,当有Node加入集群时,也会为他们新增一个pod,当Node从集群中剔除时,也会回收这些pod。

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: test-daemonset
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: twf/nginx:v1

Job控制器

job负责处理任务,即仅执行一次的任务,它保证处理任务的一个或多个pod成功结束
job的RestartPolicy仅支持Never和OnFailure两种

apiVersion: batch/v1
kind: Job
metadata:
name: test-job
spec:
template:
metadata:
name: job-demo
spec:
restartPolicy: Never
containers:
- name: busybox
image: busybox
command:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1; do echo $1; done"

CronJob控制器

CronJob其实就是在Job的基础上加了时间调度,也就是周期性的在给定时间执行。

apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: test-cronjob
spec:
schedule: "*/1 * * * *"
successfulJobsHistoryLimit: 2
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: busybox
image: busybox
command:
- "bin/sh"
- "-c"
- "for i in 9 8 7 ; do echo $i; done"

spec.successfulJobsHistoryLimit和spec.failedJobHistoryLimit表示历史限制,可选字段,它们指定了可以保留多少完成和失败的Job,默认没有限制,建议设置