Pod控制器
在k8s中,按照pod的创建方式可以将其分为两类
- 自主式pod:k8s直接创建出来的pod,这种pod删除后就没有了,也不会重建
- 控制器创建的pod:通过控制器创建的pod,这种pod删除了之后还会自动重建
1. 什么是pod控制器
pod控制器是管理pod的中间层,使用了pod控制器之后,我们只需要告诉pod控制器,想要多少个什么样的pod就可以了,它就会创建出满足条件的pod并确保每一个pod处于用户期望的状态,如果pod在运行中出现故障,控制器会基于指定策略重启动或者重建pod
2. 常见的pod控制器
在k8s中,有很多类型的pod控制器,每种都有自己的适合场景,常见的有下面这些:
- ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代
- ReplicaSet:保证指定数量的pod运行,并支持pod数量变更,镜像版本变更
- Deployment:通过控制ReplicaSet来控制pod,并支持滚动升级、版本回退
- Horizontal Pod Autoscaler:可以根据集群负载自动调整Pod数量,实现削峰填谷
- DaemonSet:在集群中的指定Node上都运行一个副本,一般用于守护进程类的任务
- Job:它创建出来的pod只要完成任务就立即退出,用于执行一次性任务
- Cronjob:它创建的pod会周期性地执行,用于执行周期性任务
- StatefulSet:管理有状态应用
3. ReplicaSet
3.1 ReplicaSet介绍
ReplicaSet的主要作用是保证一定数量的pod能够正常运行,它会持续监听这些pod的运行状态,一旦pod发生故障,就会重启或重建。同时它还支持对pod数量的扩缩容和版本镜像的升级。
假如我们现在有一个 Pod 正在提供线上的服务,我们来想想一下我们可能会遇到的一些场景:
- 某次运营活动非常成功,网站访问量突然暴增
- 运行当前 Pod 的节点发生故障了,Pod 不能正常提供服务了
第一种情况,可能比较好应对,活动之前我们可以大概计算下会有多大的访问量,提前多启动几个 Pod 副本,活动结束后再把多余的 Pod 杀掉,虽然有点麻烦,但是还是能够应对这种情况的。
第二种情况,可能某天夜里收到大量报警说服务挂了,然后起来打开电脑在另外的节点上重新启动一个新的 Pod,问题可以解决。
可是人工解决这些问题比较麻烦,如果有一种工具能够来帮助我们自动管理 Pod 就好了,Pod 挂了自动帮我在合适的节点上重新启动一个 Pod,这样是不是遇到上面的问题我们都不需要手动去解决了。
ReplicaSet就可以来帮助我们实现这个功能。
3.2 配置说明(资源文件清单)
apiVersion: apps/v1 #版本号
kind: ReplicaSet #类型
metadata: #元数据
name: #rs名称
namespace: #所属命名空间
labels: #标签
controller: rs
spec: #详情描述
replicas: #副本数量
selector: #选择器,通过它指定该控制器管理哪些pod
matchLabels: #Labels匹配规则
app: nginx-pod
matchExpressions: #Expression匹配规则
- {
key: app, operator: In, values: [nginx-pod]}
template: #模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
在这里面,需要新了解的配置项就是spec下面几个选项:
- replicas:指定副本数量,其实就是当前rs创建出来的pod的数量,默认为1
- selector:选择器,它的作用时建立pod控制器和pod之间的关联关系,采用的Label Selector机制,在pod上定义Label,在控制器上定义选择器,就可以表明当前控制器能管理哪些pod了
- template:模板,就是当前控制器创建pod所使用的模板,里面其实就是前面学过的pod的定义
3.3 创建ReplicaSet
做之前记得删除污点,并且启动node2
kubectl taint node node1 tag:NoExecute-
kubeadm token create --print-join-command,获取join命令
[root@node2 ~]# echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
[root@node2 ~]# kubeadm join 192.168.200.101:6443 --token sx1zsg.peupf7r7id5z81l4 --discovery-token-ca-cert-hash sha256:11a372a87d36a33db0e65cbb7aa87a4da69bdc324ede9325212a151432abd025
创建pc-replicaset.yaml文件
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: pc-replicaset
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
[root@master pod]# kubectl create -f pc-replicaset.yaml
replicaset.apps/pc-replicaset created
[root@master pod]# kubectl get rs pc-replicaset -n dev -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-replicaset 3 3 3 9s nginx nginx:1.17.1 app=nginx-pod
[root@master pod]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pc-replicaset-bkp4b 1/1 Running 0 15s
pc-replicaset-l6dp6 1/1 Running 0 15s
pc-replicaset-srj9g 1/1 Running 0 15s
3.4 扩缩容
3.4.1 编辑rs文件
编辑rs的副本数量,修改spec:replicas
[root@master pod]# kubectl edit rs pc-replicaset -n dev
修改spec:replicas为6
[root@master pod]# kubectl get rs pc-replicaset -n dev -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-replicaset 6 6 6 5h55m nginx nginx:1.17.1 app=nginx-pod
我们发现rs已经扩充为了6个。
查看pod,发现又新创建了3个pod
[root@master pod]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pc-replicaset-2cf7r 1/1 Running 0 70s
pc-replicaset-4mbf4 1/1 Running 0 70s
pc-replicaset-bkp4b 1/1 Running 0 5h56m
pc-replicaset-l6dp6 1/1 Running 0 5h56m
pc-replicaset-ns77g 1/1 Running 0 70s
pc-replicaset-srj9g 1/1 Running 0 5h56m
3.4.2 使用命令
命令格式:
kubectl scale rs rs名称 --replicas=rs数量 -n 命名空间
将rs的数量减少为2个
[root@master pod]# kubectl scale rs pc-replicaset --replicas=2 -n dev
replicaset.apps/pc-replicaset scaled
[root@master pod]# kubectl get rs pc-replicaset -n dev -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-replicaset 2 2 2 5h58m nginx nginx:1.17.1 app=nginx-pod
[root@master pod]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pc-replicaset-bkp4b 1/1 Running 0 5h58m
pc-replicaset-srj9g 1/1 Running 0 5h58m
3.5 镜像升级
在生产环境中,可能会遇见镜像某个版本出现问题,必须升级镜像,因此rs就给我们提供了升级rs镜像的功能
3.5.1 编辑rs文件
[root@master pod]# kubectl edit rs pc-replicaset -n dev
将nginx版本从1.17.1升级为1.17.2
spec:
containers:
- image: nginx:1.17.2
查看rs镜像,发现已经变成了1.17.2
[root@master pod]# kubectl get rs pc-replicaset -n dev -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-replicaset 2 2 2 6h3m nginx nginx:1.17.2 app=nginx-pod
3.5.2 使用命令
命令格式
kubectl set image rs rs名称 容器=镜像版本 -n 命名空间
使用命令将镜像版本修改回1.17.1
[root@master pod]# kubectl set image rs pc-replicaset nginx=nginx:1.17.1 -n dev
replicaset.apps/pc-replicaset image updated
[root@master pod]# kubectl get rs pc-replicaset -n dev -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-replicaset 2 2 2 6h4m nginx nginx:1.17.1 app=nginx-pod
3.6 删除rs
使用kubectl delete命令会删除rs以及它管理的pod
在k8s删除rs前,会将rs的replicasclear调整为0,等待所有的pod被删除之后,再执行rs对象的删除
三种删除rs的方式
-
使用kubectl delete:
kubectl delete rs rs名称 -n 命名空间
-
只删除rs保留pod(不推荐使用)
kubectl delete rs rs名称 -n 命名空间 --cascade=false
-
直接使用yaml删除(推荐)
kubectl delete -f yaml文件名
[root@master pod]# kubectl delete -f pc-replicaset.yaml replicaset.apps "pc-replicaset" deleted [root@master pod]# kubectl get rs pc-replicaset -n dev Error from server (NotFound): replicasets.apps "pc-replicaset" not found
4. Deployment
为了更好地解决服务编排的问题,k8s在V1.2版本开始,引入了deployment控制器,值得一提的是,这种控制器并不直接管理pod,而 通过管理replicaset来间接管理pod,即:deployment管理replicaset,replicaset管理pod。所以deployment比replicaset的功能更强大。
deployment的主要功能有下面几个:
- 支持replicaset的所有功能
- 支持发布的停止、继续
- 支持版本的滚动更新和版本回退
4.1 配置说明(资源文件清单)
apiVersion: apps/v1 #版本号
kind: Deployment #类型
metadata: #元数据
name: #名称
namespace: #所属命名空间
labels: #标签
controller: deploy
spec: #详情描述
replicas: #副本数量
revisionHistoryLimit: #保留历史版本,默认是10
paused: #暂停部署,默认是false
progressDeadlineSeconds: #部署超时时间(s),默认是600
strategy: #策略
type: RollingUpdates #滚动更新策略
rollingUpdate: #滚动更新
maxSurge: #最大额外可以存在的副本数,可以为百分比,也可以为整数
maxUnavaliable: #最大不可用状态的pod的最大值,可以为百分比,也可以为整数
selector: #选择器,通过它指定该控制器管理哪些pod
matchLabels: #Labels匹配规则
app: nginx-pod
matchExpressions: #Expression匹配规则
- {
key: app, operator:<