Kubernetes之Pod控制器
- Pod控制器介绍
- ReplicaSet
- 弹性扩容
- 弹性缩容
- 使用scale命令进行扩容或者缩容
- 更新镜像
- 删除ReplicaSet
- Deployment
- 弹性扩容与缩容
- 删除Deployment
- 更新镜像
- 重建更新
- 滚动更新
- 版本回退
Pod控制器介绍
Pod是Kubernetes集群中能够被创建和管理的最小部署单元。所以需要有工具去操作和管理它们的生命周期,这里就需要用到控制器了。
Pod 控制器由Master的kube-controller-manager组件提供,常见的控制器有 Replication Controller、ReplicaSet、Deployment、DaemonSet、StatefulSet、Job 和 CronJob 等,它们分别以不同的方式管理 Pod 资源对象。
ReplicationController:比较原始的Pod控制器,已经被废弃,由ReplicaSet替代;
ReplicaSet:保证指定数量的Pod运行,并支持Pod数量变更,镜像版本变更;
Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、版本回退; Horizontal Pod
Autoscaler:可以根据集群负载自动调整Pod的数量,实现削峰填谷;
DaemonSet:在集群中的指定Node上都运行一个副本,一般用于守护进程类的任务;
Job:它创建出来的Pod只要完成任务就立即退出,用于执行一次性任务; CronJob:它创建的Pod会周期性的执行,用于执行周期性的任务;
StatefulSet:管理有状态的应用;
ReplicaSet
ReplicaSet的主要作用是保证一定数量的Pod能够正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建。同时它还支持对Pod数量的扩缩容和版本镜像的升级。
apiVersion: apps/v1 # 版本号
kind: ReplicaSet # 类型
metadata:
name: pc-replicaset # rs名称
namespace: bubble-dev # 命名空间
spec:
replicas: 3 # 副本数量
selector: # 选择器,通过它指定该控制器可以管理哪些Pod
matchLabels: # 标签匹配规则
app: nginx-pod
template: # 启动pod的模板
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.9
kubectl delete ns bubble-dev
kubectl create ns bubble-dev
vi pc-replicaset.yaml
cat pc-replicaset.yaml
kubectl create -f pc-replicaset.yaml
kubectl describe pods -n bubble-dev
kubectl get pods -n bubble-dev
查看ReplicaSet
kubectl get rs pc-replicaset -n bubble-dev -o wide
弹性扩容
kubectl edit rs pc-replicaset -n bubble-dev
kubectl get pods -n bubble-dev
kubectl get rs pc-replicaset -n bubble-dev -o wide
弹性缩容
操作同上(弹性扩容)
kubectl edit rs pc-replicaset -n bubble-dev
kubectl get pods -n bubble-dev
kubectl get rs pc-replicaset -n bubble-dev -o wide
使用scale命令进行扩容或者缩容
kubectl scale rs pc-replicaset --replicas=4 -n bubble-dev
kubectl get pods -n bubble-dev
kubectl get rs pc-replicaset -n bubble-dev -o wide
更新镜像
kubectl edit rs pc-replicaset -n bubble-dev
kubectl get rs pc-replicaset -n bubble-dev -o wide
调整nginx的版本
删除ReplicaSet
kubectl delete rs pc-replicaset -n bubble-dev
k8s删除ReplicaSet前,会将ReplicaSet的replicas调整为0,等待所有的Pod被删除后,再删除ReplicaSet。
kubectl get rs pc-replicaset -n bubble-dev -o wide
Deployment
Deployment为Pod和Replica Set(下一代Replication Controller)提供声明式更新。
Deployment的主要功能如下:
支持ReplicaSet的所有功能;
支持发布的停止、继续;
支持版本滚动更新和版本回退;
apiVersion: apps/v1
kind: Deployment
metadata:
name: pc-deployment
namespace: bubble-dev
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.9
kubectl delete ns bubble-dev
kubectl create ns bubble-dev
vi pc-deployment.yaml
cat pc-deployment.yaml
kubectl create -f pc-deployment.yaml
kubectl describe pods -n bubble-dev
kubectl get pods -n bubble-dev
查看Deployment
kubectl get deploy pc-deployment -n bubble-dev -o wide
弹性扩容与缩容
Deployment也和ReplicaSet一样可以使用命令或者编辑的形式管理Pod的数量
使用编辑配置清单的方式
kubectl edit deploy pc-deployment -n bubble-dev
使用scale命令的方式
kubectl scale deploy pc-deployment --replicas=4 -n bubble-dev
删除Deployment
kubectl delete deploy pc-deployment -n bubble-dev
更新镜像
Deployment支持两种方式修改镜像:分别是重建更新和滚动更新
重建更新
先杀掉所有已存在的Pod,再创建出新的Pod。
apiVersion: apps/v1
kind: Deployment
metadata:
name: pc-deployment-recreate
namespace: bubble-dev
spec:
strategy:
type: Recreate # 重建更新
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.9
vi pc-deployment-recreate.yaml
cat pc-deployment-recreate.yaml
kubectl create -f pc-deployment-recreate.yaml
单独打开一个shell窗口监听
kubectl get pods -n bubble-dev -w
修改镜像版本
kubectl set image deploy pc-deployment-recreate nginx=nginx:1.17.8 -n bubble-dev
从单独打开的shell窗口中可以看到Deployment是先把Pod全部杀死,然后再重新创建并启动新的Pod。
滚动更新
先杀死一部分,再启动一部分,直到全部更新完成。
apiVersion: apps/v1
kind: Deployment
metadata:
name: pc-deployment-rollingupdate
namespace: bubble-dev
spec:
strategy:
type: RollingUpdate # 滚动更新
rollingUpdate: # 当type为RollingUpdate时生效,用于为RollingUpdate设置参数
maxUnavailable: 25% # 用来指定在升级过程中不可用Pod的最大数量,默认为25%
maxSurge: 25% # 用来指定在升级过程中,可以超过期望的Pod的最大数量,默认为25%
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.9
kubectl delete deploy pc-deployment-recreate -n bubble-dev
vi pc-deployment-rollingupdate.yaml
cat pc-deployment-rollingupdate.yaml
kubectl create -f pc-deployment-rollingupdate.yaml
单独打开一个shell窗口监听
kubectl get pods -n bubble-dev -w
修改镜像版本
kubectl set image deploy pc-deployment-rollingupdate nginx=nginx:1.17.8 -n bubble-dev
kubectl get deploy pc-deployment-rollingupdate -n bubble-dev -o wide
从单独打开的shell窗口中可以看到Deployment是先杀死掉部分Pod,然后再重新创建并启动部分Pod,直至全部更新完成。
版本回退
kubetl rollout 参数 deploy xx # 支持下面的选择
# status 显示当前升级的状态
# history 显示升级历史记录
# pause 暂停版本升级过程
# resume 继续已经暂停的版本升级过程
# restart 重启版本升级过程
# undo 回滚到上一级版本 (可以使用--to-revision回滚到指定的版本)
如果需要实现版本回退功能,在执行yaml文件时需要携带附加参数(–record)
kubectl delete deploy pc-deployment-rollingupdate -n bubble-dev
kubectl create -f pc-deployment-rollingupdate.yaml --record
修改镜像版本
kubectl set image deploy pc-deployment-rollingupdate nginx=nginx:1.17.8 -n bubble-dev
查看rs
kubectl get rs -n bubble-dev
查看版本更新的状态
kubectl rollout status deploy pc-deployment-rollingupdate -n bubble-dev
查看所有版本
kubectl rollout history deploy pc-deployment-rollingupdate -n bubble-dev
根据指定的版本回退
kubectl rollout undo deployment pc-deployment-rollingupdate --to-revision=1 -n bubble-dev
查看当前版本
kubectl get deploy -n bubble-dev -o wide
当前版本已经回退到1.17.9啦!