kubernetes Pod 控制器 解析

写在前面:如有问题,以你为准,

目前24年应届生,各位大佬轻喷,部分资料与图片来自网络

内容较长,页面右上角目录方便跳转

Pod控制器 概述

Pod控制器:Pod控制器是管理Pod的中间层,使用了Pod控制器之后,我们只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它就会创建出满足条件的Pod并确保每一个Pod处于用户期望的状态,如果Pod在运行中出现故障,控制器会基于指定的策略重启或重建Pod

  1. 在kubernetes中,按照Pod的创建方式可以将其分为两类:
    1. 自主式Pod:kubernetes直接创建出来的Pod,这种Pod删除后就没有了,也不会重建。
    2. 控制器创建Pod:通过Pod控制器创建的Pod,这种Pod删除之后还会自动重建。
  2. 在kubernetes中,有很多类型的Pod控制器,每种都有自己的适合的场景,常见的有下面这些:
    1. ReplicationController:比较原始的Pod控制器,已经被废弃,由ReplicaSet替代。
    2. ReplicaSet:保证指定数量的Pod运行,并支持Pod数量变更,镜像版本变更。
      1. 缩写 rs
    3. Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、版本回退。
    4. Horizontal Pod Autoscaler:可以根据集群负载自动调整Pod的数量,实现削峰填谷。
    5. DaemonSet:在集群中的指定Node上都运行一个副本,一般用于守护进程类的任务,新加进来node,DaemonSet会立刻在这个node上运行一个副本
    6. Job:它创建出来的Pod只要完成任务就立即退出,用于执行一次性任务
    7. CronJob:它创建的Pod会周期性的执行,用于执行周期性的任务
    8. StatefulSet:管理有状态的应用,即按顺序创建,按顺序删除。

其中最常见的是Deployment控制器,其拥有RS和RC的全部功能并且更有滚动升级、版本回退

  1. 命名规则是Pod的名称是在控制器名称后面拼接了-xxx随机码

ReplicaSet(RS)

