目录
前言:
上一章我们说到,pod有两种,分别为自主式 Pod,Pod 退出后不会被创建;和被控制器管理的 Pod,在控制器的生命周期里,始终要维持 Pod 的副本数目。本章我们来讲解下k8s的核心控制器,在官方文档中也叫工作负载资源。
官方文档:工作负载资源 | Kuberneteshttps://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/
一、概念
1、什么是控制器
Kubernetes 中内建了很多 controller(控制器),这些相当于一个状态机,用来控制 Pod 的具体状态和行为。
2、控制器执行流程
通过yaml文件把用户期望的状态存入etcd,控制器会通过ApiServer访问etcd,时刻去listwatch,检索当前的状态,并获取应用的状态,不断比对当前状态和你期望的状态是否是一致的,如果不一致由代码自驱动完成修复。
3、控制器类型
Replication Controller和ReplicaSet(RC已经被RS取代,RS一般不会单独用,一般都是和deployment一起使用)
Deployment
DaemonSet
StatefulSet
Job
CronJob
HPA全称Horizontal Pod Autoscaler
二、控制器的使用
1、ReplicaSet
rs主要控制的是pod的副本数
案例:证明k8s的控制器在自动的维护pod的副本数
[root@k8s2 pod]# vim rs-example.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-example
spec:
replicas: 3
selector:
matchLabels: #通过选择标签
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
2、Deployment
deployment底层还是调用rs控制器,可以用来更新,rs就相当于是其中的一个版本
比较适合部署无状态的,如web服务器
创建一个deployment控制器,我们可以发现他的yaml和RS控制器只有kind不同
[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-example
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
[root@k8s2 pod]# kubectl apply -f deployment-example.yaml
1、版本迭代
[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-example
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v2
replicaset就是deployment的一个版本,rs创建pod,deployment创建rs,v2版本就是把v1的资源回收,rebuild到v2
2、回滚
[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-example
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
默认一次更新25%,可以根据自己业务的需求做对应的更改
版本已经退回到v1随便访问一个pod
3、修改滚动更新策略
4、暂停与恢复
生产环境使用比较多
暂停,避免触发不必要的线上更新
调整副本数,不受影响
3、daemonset
特点:一个节点只部署一个,只有一个副本,比较适合部署有守护进程的,分布式的文件系统
比较典型的就是kube-flannel中,有几个集群节点就会部署几个,每个节点部署一个,是自动的
还有一个就是在kube-system中
示例:
[root@k8s2 pod]# vim daemonset-example.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-example
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
tolerations: #允许污点存在,如果不加集群的调度节点不会生成副本
- effect: NoSchedule
operator: Exists
containers:
- name: nginx
image: nginx
补充:扩容节点,kubeadm的join时间是24小时,超过了需要重新kubeadm token create ...重新生成
4、job
主要处理一些离线任务做一次性任务,可以参考官方的例子,计算π的值
[root@k8s2 pod]# vim job.yml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
completions: 6 #并行job,可以做并行任务 共完成6个,每次跑2个
parallelism: 2
template:
spec:
containers:
- name: pi
image: perl:5.34.0
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
5、cronjob
可以做周期任务,到指定时间创建job在由job创建容器
示例:没分钟执行一段输出
[root@k8s2 pod]# vim cronjob.yml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "* * * * *" #分钟 小时 日 月 周 代表每分钟
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh #运行date命令输出一段话
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure