K8S创建Pod的YAML文件详解(污点和容忍度、Pod状态、生命周期和健康监测)

艺帆风顺 发布于 2025-04-02 22 次阅读


一、污点和容忍度

    名词解释:污点是一种节点上的属性,他表示该节点存在某种问题,如磁盘空间不足、内存不足等。如果一个节点被标记污点,那么默认情况下,K8S不会在该节点上调度新的Pod容忍度是一种Pod属性,容忍度只是告诉K8S,这个Pod可以容忍特定的污点,但是并不意味着Pod必须被调度到拥有这个污点的节点上。例:给节点添加污点kubectl taint nodes lx252 a=b:NoSchedule解释:这会给lx252节点打上a=b的污点,它的效果是NoSchedule不调度编写Yaml文件容忍:vim podtaint.yaml---apiVersion: v1kind: Podmetadata:  name: taint  spec:   containers:   - name: taint      image: ikubernetes/myapp:v1      imagePullPolicy: IfNotPresent    tolerations:    - key: a      operator: Equal  #选项有Equal和Exists分别为 Equal:键值对完全相当,Exists:只要键相等即可      value: b      effect: NoSchedule  #选项有NoSchedule、PreferNoSchedule、NoExecute                          #NoSchedule:该节点将被标记为不可调度状态,即不会将新的 Pod 调度到该节点上                          #PreferNoSchedule:当节点上存在与 Pod 的 Taints 相匹配的污点时,该节点仍然可以被调度 Pod,但是调度器会尽量避免将新的 Pod 调度到带有污点的节点上。                          #NoExecute:如果一段时间后Pod仍然无法容忍,那么Pod将会被去追。!!!!谨慎使用!!!!

    二、Pod状态和重启策略

    Pod常见状态:

      Pending:等待指定Node节点或者调度到的Node有足够的资源被释放Running:Pod中的容器正在运行中Succeeded: 如果指定了具体任务且任务已经完成成功了,那么Pod将会进入Succeeded状态Failed:如果指定了具体任务但是任务失败了,Pod就会进入Failed状态Unknown: 当删除一个Pod的控制器时,Kubernetes将会对该Pod的监视,那状态就会变成UnknowncontainerCreating:Pod已经被Kubernetes调度到了某个节点上,但是容器还没有开始Terminating:Pod正在被删除CrashLoopBackOff:当一个容器启动失败,并且已经尝试了指定的重启次数(通常为3次),但是每次都失败了ImagePullBackOff:Pod中某个容器无法拉取镜像CreateContainerConfigError:Pod中的某个容器无法创建CreateContainerError:Pod中的某个容器无法创建PodInitializing:Pod正在初始化error

      Pod重启策略

        kubernetes提供了三种重启策略Always:无论什么情况下,只要容器退出或者停止,就会自动重启Pod里的容器OnFailure:只有当容器以非0状态终止时才会自动重启Pod里的容器Never:  Pod里的容器不会被自动重启,除非显式的进行手动操作例:OnFailure重启策略vim onfailure.yaml---apiVersion: v1kind: Podmetadata: name: onfailurespec: containers:  - name: onfailure   image: nginx:latest   imagePullPolicy: IfNotPresent  restartPolicy: OnFailurekubectl apply -f onfailure.yaml#查看pod状态kubectl get pods#进入Pod正常停止Podkubectl exec -it [PodName] /bin/bash#停止Nginxnginx -s stop#容器退出,现在查看容器状态为Completed删除容器重新创建kubectl delete pods onfailurekubectl apply -f onfailure.yaml#查看pod状态kubectl get pods#进入Pod异常停止Podkubectl exec -it [PodName] /bin/bash#停止Nginxpkill nginx就会发现Pod在重启

        三、生命周期

          Pod生命周期包括一下几个阶段1、初始化容器(init Containers)阶段 初始化容器是在Pod启动之前运行一组容器,他们复制执行一些必要的初始化任务2、主容器(main containers)阶段 主容器时Pod中的核心容器他们负责实际运行应用程序或服务3、运行时状态(running state)阶段 一旦Pod的中的所有容器都启动成功,它们会进入Running状态4、容器重启(Container Restart)阶段 在Pod运行期间,容器可能会出现故障或崩溃。当容器重新启动时,Kubernetes会记录重启次数,并在频繁重启时采用相应的措施5、终止(Termination)阶段 当Pod不再需要时,Kubernetes会将其终止

          四、健康监测

            常用的健康探测方式:1、Liveness Probe(存活探测):Liveness Probe 用于监测 pod 内的容器是否处于运行状态。当Liveness Probe 探测失败时,Kubernetes 根据重启策略决定是否重启该容器。适用于需要在容器发生故障时立即进行重启的应用场景,比如 Web 服务器和数据库等应用。2、Readiness Probe(就绪探测):Readiness Probe 用于监测 pod 内的容器是否已经准备好接受流量,即容器是否已经完成初始化并已经启动了应用程序。当容器的 Readiness Probe 探测失败时,Kubernetes 将停止将新的流量转发到该容器。适用于需要应用程序启动较长时间的应用场景,比如大型 Web 应用程序3、Startup Probe(启动探测) Startup Probe 用于监测 pod 内的容器是否已经启动成功并准备好接受流量。与 Liveness Probe 不同的是,Startup Probe 只会在容器启动时执行一次。当 Startup Probe 探测失败时,Kubernetes 将自动重启该容器。适用于需要较长启动时间的应用场景,比如应用程序需要大量预热或者需要等待外部依赖组件的应用程序。三种均支持 httpGet、exec和tcpSocket三种探针例:vim hunhe.yamlapiVersion: v1kind: Podmetadata: name: hunhespec: containers: - name: hunhe image: nginx imagePullPolicy: IfNotPresent    readinessProbe:  #就绪探测 httpGet: #尝试连接80端口的index.html路径 path: /index.html port: 80      initialDelaySeconds: 10  #每间隔10秒重新连接 periodSeconds: 5 #容器启动后等待5秒      successThreshold: 1  #成功一次后就表明容器已经就绪 failureThreshold: 3 #失败三次说明这个容器不健康,容器会被重启    livenessProbe: #存活探测      httpGet: #尝试连接80端口的index.html路径        path: /index.html port: 80 initialDelaySeconds: 15 #等待15秒      periodSeconds: 10      #每隔10秒再次尝试重新连接 failureThreshold: 3 #如果三次连续探测失败就是不健康的,容器会被重启 startupProbe: #启动探测 httpGet: #尝试连接80端口的index.html路径 path: /index.html port: 80      periodSeconds: 10  #每隔10秒再次尝试重新连接 initialDelaySeconds: 5 #等待5秒      failureThreshold: 10  #如果10次连续探测失败就是不健康的,容器会被重启