七、Kubernetes Pod控制器

       一、简单介绍

        在kubernetes中,一般P可以分为两大类,自主式Pod和控制器创建的Pod,这里的Pod的控制器是管理Pod的中间层,控制器等于直接接受用户的需求,对Pod的期望以及策略等,来保障Pod正常运行;

        二、控制器的种类

名称

简称作用

ReplicaSet

RS

保证指定数量的pod运行,支持pod的数量变更,镜像版本的变更

Deployment

Deploy

通过控制ReplicaSet来控制pod,并且支持滚动升级,版本回退

Horizontal Pod Autoscaler

HPA

可以根据集群负载自动调整pod的数量,节省对资源的利用

DaemonSet

DS

在集群中的指定node上都运行一个副本,一般用于守护进程类的任务

Job

\

建出来的pod只要完成任务会立即退出,一次性

Cronjob

cj

创建出来的pod会周期性执行,用于执行周期性任务

StatusfulSet

\

管理有状态应用

1.ReplicaSet (RS)

#创建编辑YAML文件;

vim rs.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicas-nginx
  namespace: dev
  labels:    #  标签
    controller: replicas
spec:
  replicas: 3  #  Pod副本的数量
  selector:  # 选择器,通过它指定该控制器管理哪些pod
    matchLabels:    #  Label匹配的规则
      replicas: nginx-pod
    matchExpressions:  #  Expressions匹配规则
      - {key: replicas, operator: In, values: [nginx-pod]}
  template:  # 模板,当pod的数量不足时,会根据下面模板来创建pod副本
    metadata:
      labels:
        replicas: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80

#查看Pod,RS的状态

kubectl get rs,pod -n dev -o wide
[root@master ~]# kubectl get rs,pod -n dev -o wide
NAME                    DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES         SELECTOR
replicaset.apps/rspod   3         3         3       17s   nginx        nginx:latest   rs=nginxpod,rs in (nginxpod)

NAME               READY   STATUS             RESTARTS          AGE   IP               NODE    NOMINATED NODE   READINESS GATES

pod/rspod-57ldz    1/1     Running            0                 17s   10.244.104.50    node2   <none>           <none>
pod/rspod-76q47    1/1     Running            1 (13s ago)       17s   10.244.166.146   node1   <none>           <none>
pod/rspod-kk9hk    1/1     Running            1 (6s ago)        17s   10.244.104.49    node2   <none>           <none>

#通过控制器对Pod进行操作

# 直接删除Pod,RS控制器会自己发现Pod数量不满足后自动创建

[root@master ~]# kubectl delete pod rspod-76q47 -n dev 
pod "rspod-76q47" deleted


# 通过配置文件修改Pod的数量

[root@master ~]# kubectl edit rs rspod -n dev

.....
replicas: 5
.....

此时的Pod数量已经变为5个,缩容也是一样的操作

[root@master ~]# kubectl get pods -n dev -o wide

#直接通过命令的方式

[root@master ~]# kubectl scale rs rspod --replicas=5 -n dev




#通过控制器对j镜像进行操作

#使用编辑配置文件的方式,跟修改Pod副本数量一致

#使用命令的方式
[root@master ~]# kubectl set image rs rspod nginx=nginx:1.17.2 -n dev

#删除RS控制器

#直接删除RS控制器

kubectl delete rs rspod -n dev

#通过配置文件删除

kubectl delete -f rs.yml

2.Deployment(Deploy)

        Deployment控制器是通过控制RS来对Pod进行管理,所以说RS有的功能Deployment都具备;

# 创建deploy控制器,并查看;

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploypod
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      rs: nginxpod
  template:
    metadata:
      labels:
        rs: nginxpod
    spec:
      containers:
      - name: nginx
        image: nginx:latest

[root@master ~]# kubectl get deploy,rs,pods -n dev -o wide

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
deployment.apps/deploypod   2/3     3            2           90s   nginx        nginx:latest   rs=nginxpod

NAME                                 DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES         SELECTOR
replicaset.apps/deploypod-bfddf859   3         3         2       90s   nginx        nginx:latest   pod-template-hash=bfddf859,rs=nginxpod

