Linux企业运维——KubernetesPod生命周期

Posted 是大姚呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux企业运维——KubernetesPod生命周期相关的知识,希望对你有一定的参考价值。

Linux企业运维——Kubernetes(三)Pod生命周期

1、Pod生命周期简介

Pod 遵循一个预定义的生命周期,起始于 Pending 阶段,如果至少其中有一个主要容器正常启动,则进入 Running,之后取决于 Pod 中是否有容器以失败状态结束而进入 Succeeded 或者 Failed 阶段。
Pod 在其生命周期中只会被调度一次。 一旦 Pod 被调度(分派)到某个节点,Pod 会一直在该节点运行,直到 Pod 停止或者 被终止。

2、init容器

Pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。
Init 容器与普通的容器非常像,除了如下两点:

  • 它们总是运行到完成。
  • Init 容器不支持 Readiness,因为它们必须在 Pod 就绪之前运行完成,每个 Init 容器必须运行成功,下一个才能够运行。

如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动。

2.1、init容器的作用

  • Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。
  • Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。
  • 应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。
  • Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。
  • 由于 Init 容器必须在应用容器启动之前运行完成,因此 Init
    容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。

2.2、init初始化容器

pause镜像为pod提供了基础的初始化环境。

1、在server1上搭建的Habbor私有仓库中上传busyboxplus的镜像,新建编辑资源清单文件init.yaml,设置生成主容器myapp-container前需要运行两个init初始化容器


2、读取资源清单创建pod,查看Pod信息可以在状态中看到两个初始化容器都未成功运行,每个init初始化容器必须成功运行并退出后,主容器才能成功运行,因此pod一直未就绪

3、编辑资源清单文件init.yaml,为两个init初始化容器构建资源模块

4、删除已有的pod,此时读取资源清单重新创建pod,查看Pod信息可以在状态中看到两个初始化容器陆续成功运行,接着pod就绪运行

3、探针

探针 是由 kubelet 对容器执行的定期诊断:

  • ExecAction:在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
  • TCPSocketAction:对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的。
  • HTTPGetAction:对指定的端口和路径上的容器的 IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于200且小于400,则诊断被认为是成功的。

每次探测都将获得以下三种结果之一:

  • 成功:容器通过了诊断。
  • 失败:容器未通过诊断。
  • 未知:诊断失败,因此不会采取任何行动。

3.1、livenessProbe存活探针

livenessProbe存活探针:
指示容器是否正在运行。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其 重启策略的影响。如果容器不提供存活探针,则默认状态为 Success。

1、编辑资源清单文件pod.yaml,设置在生成pod时使用存活探针探测容器的8080端口是否开放,从而指示容器是否正在运行

2、读取资源清单创建pod,查看Pod信息可以在状态中看到新建的容器无法成功运行,这是因为我们在文件中指定使用myapp镜像创建容器,myapp容器默认开放的是80端口,8080端口不处于侦听状态,存活探针探测到后认为容器未在运行,k8s会杀死容器,并且容器将受到其重启策略的影响

3、编辑资源清单文件pod.yaml,设置在生成pod时使用存活探针探测容器的80端口是否开放

4、删除已有的pod,此时读取资源清单重新创建pod,查看Pod信息可以在状态中看到pod就绪并成功运行

查看pod的详细描述信息可以看到80端口开放

3.2、readinessProbe就绪探针

readinessProbe就绪探针:
指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默认状态为 Success。

1、编辑资源清单文件pod.yaml,设置在生成pod时使用就绪探针检测容器默认发布路径下是否有指定test.html文件,从而指示容器是否准备好服务请求

2、删除已有的pod,此时读取资源清单重新创建pod,查看Pod信息可以在状态中看到pod一直未就绪,但curl访问容器分配到的ip可以看到生成容器所使用的镜像的默认发布页面,这说明容器实际上已就绪

3、删除已有的pod,编辑资源清单文件pod.yaml,设置pod的标签labels为myapp,读取资源清单重新创建pod,查看标签设置成功


4、新建编辑服务资源清单svc.yaml,设置创建的服务为标签为myapp的Pod提供统一的对外访问接口,应用服务资源清单svc.yaml,service创建成功,但此时查看服务的详细信息发现该服务无后端pod,这是因为就绪探针持续运行,当容器没有就绪,svc不会暴露出去,没有能够提供访问的后端


5、连接进入pod,在容器默认发布路径下创建指定test.html文件,就绪探针检测到后指示容器就绪,此时查看服务的详细信息发现该服务有了后端pod

6、连接进入pod,在容器默认发布路径下删除test.html文件,查看Pod信息可以看到pod未就绪,再次查看服务的详细信息发现该服务无后端pod


当同时设置存活探针、就绪探针,先判断容器是否存活,再看是否就绪

3.3、startupProbe启动探针

startupProbe启动探针: 指示容器中的应用是否已经启动。如果提供了启动探测(startup probe),则禁用所有其他探测,直到它成功为止。如果启动探测失败,kubelet
将杀死容器,容器服从其重启策略进行重启。如果容器没有提供启动探测,则默认状态为成功Success。

实际中,为了防止存活探针误杀正在启动的容器,一般可以给容器配置一个启动探针,启动探针检测成功后才能继续执行存活检测。
比如可以进行如下配置:

startupProbe:
  httpGet:
    path: /test.html
    port: 80
  failureThreshold: 30
  periodSeconds: 10

该启动探针会每10s检测一次容器80端口,最多检测30次,若某次检测成功,则允许存活探针接管检测;若30次都没有检测成功,则重启容器。

以上是关于Linux企业运维——KubernetesPod生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Linux企业运维——KubernetesPod管理

老男孩linux实训学生入学资格考试题(技术部分)

Linux运维是怎样的一个工作

Linux企业运维——Kubernetesservice

Linux企业运维高效技巧心得及分享

Linux企业运维——Kubernetesingress服务