ReplicaSet的主要作用是保证一定数量的Pod能够正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建。同时它还支持对Pod数量的扩缩容和镜像更新(后续出现的新pod副本才会使用更新后的镜像,更改后现有的pod不会进行更改

整体 yaml 解析

    1. replicas:指定副本数量,其实就是当然rs创建出来的Pod的数量,默认为1.
    2. selector:选择器,它的作用是建立Pod控制器和Pod之间的关联关系,采用了Label Selector机制(在Pod模块上定义Label,在控制器上定义选择器,就可以表明当前控制器能管理哪些Pod了)。
    3. template:模板,就是当前控制器创建Pod所使用的模板,Pod yaml 编写,所有pod配置项都可以在这使用
      1. 就是Pod的yaml编写与控制器yaml编写结合在一起了 
apiVersion: apps/v1 # 版本号

kind: ReplicaSet # 类型

metadata: # 元数据

  name: # rs名称

  namespace: # 所属命名空间

  labels: #标签

    controller: rs

spec: # 详情描述

  replicas: 3 # 副本数量

  selector: # 选择器,通过它指定该控制器管理哪些po

    matchLabels: # Labels匹配规则

      app: nginx-pod

    matchExpressions: # Expressions匹配规则

      - {key: app, operator: In, values: [nginx-pod]}

template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本,其实就是 pod 配置项

  metadata:

    labels:

      app: nginx-pod  # 用于连接上面pod控制器的标签选择器

  spec:

    containers:

      - name: nginx

        image: nginx:1.17.1

        ports:

        - containerPort: 80

创建

---

apiVersion: v1

kind: Namespace

metadata:

  name: study

---

apiVersion: apps/v1 # 版本号

kind: ReplicaSet # 类型

metadata: # 元数据

  name: pc-replicaset # rs名称

  namespace: study # 命名类型

spec: # 详细描述

  replicas: 3 # 副本数量

  selector: # 选择器,通过它指定该控制器可以管理哪些Pod

    matchLabels: # Labels匹配规则

      app: nginx-pod

  template: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本

    metadata:

      labels:

        app: nginx-pod # 用于连接上面pod控制器的标签选择器

    spec:

      containers:

        - name: nginx # 容器名称

          image: nginx:1.17.1 # 容器需要的镜像地址

          ports:

            - containerPort: 80 # 容器所监听的端口
[root@master k8s]# kubectl apply -f controller.yaml

namespace/study unchanged

replicaset.apps/pc-replicaset created

[root@master k8s]# kubectl get rs -n study -o wide

NAME            DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES         SELECTOR

pc-replicaset   3         3         3       80s   nginx        nginx:1.17.1   app=nginx-pod

# DESIRED     CURRENT     READY

# 期望副本数   当前副本数  准备好的副本数(即Pod状态为runing)

# 查看当前控制器创建出来的Pod(控制器创建出来的Pod的名称是在控制器名称后面拼接了-xxx随机码

[root@master k8s]# kubectl get pod -n study -o wide

NAME                  READY   STATUS    RESTARTS   AGE     IP              NODE    NOMINATED NODE   READINESS GATES

pc-replicaset-7rtzq   1/1     Running   0          3m35s   10.244.104.21   node2   <none>           <none>

pc-replicaset-ksmlh   1/1     Running   0          3m35s   10.244.104.20   node2   <none>           <none>

pc-replicaset-prsl7   1/1     Running   0          3m35s   10.244.104.19   node2   <none>           <none>

扩缩容

一共三种命令方式:

命令实现:scale(推荐),

直接编辑文件:apply,edit

使用 scale 命令在命令行进行重新定义

[root@master k8s]# kubectl scale rs -n study pc-replicaset --replicas=4

replicaset.apps/pc-replicaset scaled

[root@master k8s]# kubectl get pod -n study

NAME                  READY   STATUS    RESTARTS   AGE

pc-replicaset-5l8db   1/1     Running   0          27s

pc-replicaset-7rtzq   1/1     Running   0          8m49s

pc-replicaset-ksmlh   1/1     Running   0          8m49s

pc-replicaset-x2hn8   1/1     Running   0          32s

[root@master k8s]# kubectl get rs -n study

NAME            DESIRED   CURRENT   READY   AGE

pc-replicaset   4         4         4       11m

使用 edit 命令编辑 yaml spec.replicas 字段

[root@master k8s]# kubectl edit rs -n study pc-replicaset

replicaset.apps/pc-replicaset edited

[root@master k8s]# kubectl get pod -n study

NAME                  READY   STATUS    RESTARTS   AGE

pc-replicaset-7rtzq   1/1     Running   0          7m25s

pc-replicaset-ksmlh   1/1     Running   0          7m25s

[root@master k8s]# kubectl get rs -n study

NAME            DESIRED   CURRENT   READY   AGE

pc-replicaset   2         2         2       11m

使用 apply 部署已经更改 yaml文件

vim 编辑 yaml spec.replicas 字段

[root@master k8s]# kubectl get pod -n study

NAME                  READY   STATUS    RESTARTS   AGE

pc-replicaset-7rtzq   1/1     Running   0          16m

pc-replicaset-ksmlh   1/1     Running   0          16m

[root@master k8s]# vim controller.yaml

[root@master k8s]# kubectl apply -f controller.yaml

namespace/study unchanged

replicaset.apps/pc-replicaset configured

[root@master k8s]# kubectl get pod -n study

NAME                  READY   STATUS    RESTARTS   AGE

pc-replicaset-7rtzq   1/1     Running   0          19m

pc-replicaset-g4wmg   1/1     Running   0          10s

pc-replicaset-ksmlh   1/1     Running   0          19m

[root@master k8s]# kubectl get rs -n study

NAME            DESIRED   CURRENT   READY   AGE

pc-replicaset   3         3         3       19m

镜像更新

注意:后续出现的新pod副本才会使用更新后的镜像,更改后现有的pod不会进行更改

一共三种命令方式:

命令实现:set

直接编辑文件:apply,edit(推荐)

使用 set 命令在命令行进行重新定义

# # 从 1.17.1 改到 1.17.1

[root@master k8s]# kubectl set image rs pc-replicaset nginx=nginx:1.17.2 -n test

replicaset.apps/pc-replicaset image updated

[root@master k8s]# kubectl get rs -n study -o wide

NAME            DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES         SELECTOR

pc-replicaset   3         3         3       26m   nginx        nginx:1.17.2   app=nginx-pod

使用 edit 命令编辑 yaml spec.template.spec.containers.image 字段

# 从 1.17.1 改到 1.17.1

[root@master k8s]# kubectl edit rs -n study

replicaset.apps/pc-replicaset edited

[root@master k8s]# kubectl get rs -n study -o wide

NAME            DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES         SELECTOR

pc-replicaset   3         3         3       26m   nginx        nginx:1.17.2   app=nginx-pod

使用 apply 部署已经更改 yaml文件

vim 编辑 yaml  yaml spec.template.spec.containers.image 字段

# 从 1.17.1 改到 1.17.1

[root@master k8s]# kubectl apply -f controller.yaml

namespace/study unchanged

replicaset.apps/pc-replicaset configured

[root@master k8s]# kubectl get rs -n study -o wide

NAME            DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES         SELECTOR

pc-replicaset   3         3         3       26m   nginx        nginx:1.17.2   app=nginx-pod

删除

在kubernetes删除ReplicaSet前,会将ReplicaSet的replicas调整为0,等到所有的Pod被删除后,再执行ReplicaSet对象的删除

两种方式:delete rs 和 delete -f yaml(推荐)

kubectl delete rs pc-replicaset -n study

#如果希望仅仅删除ReplicaSet控制器(保留现有Pod)、

#只需要在使用kubectl delete rs命令的时候添加--cascade=false选项(不推荐)

kubectl delete rs pc-replicaset -n study--cascade=false

kubectl delete -f controller.yaml

Deployment(Deploy)

kubernetes在v1.2版本开始,引入了Deployment控制器

Deployment控制器并不直接管理Pod,而是通过管理ReplicaSet来间接管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment的功能比ReplicaSet强大

在kubernetes中,Pod是最小的控制单元

Deployment 是Pod的控制器中的一种

但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。

Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod

下图中seletor作用pod的labels

  1. Deployment的主要功能如下:
    1. 支持ReplicaSet的所有功能。
    2. 支持发布的停止、继续。(金丝雀发布)
    3. 支持版本滚动更新和版本回退。
  2. 这些新的功能原理就是对rs的操作
    1. 滚动更新和版本回退就是创建新的 RS 和回到之前的 RS,
      1. 滚动更新其实就新旧RS的扩缩,新的逐渐替代旧的
      2. 版本回退其实就是之前保留旧的RS,重新启动,旧的逐渐替代新的
    2. 金丝雀发布就是停止新旧RS的扩缩,观察业务,再重新开启
  3. 命名规则
    1. deployment 创建后会创建对应的rs,命名为 deploymentName-RS随机字符
    2. 该 rs 创建的对应 pod 的命名为 deploymentName-RS随机字符-Pod随机字符
    3. 示例:
      1. deployment 命名为:pc-deployment
      2. 其 RS 命名为:pc-deployment-6bb9d9f778
      3. 其 Pod 命名为:pc-deployment-6bb9d9f778-ktrrv

命令行实操

[root@master k8s]# kubectl create deployment nginx -n default  --image=nginx:1.8 --replicas=2

deployment.apps/nginx created

[root@master k8s]# kubectl get deployment -n default

NAME    READY   UP-TO-DATE   AVAILABLE   AGE

nginx   2/2     2            2           69m

# kubectl describe deployments.apps -n default 查看详细信息

[root@master k8s]# kubectl scale deployment nginx --replicas=4 -n default

deployment.apps/nginx scaled

[root@master k8s]# kubectl get deployment -n default

NAME    READY   UP-TO-DATE   AVAILABLE   AGE

nginx   4/4     4            4           70m

[root@master k8s]# kubectl delete deployment -n default nginx

deployment.apps "nginx" deleted

[root@master k8s]# kubectl get pod -n default

No resources found in default namespace.

整体 yaml 解析

revisionHistoryLimit: 保留镜像版本,用于版本回退

paused: 部署成功后是否不立即创建pod,false就是立即创建

strategy: 设置镜像更新的策略,两种

    RollingUpdate: 滚动更新 使用rolling用新的复制集替换旧的复制集

更新,

                            即逐步缩小旧的复制集,并扩大新的复制集

    Recreate: 重建更新 在创建新的pod之前先杀死所有现有的pod

Deployment的资源清单:

apiVersion: apps/v1 # 版本号

kind: Deployment # 类型

metadata: # 元数据

  name: # rs名称

  namespace: # 所属命名空间

  labels: #标签

    controller: deploy

spec: # 详情描述

  replicas: 3 # 副本数量

  revisionHistoryLimit: 3 # 保留历史版本,默认为10

  paused: false # 暂停部署,默认是false

  progressDeadlineSeconds: 600 # 部署超时时间(s),默认是600

  strategy: # 策略

    type: RollingUpdate # 滚动更新策略

    rollingUpdate: # 滚动更新

      maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比

      # 也可以为整数 maxUnavailable: 30% # 最大不可用状态的  

      # Pod 的最大值,可以为百分比,也可以为整数

      maxUnavailable: 30% # 最大不可用状态的Pod的最大值,可以为百分比,也可以为整数

  selector: # 选择器,通过它指定该控制器管理哪些pod

    matchLabels: # Labels 匹配规则

      app: nginx-pod

    matchExpressions: # Expressions 匹配规则

      - {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

创建

---

apiVersion: v1

kind: Namespace

metadata:

  name: study

---

apiVersion: apps/v1 # 版本号

kind: Deployment # 类型

metadata: # 元数据

  name: pc-deployment # deployment的名称

  namespace: study # 命名类型

spec: # 详细描述

  replicas: 3 # 副本数量

  selector: # 选择器,通过它指定该控制器可以管理哪些Pod

    matchLabels: # Labels匹配规则

      app: nginx-pod

  template: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本

    metadata:

      labels:

        app: nginx-pod

    spec:

      containers:

        - name: nginx # 容器名称

          image: nginx:1.17.1 # 容器需要的镜像地址

          ports:

            - containerPort: 80 # 容器所监听的端口

[root@master k8s]# kubectl apply -f controller.yaml

namespace/study created

deployment.apps/pc-deployment created

扩缩容

一共三种命令方式:

命令实现:scale(推荐),

直接编辑文件:apply,edit

使用 scale 命令在命令行进行重新定义

[root@master k8s]# kubectl scale deploy pc-deployment --replicas=5 -n study

deployment.apps/pc-deployment scaled

[root@master k8s]# kubectl get deployments.apps -n study

NAME            READY   UP-TO-DATE   AVAILABLE   AGE

pc-deployment   5/5     5            5           32m

使用 edit 命令编辑 yaml spec.replicas 字段

[root@master k8s]# kubectl edit deployment pc-deployment -n study

deployment.apps/pc-deployment edited

[root@master k8s]# kubectl get deployments.apps -n study

NAME            READY   UP-TO-DATE   AVAILABLE   AGE

pc-deployment   3/3     3            3           33m

使用 apply 部署已经更改 yaml文件

vim 编辑 yaml spec.replicas 字段

[root@master k8s]# vim controller.yaml

[root@master k8s]# kubectl apply -f controller.yaml

namespace/study unchanged

deployment.apps/pc-deployment configured

[root@master k8s]# kubectl get deployments.apps -n study

NAME            READY   UP-TO-DATE   AVAILABLE   AGE

pc-deployment   1/1     1            1           35m

镜像更新

首先deploy创建时候会创建相应的rs,如果进行版本更新,那么会根据新的镜像来创建新的RS,逐渐将新的rs副本数拉大,将旧的rs副本数了拉小,最终旧的为0,新的为最大值,此时为更新完成,旧的不会删除,用于实现版本回退

# 版本升级相关功能

kubetl rollout 参数 deploy <deploy-name>  # 支持下面的选择

    # status 显示当前升级的状态

    # history 显示升级历史记录

    # undo 回滚到上一级版本 (可以使用--to-revision回滚到指定的版本)

    # pause 暂停版本升级过程

    # resume 继续已经暂停的版本升级过程

    # restart 重启版本升级过程

# history 中显示 CHANGE-CAUSE 是创建使用的命令,

# 需要再创建命令哪里输入 --record

Deployment支持两种镜像更新的策略:

重建更新和滚动更新(默认),可以通过strategy选项进行配置

strategy: 指定新的Pod替代旧的Pod的策略,支持两个属性

  type: 指定策略类型,支持两种策略

    Recreate:在创建出新的Pod之前会先杀掉所有已经存在的Pod

    RollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本的Pod

  rollingUpdate:当type为RollingUpdate的时候生效,用于为rollingUpdate设置参数,支持两个属性:

    # 最大杀死多少老的,最大开启多少新的

    maxUnavailable:用来指定在升级过程中不可用的Pod的最大数量,默认为25%。 如果有8个pod,先干掉2个

    maxSurge: 用来指定在升级过程中可以超过期望的Pod的最大数量,默认为25%。如果有8个pod,先启动2个

重建更新

apiVersion: apps/v1 # 版本号

kind: Deployment # 类型

metadata: # 元数据

  name: pc-deployment # deployment的名称

  namespace: study # 命名类型

spec: # 详细描述

  replicas: 3 # 副本数量

  strategy: # 镜像更新策略

    type: Recreate # Recreate:在创建出新的Pod之前会先杀掉所有已经存在的Pod

  selector: # 选择器,通过它指定该控制器可以管理哪些Pod

    matchLabels: # Labels匹配规则

      app: nginx-pod

  template: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本

    metadata:

      labels:

        app: nginx-pod

    spec:

      containers:

        - name: nginx # 容器名称

          image: nginx:1.17.1 # 容器需要的镜像地址

          ports:

            - containerPort: 80 # 容器所监听的端口
# 持续查看更新过程

kubectl get pod -n study -w

[root@master k8s]# kubectl apply -f controller.yaml

deployment.apps/pc-deployment created

[root@master k8s]# kubectl get deployments.apps -n study

NAME            READY   UP-TO-DATE   AVAILABLE   AGE

pc-deployment   3/3     3            3           6s

[root@master k8s]# kubectl set image deployment pc-deployment nginx=nginx:1.17.2 -n study

deployment.apps/pc-deployment image updated

[root@master k8s]# kubectl rollout status deploy pc-deployment -n study

Waiting for deployment "pc-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
[root@master k8s]# kubectl get pod -n study

NAME                             READY   STATUS              RESTARTS   AGE

pc-deployment-6697bc6f84-5nq4d   0/1     ContainerCreating   0          1s

pc-deployment-6697bc6f84-s7zqn   0/1     Pending             0          1s

pc-deployment-6697bc6f84-t9z5w   0/1     Pending             0          1s

[root@master k8s]# kubectl get pod -n study

NAME                             READY   STATUS              RESTARTS   AGE

pc-deployment-6697bc6f84-5nq4d   0/1     ContainerCreating   0          2s

pc-deployment-6697bc6f84-s7zqn   0/1     ContainerCreating   0          2s

pc-deployment-6697bc6f84-t9z5w   0/1     ContainerCreating   0          2s

滚动更新

apiVersion: apps/v1 # 版本号

kind: Deployment # 类型

metadata: # 元数据

  name: pc-deployment # deployment的名称

  namespace: study # 命名类型

spec: # 详细描述

  replicas: 3 # 副本数量

  strategy: # 镜像更新策略

    type: RollingUpdate # RollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本的Pod

    rollingUpdate:

      maxUnavailable: 25%

      maxSurge: 25%

  selector: # 选择器,通过它指定该控制器可以管理哪些Pod

    matchLabels: # Labels匹配规则

      app: nginx-pod

  template: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本

    metadata:

      labels:

        app: nginx-pod

    spec:

      containers:

        - name: nginx # 容器名称

          image: nginx:1.17.1 # 容器需要的镜像地址

          ports:

            - containerPort: 80 # 容器所监听的端口
# 持续查看更新过程

kubectl get pod -n study -w

[root@master k8s]# kubectl apply -f controller.yaml

deployment.apps/pc-deployment created



[root@master k8s]# kubectl get pod -n study

NAME                             READY   STATUS    RESTARTS   AGE

pc-deployment-6bb9d9f778-94wzr   1/1     Running   0          7s

pc-deployment-6bb9d9f778-rdxc7   1/1     Running   0          7s

pc-deployment-6bb9d9f778-v4gb6   1/1     Running   0          7s

[root@master k8s]# kubectl set image deployment pc-deployment nginx=nginx:1.17.3 -n study

deployment.apps/pc-deployment image updated

#观察更新状态

[root@master k8s]# kubectl rollout status deploy pc-deployment -n study

Waiting for deployment "pc-deployment" rollout to finish: 1 out of 3 new replicas have been updated...

[root@master k8s]# kubectl get pod -n study

NAME                             READY   STATUS              RESTARTS   AGE

pc-deployment-6697bc6f84-sxjnp   0/1     ContainerCreating   0          2s

pc-deployment-6bb9d9f778-94wzr   1/1     Running             0          2m47s

pc-deployment-6bb9d9f778-rdxc7   1/1     Running             0          2m47s

pc-deployment-6bb9d9f778-v4gb6   1/1     Running             0          2m47s

[root@master k8s]# kubectl get pod -n study

NAME                             READY   STATUS              RESTARTS   AGE

pc-deployment-6697bc6f84-sxjnp   1/1     Running             0          4s

pc-deployment-6697bc6f84-z7dqc   0/1     ContainerCreating   0          1s

pc-deployment-6bb9d9f778-94wzr   1/1     Running             0          2m49s

pc-deployment-6bb9d9f778-v4gb6   1/1     Running             0          2m49s

[root@master k8s]# kubectl get pod -n study

NAME                             READY   STATUS    RESTARTS   AGE

pc-deployment-6697bc6f84-5skdv   1/1     Running   0          3s

pc-deployment-6697bc6f84-sxjnp   1/1     Running   0          8s

pc-deployment-6697bc6f84-z7dqc   1/1     Running   0          5s

查看rs,发现原来的rs依旧存在,只是Pod的数量变为0,而后又产生了一个rs,Pod的数量变为3

其实这就是deployment能够进行版本回退的奥妙所在

版本回退

Deployment支持版本升级过程中的暂停、继续功能以及版本回退等诸多功

deployment之所以能够实现版本的回退,就是通过记录下历史的ReplicaSet来实现的,一旦想回滚到那个版本,只需要将当前版本的Pod数量降为0,然后将回退版本的Pod提升为目标数量即可(镜像更新rs的变化就相反)

# 查看之前或回退前最新版本

[root@master k8s]# kubectl get rs -n study

NAME                       DESIRED   CURRENT   READY   AGE

pc-deployment-6697bc6f84   0         0         0       8m18s

pc-deployment-6bb9d9f778   3         3         3       11m

[root@master k8s]# kubectl describe rs -n study pc-deployment-6697bc6f84

  Containers:

   nginx:

    Image:        nginx:1.17.3
# 版本升级相关功能

kubetl rollout 参数 deploy <deploy-name>  # 支持下面的选择

    # status 显示当前升级的状态

    # history 显示升级历史记录

    # undo 回滚到上一级版本 (可以使用--to-revision回滚到指定的版本)

    # pause 暂停版本升级过程

    # resume 继续已经暂停的版本升级过程

    # restart 重启版本升级过程

# history 中显示 CHANGE-CAUSE 是创建使用的命令,

# 需要再创建命令哪里输入 --record

[root@master k8s]# kubectl rollout status deployment pc-deployment -n study

deployment "pc-deployment" successfully rolled out

[root@master k8s]# kubectl rollout history deployment pc-deployment -n study

deployment.apps/pc-deployment

REVISION  CHANGE-CAUSE

1         <none>

2         <none>
# 版本回退

[root@master k8s]# kubectl get deploy -n study -o wide

NAME            READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES         SELECTOR

pc-deployment   3/3     3            3           8m23s   nginx        nginx:1.17.3   app=nginx-pod

[root@master k8s]# kubectl rollout undo deployment -n study pc-deployment --to-revision=1

deployment.apps/pc-deployment rolled back

[root@master k8s]# kubectl get deploy -n study -o wide

NAME            READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES         SELECTOR

pc-deployment   3/3     2            3           9m5s   nginx        nginx:1.17.1   app=nginx-pod

# 1 版本就没了,因为3版本就是1版本

[root@master k8s]# kubectl rollout history deployment pc-deployment -n study

deployment.apps/pc-deployment

REVISION  CHANGE-CAUSE

3         <none>

2         <none>

金丝雀发布

Deployment控制器支持控制更新过程中的控制,如“暂停(pause)”或“继续(resume)”更新操作

比如有一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。然后,再筛选一小部分的用户请求路由到新版本的Pod应用,继续观察能否稳定地按期望的方式运行。确定没问题之后再继续完成余下的Pod资源滚动更新,否则立即回滚更新操作。这就是所谓的金丝雀发布

其实就停止新旧rs的副本数的更新

# 更新deployment的版本,并配置暂停deployment

[root@master k8s]# kubectl set image deploy pc-deployment nginx=nginx:1.17.5 -n study && kubectl rollout pause deployment pc-deployment -n study

deployment.apps/pc-deployment paused

# 观察更新状态

[root@master k8s]# kubectl rollout status deploy pc-deployment -n study

Waiting for deployment "pc-deployment" rollout to finish: 1 out of 3 new replicas have been updated...

# # 监控更新的过程,可以看到已经新增了一个资源,但是并未按照预期的状态去删除一个旧的资源,就是因为使用了pause暂停命令

# 查看 rs,下面的显示的都可以回退

[root@master k8s]# kubectl get rs  -o wide -n study

NAME                       DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES         SELECTOR

pc-deployment-55878c67d9   3         3         3       5m58s   nginx        nginx:1.17.4   app=nginx-pod,pod-template-hash=55878c67d9

pc-deployment-649d477dd6   1         1         1       55s     nginx        nginx:1.17.5   app=nginx-pod,pod-template-hash=649d477dd6

pc-deployment-6697bc6f84   0         0         0       26m     nginx        nginx:1.17.3   app=nginx-pod,pod-template-hash=6697bc6f84

pc-deployment-6bb9d9f778   0         0         0       28m     nginx        nginx:1.17.1   app=nginx-pod,pod-template-hash=6bb9d9f778

# 注意rs部分的随机码,被粘贴了所以有4个

[root@master k8s]# kubectl get pod -n study

NAME                             READY   STATUS    RESTARTS   AGE

pc-deployment-55878c67d9-qb9js   1/1     Running   0          8m42s

pc-deployment-55878c67d9-sltxw   1/1     Running   0          8m19s

pc-deployment-55878c67d9-xh8sb   1/1     Running   0          8m15s

pc-deployment-649d477dd6-q72pg   1/1     Running   0          3m39s

# 此时观察业务是否有问题,新的pod能否正常接受流量(重点)

# 重新启动更新

[root@master k8s]# kubectl get pod -n study

NAME                             READY   STATUS              RESTARTS   AGE

pc-deployment-55878c67d9-sltxw   1/1     Running             0          9m23s

pc-deployment-55878c67d9-xh8sb   1/1     Running             0          9m19s

pc-deployment-649d477dd6-pphwk   0/1     ContainerCreating   0          2s

pc-deployment-649d477dd6-q72pg   1/1     Running             0          4m43s

[root@master k8s]# kubectl get rs  -o wide -n study

NAME                       DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES         SELECTOR

pc-deployment-55878c67d9   0         0         0       9m51s   nginx        nginx:1.17.4   app=nginx-pod,pod-template-hash=55878c67d9

pc-deployment-649d477dd6   3         3         3       4m48s   nginx        nginx:1.17.5   app=nginx-pod,pod-template-hash=649d477dd6

pc-deployment-6697bc6f84   0         0         0       29m     nginx        nginx:1.17.3   app=nginx-pod,pod-template-hash=6697bc6f84

pc-deployment-6bb9d9f778   0         0         0       32m     nginx        nginx:1.17.1   app=nginx-pod,pod-template-hash=6bb9d9f778

[root@master k8s]# kubectl get pod -n study

NAME                             READY   STATUS    RESTARTS   AGE

pc-deployment-649d477dd6-pphwk   1/1     Running   0          17s

pc-deployment-649d477dd6-q72pg   1/1     Running   0          4m58s

pc-deployment-649d477dd6-xf2fw   1/1     Running   0          15s

删除

kubectl delete -f pc-deployment.yaml

kubectl delete deploy -n study pc-deployment

HPA (Horizontal Pod Autoscaler)

我们已经可以通过手动执行

kubectl scale命令实现Pod的扩缩容,但是这显然不符合kubernetes的定位目标–自动化和智能化。kubernetes期望可以通过监测Pod的使用情况,实现Pod数量的自动调整,于是就产生了HPA这种控制器。

HPA可以获取每个Pod的利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现Pod的数量的调整。其实HPA和之前的Deployment一样,也属于一种kubernetes资源对象,它通过追踪分析目标Pod的负载变化情况,来确定是否需要针对性的调整目标Pod的副本数

如下面图可以看到HPA其实是控制deploy

metrics-server 安装

metrics-server可以用来收集集群中的资源使用情况,搭配HPA Pod控制器使用

安装教程kubernetes 部署 metrics-server(HPA)-CSDN博客

创建 Deploy 和 Service

create Deploy

---

apiVersion: v1

kind: Namespace

metadata:

  name: study



---

apiVersion: apps/v1

kind: Deployment

metadata:

  name: nginx-deployment

  namespace: stuy

spec: # 详细描述

  selector: # 选择器,通过它指定该控制器可以管理哪些Pod

    matchLabels: # Labels匹配规则

      app: nginx-pod

  template: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本

    metadata:

      labels:

        app: nginx-pod

    spec:

      containers:

        - name: nginx # 容器名称

          image: nginx:1.17.1 # 容器需要的镜像地址

          ports:

            - containerPort: 80 # 容器所监听的端口

          resources: # 资源限制

            requests:

              cpu: "100m" # 100m表示100millicpu,即0.1个CPU

[

root@master k8s]# kubectl apply -f controller.yaml

namespace/study configured

deployment.apps/nginx-deployment configured

[root@master k8s]# kubectl get deployments.apps -n study

NAME               READY   UP-TO-DATE   AVAILABLE   AGE

nginx-deployment   1/1     1            1           66s



[root@master k8s]# kubectl get pod -n study

NAME                                READY   STATUS        RESTARTS   AGE

nginx-deployment-55c9d4fbb5-mklv5   1/1     Running       0          6s

create Service

kubectl expose deployment -n study nginx-deployment  --name=nginx --type=NodePort --port=80 --target-port=80


[root@master k8s]# kubectl expose deployment -n study nginx-deployment  --name=nginx --type=NodePort --port=80 --target-port=80

service/nginx exposed

[root@master k8s]# kubectl get svc -n study

NAME    TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE

nginx   NodePort   10.104.236.152   <none>        80:32260/TCP   43s

部署HPA

命令行操作

kubectl autoscale deployment -n study nginx-deployment --cpu-percent=50 --min=1 --max=10

# pod 副本数量区间为 1-10

# cpu 平均利用率为 50 则扩容

yaml 编写

maxReplicas -required-: 自动缩放器可以扩的最大规模。它不能少于minReplicas

minReplicas:自动缩放器可以扩的最小规模,默认为 1

metrics: 默认指标

将设置为80% 平均CPU利用率

    type  -required-: 以那个目标为缩放条件 "ContainerResource",

"External", "Object", "Pods" or "Resource"

    resource: # 目标为cpu或内存利用率

      name: <cpu 或 memory> -required-

      target -required-:

        type -required-: Utilization, Value, or

 AverageValue

        averageUtilization: 对目标值设置平均利用值,到达就进行扩缩

scaleTargetRef -required-: 指向要缩放的目标资源,并用于

应该收集指标的pod,以及实际更改的pod

副本计数 (用来指定对应的deployment)
apiVersion: autoscaling/v2 # 版本号

kind: HorizontalPodAutoscaler # 类型

metadata: # 元数据

  name: pc-hpa # deployment的名称

  namespace: study # 命名类型

spec:

  minReplicas: 1 # 最小Pod数量

  maxReplicas: 10 # 最大Pod数量

  metrics:

  - type: Resource

    resource:

      name: cpu

      target:

        averageUtilization: 50

        type: Utilization

  scaleTargetRef: # 连接 deployment 目标

    apiVersion: apps/v1

    kind: Deployment

    name: nginx-deployment
[root@master k8s]# kubectl get hpa -n study

NAME     REFERENCE                     TARGETS         MINPODS   MAXPODS   REPLICAS   AGE

pc-hpa   Deployment/nginx-deployment   <unknown>/50%   1         10        0          14s

# 过小段时间

[root@master k8s]# kubectl get hpa -n study

NAME     REFERENCE                     TARGETS   MINPODS   MAXPODS   REPLICAS   AGE

pc-hpa   Deployment/nginx-deployment   0%/50%    1         10        1          67s

[root@master ~]# kubectl top node

NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%  

master   309m         15%    2372Mi          62%      

node1    102m         5%     1283Mi          33%      

node2    114m         5%     1430Mi          37%      

[root@master ~]# kubectl top pod -n study

NAME                                CPU(cores)   MEMORY(bytes)  

nginx-deployment-55c9d4fbb5-mklv5   0m           2Mi   

测试

使用另一台 linux 安装 ab

yum -y install httpd-tools

# 访问网页

[root@master k8s]# kubectl get svc -n study

NAME    TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE

nginx   NodePort   10.104.236.152   <none>        80:32260/TCP   42m

[root@master k8s]# curl 192.168.100.51:32260

压力测试

ab -c 1000 -n 10000 http://192.168.100.51:32260/index.html

或

sudo yum -y install siege

siege -c 200 -i http://192.168.100.51:32260/index.html

[root@master ~]# kubectl get pod -n study

NAME                                READY   STATUS    RESTARTS   AGE

nginx-deployment-55c9d4fbb5-mklv5   1/1     Running   0          55m

[root@master ~]# kubectl get pod -n study -w

NAME                                READY   STATUS    RESTARTS   AGE

nginx-deployment-55c9d4fbb5-mklv5   1/1     Running   0          55m

nginx-deployment-55c9d4fbb5-5k82v   0/1     Pending   0          0s

nginx-deployment-55c9d4fbb5-5k82v   0/1     Pending   0          0s

nginx-deployment-55c9d4fbb5-5k82v   0/1     ContainerCreating   0          0s

nginx-deployment-55c9d4fbb5-5k82v   0/1     ContainerCreating   0          2s

nginx-deployment-55c9d4fbb5-5k82v   1/1     Running             0          2s

[root@master k8s]# kubectl get pod -n study

NAME                                READY   STATUS    RESTARTS   AGE

nginx-deployment-55c9d4fbb5-5k82v   1/1     Running   0          50s

nginx-deployment-55c9d4fbb5-mklv5   1/1     Running   0          59m

[root@master ~]# kubectl get hpa -n study -w

NAME     REFERENCE                     TARGETS   MINPODS   MAXPODS   REPLICAS   AGE

pc-hpa   Deployment/nginx-deployment   0%/50%    1         10        1          18m

pc-hpa   Deployment/nginx-deployment   1%/50%    1         10        1          20m

pc-hpa   Deployment/nginx-deployment   2%/50%    1         10        1          20m

pc-hpa   Deployment/nginx-deployment   92%/50%   1         10        1          21m

pc-hpa   Deployment/nginx-deployment   1%/50%    1         10        2          21m

pc-hpa   Deployment/nginx-deployment   0%/50%    1         10        2          21m

# REPLICAS 该参数为现在副本数量

停止测压就开始缩小了

 CPU 利用率降至 0%,过(5-10)分钟 HPA 会自动将副本数缩减为 1。

不会负载下来立刻缩减副本数了,而是会过5-10分钟重新获取多次利用率再缩减

自动扩缩完成副本数量的改变可能需要几分钟的时间

[root@master ~]# kubectl get hpa -n study -w

NAME     REFERENCE                     TARGETS   MINPODS   MAXPODS   REPLICAS   AGE

pc-hpa   Deployment/nginx-deployment   0%/50%    1         10        2          23m

pc-hpa   Deployment/nginx-deployment   113%/50%   1         10        2          23m

pc-hpa   Deployment/nginx-deployment   79%/50%    1         10        4          24m

pc-hpa   Deployment/nginx-deployment   76%/50%    1         10        5          24m

pc-hpa   Deployment/nginx-deployment   0%/50%     1         10        5          24m

pc-hpa   Deployment/nginx-deployment   0%/50%     1         10        5          29m

pc-hpa   Deployment/nginx-deployment   0%/50%     1         10        1          29m

[root@master ~]# kubectl get pod -n study -w

nginx-deployment-55c9d4fbb5-5k82v   1/1     Terminating         0          8m17s

nginx-deployment-55c9d4fbb5-fs9v5   1/1     Terminating         0          5m30s

nginx-deployment-55c9d4fbb5-c8x9c   1/1     Terminating         0          5m15s

nginx-deployment-55c9d4fbb5-dpbwl   1/1     Terminating         0          5m30s

nginx-deployment-55c9d4fbb5-fs9v5   1/1     Terminating         0          5m30s

nginx-deployment-55c9d4fbb5-5k82v   1/1     Terminating         0          8m17s

[root@master k8s]# kubectl get deployments.apps -n study -w

NAME               READY   UP-TO-DATE   AVAILABLE   AGE

nginx-deployment   5/5     5            5           65m

nginx-deployment   5/1     5            5           68m

nginx-deployment   5/1     5            5           68m

nginx-deployment   1/1     1            1           68m

删除

删除hpa不会连着其创建deployment一起删除,要手动删除

[root@master k8s]# kubectl get hpa -A

NAMESPACE   NAME     REFERENCE                     TARGETS   MINPODS   MAXPODS   REPLICAS   AGE

study       pc-hpa   Deployment/nginx-deployment   0%/50%    1         10        1          2d6h

[root@master k8s]# kubectl delete -f controller.yaml

horizontalpodautoscaler.autoscaling "pc-hpa" deleted
[root@master k8s]# kubectl get deployments.apps -n study

NAME               READY   UP-TO-DATE   AVAILABLE   AGE

nginx-deployment   1/1     1            1           2d7h

[root@master k8s]# kubectl delete deployments.apps  -n study nginx-deployment

deployment.apps "nginx-deployment" deleted

DaemonSet

DaemonSet类型的控制器可以保证集群中的每一台(或指定)节点上都运行一个副本,一般适用于日志收集、节点监控等场景。也就是说,如果一个Pod提供的功能是节点级别的(每个节点都需要且只需要一个),那么这类Pod就适合使用DaemonSet类型的控制器创建

  1. DaemonSet控制器的特点:
    1. 每向集群中添加一个节点的时候,指定的Pod副本也将添加到该节点上。
    2. 当节点从集群中移除的时候,Pod也会被垃圾回收。

整体 yaml 解析

revisionHistoryLimit: 保留历史版本,用于回滚

updateStrategy: 更新策略

  type: RollingUpdate : 更新策略类型设置为滚动更新

  # 还有 OnDelete 仅在被杀死时替换旧的守护程序

minReadySeconds: 新创建的DaemonSet pod的最小准备时间,默认为0
apiVersion: apps/v1 # 版本号

kind: DaemonSet # 类型

metadata: # 元数据

  name: # 名称

  namespace: #命名空间

  labels: #标签

    controller: daemonset

spec: # 详情描述

  revisionHistoryLimit: 3 # 保留历史版本

  updateStrategy: # 更新策略

    type: RollingUpdate # 滚动更新策略

    rollingUpdate: # 滚动更新

      maxUnavailable: 1 # 最大不可用状态的Pod的最大值,可用为百分比,也可以为整数

  selector: # 选择器,通过它指定该控制器管理那些Pod

    matchLabels: # Labels匹配规则

      app: nginx-pod

    matchExpressions: # Expressions匹配规则

      - 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

创建

apiVersion: apps/v1 # 版本号

kind: DaemonSet # 类型

metadata: # 元数据

  name: pc-damonset # 名称

  namespace: dev #命名空间

spec: # 详情描述

  selector: # 选择器,通过它指定该控制器管理那些Pod

    matchLabels: # Labels匹配规则

      app: nginx-pod

  template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板

     metadata:

       labels:

         app: nginx-pod

     spec:

       containers:

         - name: nginx

           image: nginx:1.17.1

           ports:

             - containerPort: 80
[root@master k8s]# kubectl apply -f controller.yaml

daemonset.apps/pc-damonset created

[root@master k8s]# kubectl get ds -n study -o wide

NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE   CONTAINERS   IMAGES         SELECTOR

pc-damonset   2         2         0       2            0           <none>          36s   nginx        nginx:1.17.1   app=nginx-pod

测试

# 将两个node都重启,则重启后node重新加入集群,damonset控制器会自动为每个新加入的创建pod

[root@master k8s]# kubectl get pods -A --field-selector=spec.nodeName=node2

NAMESPACE         NAME                               READY   STATUS    RESTARTS        AGE

calico-system     calico-node-s8v4z                  1/1     Running   4 (3m36s ago)   11d

calico-system     calico-typha-5b99648654-rgqg6      1/1     Running   5 (3m36s ago)   11d

kube-system       kube-proxy-g6q8z                   1/1     Running   4 (3m36s ago)   12d

kube-system       metrics-server-6b5d469648-hgr6q    1/1     Running   2 (112s ago)    2d22h

study             pc-damonset-hr6jt                  1/1     Running   0               6m25s

tigera-operator   tigera-operator-7795f5d79b-jf6pv   1/1     Running   12 (112s ago)   12d


[root@master k8s]# kubectl get pods -A --field-selector=spec.nodeName=node1

NAMESPACE       NAME                              READY   STATUS    RESTARTS        AGE

calico-system   calico-node-n4df5                 1/1     Running   3 (3m49s ago)   11d

calico-system   calico-typha-5b99648654-nrjfn     1/1     Running   3 (3m49s ago)   11d

kube-system     kube-proxy-trzb9                  1/1     Running   3 (3m49s ago)   11d

kube-system     metrics-server-6b5d469648-4vmvp   1/1     Running   2 (2m7s ago)    2d22h

study           pc-damonset-5xljn                 1/1     Running   0 

删除

[root@master k8s]# kubectl delete -f controller.yaml

daemonset.apps "pc-damonset" deleted

[root@master k8s]# kubectl get pod -n study

No resources found in study namespace.

Job

  1. Job主要用于负责批量处理短暂的一次性任务。
  2. Job的特点:
    1. 当Job创建的Pod执行成功结束时,Job将记录成功结束的Pod数量。
    2. 当成功结束的Pod达到指定的数量时,Job将完成执行。
    3. 一个一次性任务等于一个pod

整体 yaml 解析

 restartPolicy

关于模板中的重启策略的说明:

如果设置为OnFailure,则Job会在Pod出现故障的时候重启容器,而不是创建Pod,failed次数不变。

如果设置为Never,则Job会在Pod出现故障的时候创建新的Pod,并且故障Pod不会消失,也不会重启,failed次数+1。

如果指定为Always,就意味着一直重启,意味着Pod任务会重复执行,这和Job的定义冲突,所以不能设置为Always。

apiVersion: batch/v1 # 版本号

kind: Job # 类型

metadata: # 元数据

  name:  # 名称

  namespace:  #命名空间

  labels: # 标签

    controller: job

spec: # 详情描述

  completions: 1 # 指定Job需要成功运行Pod的总次数,等于需要执行多少次一次性任务,默认为1

  parallelism: 1 # 指定Job在任一时刻应该并发运行Pod的数量,等于同时执行多个一次性任务,默认为1

  activeDeadlineSeconds: 30

  # 指定Job可以运行的时间期限,超过时间还没结束,系统将会尝试进行终止

  backoffLimit: 6 # 指定Job失败后进行重试的次数,默认为6

  manualSelector: true # 是否可以使用selector选择器选择Pod,默认为false

  selector: # 选择器,通过它指定该控制器管理那些Pod

    matchLabels: # Labels匹配规则

      app: counter-pod

    matchExpressions: # Expressions匹配规则

      - key: app

        operator: In

        values:

          - counter-pod

  template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板

     metadata:

       labels:

         app: counter-pod

     spec:

       restartPolicy: Never # 重启策略只能设置为 Never 或 OnFailure

       containers:

         - name: counter

           image: busybox:1.30

           command: ["/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 20;done"]

创建

apiVersion: batch/v1 # 版本号

kind: Job # 类型

metadata: # 元数据

  name: pc-job # 名称

  namespace: study #命名空间

spec: # 详情描述

  manualSelector: true # 是否可以使用selector选择器选择Pod,默认为false

  selector: # 选择器,通过它指定该控制器管理那些Pod

    matchLabels: # Labels匹配规则

      app: counter-pod

  template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板

    metadata:

      labels:

        app: counter-pod

    spec:

      restartPolicy: Never # 重启策略只能设置为Never或OnFailure

      containers:

        - name: counter

          image: busybox:1.30

          command: [ "/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 3;done" ]

[root@master k8s]# kubectl apply -f controller.yaml

job.batch/pc-job created

[root@master k8s]# kubectl get job -A

NAMESPACE   NAME     COMPLETIONS(任务数量)   DURATION   AGE

study       pc-job   0/1    (成功数量/总数量)    6s         6s

[root@master k8s]# kubectl get pod -n study

NAME           READY   STATUS      RESTARTS   AGE

pc-job-s6ql5   0/1     Completed   0          2m34s
 # 持续变化如下

 NAME           READY   STATUS    RESTARTS   AGE

pc-job-7qgjk   1/1     Running   0          7s

pc-job-7qgjk   0/1     Completed   0          29s

pc-job-7qgjk   0/1     Completed   0          30s

pc-job-7qgjk   0/1     Completed   0          31s

pc-job-7qgjk   0/1     Completed   0          31s

 [root@master ~]# kubectl get job -n study -w

NAME     COMPLETIONS   DURATION   AGE

pc-job   0/1           11s        11s

pc-job   0/1           30s        30s

pc-job   0/1           31s        31s

pc-job   1/1           31s        31s

更改执行次数与并发

总共完成6次,同时间执行3个,也就是需要两轮

 completions: 6 # 指定Job需要成功运行Pod的总次数,等于需要执行多少次一次性任务,默认为1

 parallelism: 3 # 指定Job在任一时刻应该并发运行Pod的数量,等于同时执行多个一次性任务,默认为1

[root@master k8s]# vim controller.yaml

[root@master k8s]# kubectl apply -f controller.yaml

job.batch/pc-job created

删除

[root@master k8s]# kubectl delete -f controller.yaml

job.batch "pc-job" deleted

CronJob(CJ)

CronJob控制器以Job控制器为其管控对象,并借助它管理Pod资源对象,Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但CronJob可以以类似Linux操作系统的周期性任务作业计划(定时任务)的方式控制器运行时间点及重复运行的方式,换言之,CronJob可以在特定的时间点反复去执行Job任务。

Cronjob控制器是对job控制器进行pod操作

整体 yaml 解析

schedule:cron表达式,用于指定任务的执行时间。

    */1 *   *   *  *  表示 每分钟执行一次

    分  时  日  月  周。

    分钟的值从0到59。

    小时的值从0到23。

    日的值从1到31。

    月的值从1到12。

    星期的值从0到6,0表示星期日。

    多个时间可以用逗号隔开,范围可以用连字符给出:* 可以作为通配符,/表示每...

concurrencyPolicy:并发执行策略

# 第一个pod执行后还没完成,时间到了第二个pod要开始执行了,第二个pod能否执行就看这个参数

    Allow:运行Job并发运行(默认)。

    Forbid:禁止并发运行,如果上一次运行尚未完成,则跳过下一次运行。

    Replace:替换,取消当前正在运行的作业并使用新作业替换它。

apiVersion: batch/v1 # 版本号

kind: CronJob # 类型

metadata: # 元数据

  name:  # 名称

  namespace:  #命名空间

  labels:

    controller: cronjob

spec: # 详情描述

  schedule: # cron格式的作业调度运行时间点,用于控制任务任务时间执行

  concurrencyPolicy: # 并发执行策略

  failedJobsHistoryLimit: # 为失败的任务执行保留的历史记录数,默认为1

  successfulJobsHistoryLimit: # 为成功的任务执行保留的历史记录数,默认为3

  jobTemplate: # job控制器模板,用于为cronjob控制器生成job对象,下面其实就是job控制器的定义

    metadata: {}

    spec:

      completions: 1 # 指定Job需要成功运行Pod的总次数,默认为1

      parallelism: 1 # 指定Job在任一时刻应该并发运行Pod的数量,默认为1

      activeDeadlineSeconds: 30 # 指定Job可以运行的时间期限,超过时间还没结束,系统将会尝试进行终止

      backoffLimit: 6 # 指定Job失败后进行重试的次数,默认为6

      template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板

        spec:

          restartPolicy: Never # 重启策略只能设置为 Never 或 OnFailure

          containers:

            - name: counter

              image: busybox:1.30

              command: [ "/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 20;done" ]

创建

apiVersion: batch/v1 # 版本号

kind: CronJob # 类型

metadata: # 元数据

  name: pc-cronjob # 名称

  namespace: dev  #命名空间

spec: # 详情描述

  schedule: "*/1 * * * * " # cron格式的作业调度运行时间点,用于控制任务任务时间执行

  jobTemplate: # job控制器模板,用于为cronjob控制器生成job对象,下面其实就是job的定义

    metadata: {}

    spec:

      template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板

        spec:

          restartPolicy: Never # 重启策略只能设置为Never或OnFailure

          containers:

            - name: counter

              image: busybox:1.30

              command: [ "/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 2;done" ]

下面是完成两次后的状态流

[root@master k8s]# kubectl apply -f controller.yaml

cronjob.batch/pc-cronjob created

[root@master ~]# kubectl get cronjob -n study -w

NAME         SCHEDULE       SUSPEND   ACTIVE   LAST SCHEDULE   AGE

pc-cronjob   */1 * * * *    False     0        <none>          2s

pc-cronjob   */1 * * * *    False     1        0s              5s

pc-cronjob   */1 * * * *    False     0        22s             27s

pc-cronjob   */1 * * * *    False     0        22s             27s

pc-cronjob   */1 * * * *    False     1        0s              65s

pc-cronjob   */1 * * * *    False     0        22s             87s

pc-cronjob   */1 * * * *    False     0        22s             87s

[root@master ~]# kubectl get job -n study -w

pc-cronjob-27939788   0/1                      0s

pc-cronjob-27939788   0/1           0s         0s

pc-cronjob-27939788   0/1           2s         2s

pc-cronjob-27939788   0/1           21s        21s

pc-cronjob-27939788   0/1           22s        22s

pc-cronjob-27939788   1/1           22s        22s # 完成第一次

pc-cronjob-27939789   0/1                      0s

pc-cronjob-27939789   0/1           0s         0s

pc-cronjob-27939789   0/1           2s         2s

pc-cronjob-27939789   0/1           21s        21s

pc-cronjob-27939789   0/1           22s        22s

pc-cronjob-27939789   1/1           22s        22s # 完成第二次

pc-cronjob-27939790   0/1                      0s

pc-cronjob-27939790   0/1           0s         0s

[root@master ~]# kubectl get pod -n study -w

NAME                        READY   STATUS      RESTARTS   AGE

pc-cronjob-27939788-w29x8   0/1     Completed   0          110s

pc-cronjob-27939789-v6fbr   0/1     Completed   0          50s

删除

[root@master k8s]# kubectl delete -f controller.yaml

cronjob.batch "pc-cronjob" deleted

StatefulSet

文档: kubernetes之StatefulSet控制器-腾讯云开发者社区-腾讯云

  1. 无状态应用
    1. 认为Pod都是一样的。
    2. 没有顺序要求。
    3. 不用考虑在哪个Node节点上运行。
    4. 随意进行伸缩和扩展
  2. 有状态应用
    1. 有顺序的要求。
    2. 认为每个Pod都是不一样的。
    3. 需要考虑在哪个Node节点上运行。
    4. 需要按照顺序进行伸缩和扩展。
    5. 让每个Pod都是独立的,保持Pod启动顺序和唯一性。
  3. StatefulSet 是Kubernetes提供的管理有状态应用的负载管理控制器
  4. StatefulSet 部署需要HeadLinessService(无头服务)

为什么需要HeadLinessService(无头服务)?

  1. 在用Deployment时,每一个Pod名称是没有顺序的,是随机字符串,因此是Pod名称是无序的,但是在StatefulSet中要求必须是有序 ,每一个Pod不能被随意取代,Pod重建后pod名称还是一样的。
  2. 而Pod IP是变化的,所以是以Pod名称来识别Pod名称是Pod唯一性的标识符,必须持久稳定有效。这时候要用到无头服务,它可以给每个Pod一个唯一的名称

应用场景

常用来部署RabbitMQ集群、Zookeeper集群、MySQL集群、Eureka集群等

特点

  1. 稳定的、唯一的网络标识符。(每个 Pod 都有一个永久不变的 ID。
  2. 稳定的、持久的存储。(删除了所有pod,对用挂载的pvc卷是不会删除的
  3. 有序的、优雅的部署和缩放。
    1. 对于包含 N 个 副本的 StatefulSet,当部署 Pod 时,它们是依次创建的,顺序为 0..N-1。
    2. 当删除 Pod 时,它们是逆序终止的,顺序为 N-1..0。
    3. 在将缩放操作应用到 Pod 之前,它前面的所有 Pod 必须是 Running 和 Ready 状态。
    4. 在 Pod 终止之前,所有的继任者必须完全关闭
  4. 有序的、自动的滚动更新。

整体 yaml 解析

podManagementPolicy:

    OrderedReady(默认): # 就是按照一定的顺序先后启动

    Parallel: # StatefulSet 控制器并行的启动或终止所有的 Pod

    # 启动或者终止其他 Pod 前,无需等待 Pod 进入 Running 和 ready 或者完全停止状态

updateStrategy

    type: RollingUpdate

    # 还有 OnDelete 仅在被杀死时替换旧的守护程序

    rollingUpdate:# 滚动更新 使用rolling用新的复制集替换旧的复制集

更新,

                            # 即逐步缩小旧的复制集,并扩大新的复制集

      partition: 0 # 从第几个分区开始

---

# 设置 HeadLinessService

apiVersion: v1

kind: Service

metadata:

  name: service-headliness

  namespace: study

spec:

  podManagementPolicy: OrderedReady

  TerminationGracePeriodSeconds: 10 # 终止宽限时间,不要设置为0(默认)

  updateStrategy # 更新策略

    type: RollingUpdate

    rollingUpdate: # 滚动更新

      partition: 0

  selector: # 选择器,与pod模板进行绑定

    app: nginx-pod

  clusterIP: None # 将clusterIP设置为None,即可创建headliness Service

  type: ClusterIP

  ports:

    - port: 80 # Service的端口

      targetPort: 80 # Pod的端口

---

# 设置 StatefulSet 控制器

apiVersion: apps/v1

kind: StatefulSet

metadata:

  name: pc-statefulset

  namespace: study

spec:

  replicas: 3 # 副本数量,默认为 1

  serviceName: service-headliness # 与service进行绑定

  selector: # 选择器,与pod模板进行绑定

    matchLabels:

      app: nginx-pod

  template: # pod 模板

    metadata:

      labels:

        app: nginx-pod

    spec:

      containers:

        - name: nginx

          image: nginx:1.17.1

          ports:

            - containerPort: 80

创建

apiVersion: v1

kind: Service

metadata:

  name: service-headliness

  namespace: study

spec:

  selector:

    app: nginx-pod

  clusterIP: None # 将clusterIP设置为None,即可创建headliness Service

  type: ClusterIP

  ports:

    - port: 80 # Service的端口

      targetPort: 80 # Pod的端口

---

apiVersion: apps/v1

kind: StatefulSet

metadata:

  name: pc-statefulset

  namespace: study

spec:

  replicas: 3

  serviceName: service-headliness

  selector:

    matchLabels:

      app: nginx-pod

  template:

    metadata:

      labels:

        app: nginx-pod

    spec:

      containers:

        - name: nginx

          image: nginx:1.17.1

          ports:

            - containerPort: 80
[root@master k8s]# kubectl apply -f controller.yaml

service/service-headliness created

statefulset.apps/pc-statefulset created

[root@master k8s]# kubectl get statefulsets.apps -n study

NAME             READY   AGE

pc-statefulset   3/3     7s

[root@master k8s]# kubectl get svc -n study

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE

service-headliness   ClusterIP   None             <none>        80/TCP         38s
# 因为 clusterIP: None

# 下面 pod 注意命名规则

[root@master k8s]# kubectl get pod -n study

NAME               READY   STATUS    RESTARTS   AGE

pc-statefulset-0   1/1     Running   0          106s

pc-statefulset-1   1/1     Running   0          104s

pc-statefulset-2   1/1     Running   0          102s

删除

[root@master k8s]# kubectl delete -f controller.yaml

service "service-headliness" deleted

statefulset.apps "pc-statefulset" deleted

Deployment和StatefulSet的区别

  1. Deployment和StatefulSet的区别:Deployment没有唯一标识而StatefulSet有唯一标识。
  2. StatefulSet的唯一标识是根据主机名+一定规则生成的。
  3. StatefulSet的唯一标识是 主机名.无头Service名称.命名空间.svc.cluster.local

金丝雀发布

apiVersion: v1

kind: Service

metadata:

  name: service-headliness

  namespace: study

spec:

  selector:

    app: nginx-pod

  clusterIP: None # 将clusterIP设置为None,即可创建headliness Service

  type: ClusterIP

  ports:

    - port: 80 # Service的端口

      targetPort: 80 # Pod的端口


---
apiVersion: apps/v1

kind: StatefulSet

metadata:

  name: pc-statefulset

  namespace: study

spec:

  replicas: 3

  serviceName: service-headliness

  selector:

    matchLabels:

      app: nginx-pod

  template:

    metadata:

      labels:

        app: nginx-pod

    spec:

      containers:

        - name: nginx

          image: nginx:1.17.1

          ports:

            - containerPort: 80

  updateStrategy:

    rollingUpdate:

      partition: 0

    type: RollingUpdate 

  • 16
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值