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啦!
















![[软件工程导论(第六版)]第4章 形式化说明技术(复习笔记)](https://img-blog.csdnimg.cn/286b5369cb3e437fb0720205c53cae97.png)