NAME                           READY   STATUS             RESTARTS      AGE   IP               NODE    NOMINATED NODE   READINESS GATES
pod/deploypod-bfddf859-6w9rj   1/1     Running            0             90s   10.244.166.183   node1   <none>           <none>
pod/deploypod-bfddf859-nx5x5   1/1     Running            1 (84s ago)   90s   10.244.166.190   node1   <none>           <none>
pod/deploypod-bfddf859-vdv4v   0/1     Running    1 (5s ago)    90s   10.244.104.42    node2   <none>           <none>

#deploy的扩缩容

# 使用命令的方式将pod扩展成5个

kubectl scale deploy deploypod --replicas 5 -n dev

# 使用编辑文件的方式将Pod锁容成3个

kubectl edit deploy deploypod -n dev

#deploy的镜像更新

          默认为重建更新和滚动更新;

strategy: #指定新的Pod替换旧的Pod的策略:有两个属性
    type: #指定策略类型,支持两种策略
        Recreate: 在创建出新的Pod之前会杀掉所有已存在的Pod
        RollingUpdate:滚动更新,一部分一部分的杀死,在过程中有新旧两个版本    
    #当上面的type为RollingUpdate,需要配置下面,而Recreate则不需要
    rollingUpdate:
        maxUnavailable:用来指定在升级的过程中不可用Pod的最大数,默认为25%。
        maxSurge:用来指定在升级过程中可以超过期望Pod的最大数量,默认为25%。
#重建更新,创建新的rs,在新的rs创建新的pod

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploypod
  namespace: dev
spec:
  strategy:
    type: Recreate #重建策略
  replicas: 5
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx    
    spec:
      containers:
      - name: nginx
        image: nginx:latest

#使用重建更新,之前的Pod会直接杀死,重新根据新的deploy控制器进行创建
#滚动更新,创建新的rs,在新的rs创建新的pod,新的创建一个,老的消失一个;

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploypod
  namespace: test
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  replicas: 5
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx  
    spec:
      containers:
      - name: nginx
        image: nginx:latest

#

[root@master ~]# kubectl set image deploy deploypod -n dev nginx=nginx:1.17.3

deployment.apps/deploypod image updated

#我们可以通过查看pod的指令查看滚动更新的过程,如果更新的过程中发现新的版本或者有问题需要停止更新或者需要进行其他操作;


#record

[root@master ~]# kubectl apply -f deploy.yaml --record



kubectl rollout:
    
    #status 显示当前升级状态

[root@master ~]# kubectl rollout status deploy deploypod -n dev
deployment "pc-deploy" successfully rolled out

    #history 显示升级历史记录

[root@master ~]# kubectl rollout history deploy deploypod -n dev
deployment.apps/pc-deploy 
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=deploy.yaml --record=true
2         kubectl apply --filename=deploy.yaml --record=true

    #pause 暂停版本升级过程

[root@master ~]# kubectl rollout pause deploy deploypod -n dev

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

[root@master ~]# kubectl rollout resume deploy deploypod -n dev
   
    #restart 重启版本升级过程

[root@master ~]# kubectl rollout restart deploy deploypod -n dev

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

[root@master ~]# kubectl rollout undo deploy deploypod -n dev --to-revision=2
deployment.apps/pc-deploy rolled back
    




3.金丝雀发布

        Deployment支持更新过程的控制,暂停或继续的操作;

        金丝雀发布:我们在对pod进行更新的之后,立即暂停对pod的更新,这个时候在新的rs下面只有一小部分新的pod,主体还是老RS里面的 pod资源,我们把部分用户的请求路由到新版本的pod上面进行应用,观察是否达到期望值。没问题继续完成更新,有问题进行版本回退;

#对镜像版本进行更新,并配置暂停deploy
[root@master ~]# kubectl set image deploy deploypod nginx=nginx:1.17.5 -n dev && kubectl rollout pause deploy deploypod -n dev 
deployment.apps/deploypod image updated
deployment.apps/deploypod paused

#观察更新状态
[root@master ~]# kubectl rollout status deploy deploypod -n test
Waiting for deployment "pc-deploy" rollout to finish: 3 out of 5 new replicas have been updated...

#确定更新的pod没问题了,继续更新

[root@master ~]# kubectl rollout resume deploy deploypod -n dev
deployment.apps/deploypod resumed

4.Horizontal Pod Autoscaler

        可以根据集群负载自动调整pod的数量,节省对资源的利用;

1.安装metrics-server
    #使用官方提供的YAML文件直接部署:
    kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
    #一般镜像拉去不下来,我们需要修改metrics-server换成阿里云的镜像,metrics-server存放在kube-system的名称kong'jian
    kubectl edit deploy metrics-server -n kube-system
        #image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.6.3 
        #还需要添加tls证书,在spec.template.spec.containers.arges下面添加
        - --kubelet-insecure-tls  # 添加此参数
    #验证是否添加成功,查看输出对象,验证镜像是否拉去成功
    kubectl describe deploy metrics-server -n kube-system | grep "Image:"
    #镜像修改成功后如果get pods还是镜像拉取失败状态的话我们使用更新deploy重新拉取镜像
    kubectl rollout restart deploy metrics-server -n kube-system
    #get pos -n kube-system
    [root@master ~]# kubectl get pods -n kube-system
     NAME                              READY   STATUS             RESTARTS        AGE
     metrics-server-7b8865848d-8j66h   0/1     Running            10 (5m4s ago)   19m
     #查看top node 节点资源
     [root@master ~]# kubectl top node
   NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
   master   75m          3%     2713Mi          76%       
   node1    22m          1%     2257Mi          63%       
   node2    26m          1%     1944Mi          54% 
    
2.准备deployment和service
    
    #创建一个deployment和service
        deployment:创建一个nginx:latest,并对资源进行限制,cpu=100m 等等;
        service:暴露80端口
        [root@master ~]# kubectl expose deployment nginx01 --type=NodePort --port=80 -n test
        
3.部署HpA
    
    #创建hpa.yaml
    
[root@master ~]# cat hpa.yaml 
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-pc
  namespace: test
spec:
  minReplicas: 1  #指定最小pod的数量
  maxReplicas: 10  #指定最大pod的数量
  targetCPUUtilizationPercentage: 3 #cpu使用率指标 百分比单位
  scaleTargetRef:  #指定要控制的nginx信息
    apiVersion: apps/v1
    kind: Deployment
    name: nginx01  

5.DaemonSet

  • 在集群中的指定node上都运行一个副本,一般用于守护进程类的任务;
  • 适用于于日志收集和节点监控,适用一个pod提供的功能是节点级别的(每一个节点都需要,而且只需要一个的pod);
  • 自己的理解,就是比如一个班级每一个人都有一个学号,如果一天来了一个转校生那么学校自动会给他分配一个学号,毕业了学号就消失了,并且一个学生只需要一个学号
  • 特点:

            1.每向集群中添加一个节点时,指定的pod副本也将添加到该节点
            2.当node节点消失,那么pod也自动消失

apiVersion: v1
kind: DaemonSet
metadata:
    name:
    namespace:
    labels:
        controller: daemonset
spec:
    revisionHistoryLimit: 3 # 保留历史版本的数量
    updateStrategy:    # 更新策略
        type: RollingUpdate    # 滚动更新策略
        rollingUpdate:    # 滚动更新
            maxUnavailabel: 1    #最大不可用状态的值,或者是百分比
    selector:
        matchLabels:
            app: nginxpod
        matchExpressions:
            - {key: app, operator: In, values: [nginxpod]}
    template:
        metadata:
            labels:
                app: nginxpod
        spec:   
            containers:
            - name: nginx
              image: nginx:latest
              ports:
              - containerPort: 80

6.Job

        job创建出来的pod只要完成任务会立即退出,一次性,主要用于批量处理短暂的一次性任务;

特点:

        1.当job创建的pod执行成功后,将记录成功结束的pod的数量;

         2.当成功结束的pod达到指定数量时,job将完成执行;

apiVersion: batch/v1
kind: Job
metadata:
    name: jobpod
    namespace: 
    labels:
        controller: job
