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;"]   

二、钩子函数

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" ]
2.2、TCPSocket 模式

对指定端口发起请求检查

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

四、pod调度策略

4.1、运行到指定 node 节点

spec:
  containers:
  - name: nginx-container
    image: nginx:1.17.9
    
  nodeName: node1 #指定该pod运行在node1 节点

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

  containers:
  - name: nginx
    image: nginx:1.17.9
    
  nodeSelector:
    nodev: v2 #指定调度到具有node=v2标签 node节点上

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"]

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"]    
4.3.3、pod 亲和性 + 硬限制

容器直接创建在指定 pod 中

  ------------------------------------------------------------------------
  affinity: #亲和性设置
    podAffinity: #设置pod亲和性
      requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
      - labelSelector:
          matchExpressions:  # 匹配podinfo的值在 [mayikt-pod03]中的标签
          - key: podinfo
            operator: In
            values: ["pod01"] 
        topologyKey: kubernetes.io/hostname
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

五、副本 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 

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

命令

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

5.2、弹性扩容缩容

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

kubectl edit rs mayikt-rp -n mayikt-sit

5.3、更新镜像

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

kubectl edit rs mayikt-rp -n mayikt-sit

5.4、删除镜像

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

kubectl delete rs mayikt-rp -n mayikt-sit

六、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 

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

命令

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

6.2、弹性扩容缩容

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

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

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
6.3.3、滚动更新配置

yml 中 spec 配置

spec:
  strategy: # 策略
    type: RollingUpdate # 滚动更新
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25% 
  replicas: 3
6.3.4、更新命令

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

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

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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