什么是控制器
kubernetes 中有很多中controller,其相当于一个状态机,用来控制Pod的状态和行为。
控制器类型
ReplicationController(RC) && ReplicationSet(RS)
用来确保容器应用的副本数维持在用户的期望数目。容器异常,创建新的,删除旧的。
新版本Kubernets 官方抛弃RC使用RS ,因为RS支持集合式selector(通过标签),标签作用
Delpoyment
RS不支持滚动更新(rolling-update),而Deployment支持.但是Deployment不直接负责Pod创建。Deployment为RS 和Pod 提供声明式方法,举例演示
Deployment应用场景:
- Deployment 创建RS
- Deployment创建新版本的RS(副本)
- RS(副本)创建pod(新版本),创建完毕RS删除pod
- 至此完成滚动更新,回滚亦是如此
Horizontal Pod Autoscaling
不算一种控制器,可以成为其他控制器操作的指标,其可以说是其他控制器的附属。仅适用于Deployment 和ReplicationSet
- v1版本仅支持根据Pod的CPU利用率扩容
- v1alpha版本支持根据内存和用户自定义的metric扩缩容
statefulSet
为了解决有状态服务的问题
- 稳定的持久化存储,Pod 重新调度之后依然可以访问相同的持久化数据,基于PVC 实现
- 稳定的网络标志,调度之后PodName和HostName 不变,基于Headless Servcie 实现
- 有序部署,pod部署扩展顺序执行,下一个Pod的运行建立在之前的Pod都是Running和Ready状态。基于init containers实现
- 有序收缩
DaemonSet
保证部分或者全部Node上运行一个Pod副本。新Node加入集群,会为其新增一个Pod,删除DaemonSet会删除他创建的所有Pod.移除node会删除DaemonSet为其创建的Pod.
应用场景:
- 运行集群存储Daemon,每个Node上运行glusterd,ceph.
- 每个Node上运行日志收集Daemon,例如fluentd或者logsatsh
- 为每个Node运行监控Daemon,例如Prometheus Node Exporter.
Job
Cron Job
version >=1.8
- 定时执行一次任务
- 周期给定时间点运行
目标
RS和Pod关系
RSMakePod.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
spec:
replicas: 3 # 期望副本数
selector: # 标签选择器
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: redis
image: redis:latest
ports:
- containerPort: 80
env:
- name: GET_HOST_FROM
value: dns
此时查看pod:kubectl get pods
让我们删除这些pod(kubectl delete pod -all) 然后再查看会发现Pod被新增了(kubectl get pods ).RS 帮我们维持pod稳定在我们期望的一个状态( replicas: 3)
查看标签信息pod (get pod —show-labels)
强制修改其中的一个pod标签名字(kubectl label pod frontend-nn8v4 tier=frontend2),会发现此时pod 变成了四个。
这时候我们删除所有pod ,会发现标签为frontend的pod 数目被维持在期望值,而标签为frontend2 的pod则因为没有被管理而被删除了
此时在做一次强制修改标签的操作,然后删除此RS(kubectl delete rs frontend ),会发现只有名字frontend的RS下的pod被删除,其他未被此RS的Pod不受影响。
这能看出RS通过标签去管理自己旗下的pod,不匹配的pod不在自己的管理范围。
Deployment操作Pod
deployment.yaml。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
kubectl create -f deployment.yaml --record
# record 帮助查看revision的变化,比如查看deployment history的时候
查看Deployment/RS/pod
kubectl get pod --all --show-labels
扩容:将pod期望数目扩充至7个,可以看见这个pod 数量变化,但是RS没有变化
kubectl scale deploy nginx-deployment --replicas=7
更新镜像
kubectl set image deployment/nginx-deployment nginx:1.9.1
此时会触发新的RS的创建。
回滚:我们将版本回滚至第一个版本.
kubectl rollout undo deployment/nginx-deployment
获取上一次回滚的退出码
rollout常用命令
kubectl rollout status deployment/deployname # 查看回滚状态
kubectl rollout history deployment/deployname # 查看回滚历史
kubectl rollout undo deployment/deployname --to-revision=2 #回滚至某个版本
kubectl rollout pause deployment/deployname # 暂停更新
DaemonSet
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-test
labels:
app: daemonset
spec:
selector:
matchLabels:
name: daemonset-test
template:
metadata:
labels:
name: daemonset-test
spec:
containers:
- name: busybox
image: busybox
删除此pod ,会发现为了保持单个node1个副本的数量,会重新创建pod
Job&& CronJob
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure