• k8s之三、pod生命周期/探针/调度策略/控制器


    pod 生命周期官方文档

    https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-lifecycle/

    一、容器初始化

    创建当前pod容器前 先创建 依赖的其他 containers 容器

      ## 创建容器 (需等待初始化操作完成在创建容器)
      containers:
      - name: mayikt-main-container
        image: nginx:1.17.9
        ports:
        - name: nginx-port
          containerPort: 80
          
      ## 初始化操作 (睡眠40),实际可修改为等待指定服务启动成功
      initContainers:
      - name: mayikt-mysql
        image: busybox:1.30  
        command: [ "/bin/sh","-c","sleep 40;"]   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    二、钩子函数

    k8s在主容器的启动之后和停止之前提供了两个钩子函数,进行容器启动后 和 容器停止后的相关操作

    • 1.post-start: 容器创建之后执行 (相关命令),如果失败了则会自动重启容器, 容器创建后立即执行,注意由于是异步执行,它无法保证一定在 ENTRYPOINT 之前运行。如果失败,容器会被杀死,并根据 RestartPolicy 决定是 否重启
    • 2.pre-stop : 容器终止之前执行 (相关命令) 例如 杀死进程等 容器终止前执行,常用于资源清理。执行完成之后容器将成功终止,如果失败,容器同样也会被杀死。在其完成之前 会阻塞删除容器的操作
      钩子的回调函数支持三种方式
    2.1、Exec命令 模式

    执行 linux 命令

    spec:
      containers:
      - name: main-container
        image: nginx:1.17.1
        lifecycle:
          postStart:
            exec: # 容器创建之后执行(相关命令)修改nginx 页面
              command: ["/bin/sh","-c","echo mayikt > /usr/share/nginx/html/index.html"]
          preStop:
            exec: # 容器停止之后 执行停止nginx服务
              command: [" /usr/sbin/nginx","-s" , "quit" ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    2.2、TCPSocket 模式

    对指定端口发起请求检查

     lifecycle:
        # 容器创建之后执行
        postStart:
          tcpSocket:
            port: 8080
    
    • 1
    • 2
    • 3
    • 4
    • 5
    2.3、HTTPGet 模式

    发起一个http请求

    lifecycle:
        postStart:
          # 容器创建之后执行
          httpGet:
            path: /init   # URI地址
            port: 80  # 端口号
            host: 192.168.110.1 # 主机地址
            scheme: HTTP   # 支持的协议,http或https
    
    # http://192.168.110.1/init
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    三、容器探针

    相当于容器的心跳检测,发现容器挂掉了可以主动进行重启

    1. livenessProbe 存活探针(可用性探针): 用于检测容器实例当前是否处于正常运行的状态,如果不是为运行状态,k8s则会重启容器;
    2. readinessProbe 就绪探针(就绪性探针): 就绪性探针,用于检测应用实例当前是否可以接收请求,如果不能接受实例,k8s不会转发到该实例
    3.1、Exec命令 模式
    spec:
      containers:
      - name: main-container
        image: nginx:1.17.1
        livenessProbe: # 存活探针(可用性探针)
          exec:        # 执行一个pwd
            command: ["/bin/pwd" ,"/"] 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    3.2、TCPSocket 模式
        livenessProbe:  ## 存活探针(可用性探针)
          tcpSocket:    ## 底层会尝试访问容器ip:8080
            port: 8080 
    
    • 1
    • 2
    • 3
    3.3、HTTPGet 模式
        livenessProbe:
          httpGet: #访问指定的scheme://host:port/path
            scheme: HTTP   # 支持的协议,http或者https
            port: 80       # 端口号
            path: /mayikt  # URI地址 该地址不存在 会报错404
    
    • 1
    • 2
    • 3
    • 4
    • 5
    3.4、探针探测时间和次数指定
        livenessProbe:
          httpGet: #访问指定的scheme://host:port/path
            scheme: HTTP #支持的协议,http或者https
            port: 80 #端口号
            path: /mayikt #URI地址 该地址不存在 会报错404
          initialDelaySecands: 10   # 容器启动后10s开始探测   
          failureThreshold: 2       # 探测2次认为是失败   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    3.5、重启策略配置
    • 1.Always: 出现问题时 自动重启该容器,默认方式。
    • 2.OnFailure : 容器终止运行且退出码不为0时重启
    • 3.Never :不论状态为何,都不重启该容器
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.9
      --------------   
      restartPolicy: Never   # 设置重启策略为Never 无论状态如何 不会重启
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    四、pod调度策略

    4.1、运行到指定 node 节点

    spec:
      containers:
      - name: nginx-container
        image: nginx:1.17.9
        
      nodeName: node1 #指定该pod运行在node1 节点
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.2、运行到指定 lable 标签的节点

      containers:
      - name: nginx
        image: nginx:1.17.9
        
      nodeSelector:
        nodev: v2 #指定调度到具有node=v2标签 node节点上
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.3、策略和亲和性

    策略

    • 硬策略: 通过指定的规则,如果没有找到具体运行的Node节点 则会报错
    • 软策略: 优先走指定的规则, 如果没有找到具体运行的Node节点 则采用自动随机方式运行在node节点上。

    亲和性

    • 1.nodeAffinity(node亲和性) : pod根据node标签选择器 决定pod运行在那个node节点上
    • 2.podAffinity(pod亲和性): pod根据参照pod标签选择器 解决多个pod运行在同一个node节点上
    • 3.podAntiffinity(pod反亲和性): pod根据参照pod标签选择器 解决多个pod不允许在同一个node节点上

    operator关系符

    • 支持Exists, DoesNotExist, In, NotIn, Gt, Lt
    4.3.1、node亲和性 + 硬限制

    容器创建必须在标签v3或v4中,如果没有v3或v4标签的节点,则创建失败

    spec:
      containers: 
      - name: nginx
        image: nginx:1.17.9
      ------------------------------------------------------------------------
      affinity: # 设置亲和性
        nodeAffinity: # 亲和性node 设置
          requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
            nodeSelectorTerms:
            - matchExpressions: # 匹配nodev的值在[v3,v4 ]中的标签 node节点
              - key: nodev
                operator: In
                values: ["v3" , "v4"]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    4.3.2、node亲和性 + 软限制

    容器创建必须在标签v3或v4中,如果没有v3或v4标签的节点,则随机分配到其他节点中

      ------------------------------------------------------------------------
      affinity: # 亲和性设置
        nodeAffinity: # 设置node亲和性
          preferredDuringSchedulingIgnoredDuringExecution: # 软限制
          - weight: 1
            preference:
              matchExpressions: # 匹配当前node节点标签是否有 ["v3" , "v4"]
              - key: nodev
                operator: In
                values: ["v3" , "v4"]    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    4.3.3、pod 亲和性 + 硬限制

    容器直接创建在指定 pod 中

      ------------------------------------------------------------------------
      affinity: #亲和性设置
        podAffinity: #设置pod亲和性
          requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
          - labelSelector:
              matchExpressions:  # 匹配podinfo的值在 [mayikt-pod03]中的标签
              - key: podinfo
                operator: In
                values: ["pod01"] 
            topologyKey: kubernetes.io/hostname
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    4.3.4、pod 反亲和性 + 硬限制

    容器创建除了不会分配到以下指定的 pod,随机分发到其他 pod 中

      ------------------------------------------------------------------------
      affinity: #亲和性设置
        podAntiAffinity: #设置pod反亲和性
          requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
          - labelSelector:
              matchExpressions:  # 匹配podinfo的值在 [mayikt-pod03]中的标签
              - key: podinfo
                operator: In
                values: ["pod01"] 
            topologyKey: kubernetes.io/hostname
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    五、副本 ReplicaSet

    创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能

    5.0、前置相关命令

    # 创建命名空间
    kubectl delete ns mayikt-sit
    kubectl create ns mayikt-sit
    
    # 查看执行命名空间下pods 
    kubectl get pods -n mayikt-sit
    
    # 查看指定命名空间下的 pods 详情
    kubectl describe  pods -n mayikt-sit
    
    # 查看执行命名空间下副本集
    kubectl get rs mayikt-rp -n mayikt-sit -o wide 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    5.1、副本yml配置

    yml

    apiVersion: apps/v1
    kind: ReplicaSet
    # 命名空间
    metadata:
      name: mayikt-rp
      namespace: mayikt-sit
    spec:
      # 创建副本数量
      replicas: 3 
      # 选择器,选择副本的标签,pod控制器与pod之间建立联系 (对应副本配置的标签) 
      selector:
        matchLabels:
          app: nginx-pod
      # 副本配置    
      template:
        # 副本中的容器标签
        metadata:
          labels:
            app: nginx-pod
        # 副本中的对应容器
        spec:
          containers:
          - name: nginx
            image: nginx:1.17.9
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    命令

    # 执行yml文件
    kubectl create -f  mayikt-pod-controller01.yml
    
    • 1
    • 2

    5.2、弹性扩容缩容

    执行命令
    会进入yml vi编辑模式, 修改 replicas 副本数量,保存后自动进行扩容缩容

    kubectl edit rs mayikt-rp -n mayikt-sit
    
    • 1

    5.3、更新镜像

    同扩容缩容操作,编辑副本 image 版本即可

    kubectl edit rs mayikt-rp -n mayikt-sit
    
    • 1

    5.4、删除镜像

    k8s删除ReplicaSet前,会将ReplicaSet的replicasclear调整为0,等待所有的Pod被删除后,在执行RS对象的删除。

    kubectl delete rs mayikt-rp -n mayikt-sit
    
    • 1

    六、pod控制器 Deployment

    Deployment 是 ReplicaSet 的二次封装,在原基础功能上增加的 滚动更新版本回退

    6.0、前置相关命令

    # 创建命名空间
    kubectl delete ns mayikt-sit
    kubectl create ns mayikt-sit
    
    # 查看指定命名空间下pods 
    kubectl get pods -n mayikt-sit
    kubectl get pods -n mayikt-sit -w
    
    # 查看指定命名空间下的 pods 详情
    kubectl describe  pods -n mayikt-sit
    
    # 查看执行命名空间下副本集
    kubectl get deploy -n mayikt-sit -o wide
    
    # 查看执行命名空间下副本
    kubectl get rs -n mayikt-sit 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    6.1、Deployment yml配置

    apiVersion: apps/v1
    kind: Deployment
    # 命名空间配置
    metadata:
      name: mayikt-deployment
      namespace: mayikt-sit
    spec:
      # 副本数量
      replicas: 3
      # 选择器,选择副本的标签,pod控制器与pod之间建立联系 (对应副本配置的标签) 
      selector:
        matchLabels:
          app: nginx-pod
      # 副本配置
      template:
        # 副本中的容器标签
        metadata:
          labels:
            app: nginx-pod
        # 副本中的对应容器
        spec:
          containers:
          - name: nginx
            image: nginx:1.17.9
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    命令

    # 执行yml文件
    kubectl create -f  mayikt-pod-controller01.yml
    
    • 1
    • 2

    6.2、弹性扩容缩容

    直接命令形式更改, 修改 replicas 副本数量,自动进行扩容缩容

    kubectl scale deploy mayikt-deployment --replicas=6 -n mayikt-sit
    
    • 1

    6.3、更新镜像

    直接命令形式更改, 修改 replicas 副本数量,自动进行扩容缩容

    6.3.1、副本策略说明
    • Recreate 先杀掉所有已存在的Pod,在创建出新的Pod
    • RollingUpdate(滚动更新) 杀死一部分, 就启动一部分 存在两个版本Pod---- 同时支持版本回退
      RollingUpdate 下两个属性:
      maxUnavailable: 用来指定在升级过程中不可用Pod的最大数量,默认为25%。
      maxSurge: 用来指定在升级过程中 可以超过期望的Pod的最大数量,默认为25%。
    6.3.2、重建更新配置

    yml 中 spec 配置

    spec:
      strategy: # 策略
        type: Recreate # 重建更新
      replicas: 3
    
    • 1
    • 2
    • 3
    • 4
    6.3.3、滚动更新配置

    yml 中 spec 配置

    spec:
      strategy: # 策略
        type: RollingUpdate # 滚动更新
        rollingUpdate:
          maxUnavailable: 25%
          maxSurge: 25% 
      replicas: 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    6.3.4、更新命令

    更新时根据配置策略来决定是 重建更新 还是 滚动更新

    kubectl set image deploy mayikt-deployment nginx=nginx:1.17.8 -n mayikt-sit
    
    • 1

    6.4、版本回退

    # 首次执行yml创建时需加上--record 让其支持版本回退
    kubectl create -f  mayikt-pod-controller04.yml --record
    
    # 查看版本更新状态
    kubectl rollout status deploy mayikt-deployment -n mayikt-sit
    
    # 查看历史更新记录
    kubectl rollout history deploy mayikt-deployment -n mayikt-sit
    
    # 版本回退 to-revision=11是对应的历史更新记录的版本号
    kubectl rollout undo deployment mayikt-deployment --to-revision=1 -n mayikt-sit
    
    # 查看执行命名空间下副本集
    kubectl get deploy -n mayikt-sit -o wide
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    Web前端高频面试题解析(javascript篇)--- 每日十题(6)
    对于koa中间件的理解
    Pointnet++训练记录——Partseg
    Pytest运行指定的case,这个方法真的很高效……
    Java设计模式-工厂模式
    3. 使用PyTorch深度学习库训练第一个卷积神经网络CNN
    JS:构造函数的返回值
    西宁市初中生地会考报名照片尺寸要求及手机自拍方法
    Jmeter基础
    3min快速掌握Go语言正/反向代理的姿势
  • 原文地址:https://blog.csdn.net/qq_41463655/article/details/126943869