spec:
    completions: 1 # 指定job需要成功运行Pods的次数。默认是1
    parallelism: 1 # 指定job在任意时刻应该并发运行pods的数量。默认是1
    activeDeadlineDeconds: 30 #指定job可运行的时间期限,超时系统会尝试终止
    backoffLimit: 6 # 指定job失败后进行重试的次数,默认是6
    manualSelector: true # 是否可以使用selector选择器选择pod,默认是false
    selector: # 选择器,通过它该指定该控制器管理哪些pod
        matchLabels: # Labels匹配规则
            app: counter-pod
        matchExpressions: 
            - {key: app, operator: In, values: [counter-pod]}
    template: 
        metadata:
            labels:
                app: counter-pod
        spec:
            restartPolicy: Never # 重启策略,下面会单独讲解重启策略的说明
            containers:            
            - name: counter
              image: busybox:1.30
              command: ["bin/sh", "-c", "dor i in 9 8 7 6 5 4 3 2 1 ; do echo $i;slepp 2;done"]

关于重启策略:

1.如果指定的是OnFailure,则job会在pod出现故障时重启容器,而不是创建pod,failed的次数不会发生改变;

2.如果指定的为Never,则job会在pod出现故障时创建新的pod,并且故障pod不会消灭,也不会重启,failed次数加1;

3.如果指定为Always的话,就意味着一直重启,意味着job任务会重复去执行,所以不能设置为Always;

#案例测试

apiVersion: batch/v1
kind: Job
metadata:
  name: job
  namespace: test
spec:
  completions: 2
  parallelism: 2
  manualSelector: true
  selector:
    matchLabels:
      run: job
  template:
    metadata:
      labels:
        run: job
    spec:
      restartPolicy: Never
      containers:
      - name: counter
        image: busybox:1.30
        command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1 0; do echo $i;sleep 3;done"]

7.Cronjob

        创建出来的pod会周期性执行,用于执行周期性任务;通过管控job去控制pod,可以在特定的时间点上重复 的去运行job任务;

apiVersion: batch/v1beta1
kind: CronJob
metadata:
    name: 
    namespace: 
    labels:
        controller: job
spec:
    schedule: # cron格式的作业调度运行时间点,用于控制任务在什么时间执行
    concurrencyPolicy: # 并发执行策略,用于定义前一次作业运行尚未完成时是否以及如何运行后一次的作业
    failedJobHistoryLimit: # 为失败的任务执行保留的历史记录数,默认为3
    successfulJobHistiryLimit: # 为成功的任务执行保留的历史记录数,默认为3
    startingDeadlineSeconds: # 启动作业错误的超时时长
    jobTemplate: # job控制器模板,用于为cronjob控制器生成job对象;下面其实是job的定义
        metadata:
        spec:
            completions: 1
            parallelism: 1
            activeDeadlineSeconds: 30
            backoffLimit: 6
            manualSelector: true
            selector:
                matchLabels:
                    app: counter-pod
                matchExoressions:
                    - {key: app, operator: In, values: [counter-pod]}
            template:
                metadata:
                    labels:
                        app: counter-pod
                spec:
                    restartPolicy: Never
                    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"]


#重点解释的几个选项

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

*/1  *  *  *  *

分  时  日 月  周

分钟:值从0到59
小时:值从0到23
日: 值从1到31
月: 值从1到12
周: 值从0到6,0代表周日
多个时间可以用逗号隔开;范围可以用连字符;*可以作为通配符;/表示每..

concurrencyPolicy:
    Allow: 允许jobs并发运行(默认)
    Forbid: 禁止并发运行,如果上一次运行尚未完成,则跳过下一次运行
    Replace: 替换,取消当前正在运行的作业并用新作业替换它

    
    
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cron
  namespace: dev
  labels:
    run: cronjob
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    metadata:
    spec:
      completions: 1
      parallelism: 1
      template:
        spec:
          restartPolicy: Never
          containers:
          - name: counter
            image: busybox:1.30
            command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1 0; do echo $i;sleep 3;done"]

        kubernetes中的Pod控制器差不多这里就结束了,笔记的来源都是某站来的,如果大家看不懂可以评论区问我也可以直接某站找资源,谢谢友友们!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值