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 匹配规则

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值