k8s(二):Pod
pod 是K8s中最小的可部署单元,用于容纳一个或多个容器。Pod为容器提供了一个共享的环境,包括网络命名空间、存储卷和IP地址。
Pod
pod 是K8s中最小的可部署单元,用于容纳一个或多个容器。Pod为容器提供了一个共享的环境,包括网络命名空间、存储卷和IP地址。
pod的阶段(phase)
-
Pending: Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间。
-
Running: Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。
-
Succeeded: Pod 中的所有容器都已成功终止,并且不会再重启。
-
Failed: Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。
-
Unknown: 因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。
Pod 生命周期详细解析:
1. 创建与调度阶段:
-
Pod 创建: 可通过定义 Pod 的 YAML 创建 Pod 对象。
apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: container-1 image: nginx
kubectl apply -f pod-definition.yaml
-
调度器考虑以下因素:
- 节点资源: 调度器检查节点的资源利用率,确保节点上有足够的 CPU、内存等资源来容纳 Pod。
- 节点亲和性和反亲和性: 用户可以通过配置亲和性和反亲和性规则,影响 Pod 被调度到哪个节点。
- Pod 亲和性和反亲和性: Pod 本身也可以定义与节点的亲和性和反亲和性规则。
- Pod 优先级: Pod 的优先级和调度器的优先级策略也会影响调度决策。
- 调度约束: 用户可以通过 PodSpec 中的
NodeSelector
字段设置调度约束,将 Pod 调度到具有特定标签的节点。
-
节点选择: 调度器选择一个满足调度约束和条件的节点,将 Pod 分配到该节点上。如果找不到合适的节点,Pod 将保持在未调度状态。
-
Pod 被接受: 选定的节点上的 Kubelet 接受 Pod,并开始初始化过程。
-
卷挂载: 一旦 Pod 被接受,Kubelet 开始挂载 Pod 所需的卷,以满足容器的存储需求。
2. 运行:
- 存在 Init 容器: 如果 Pod 的配置中定义了 Init 容器,kubelet 将按照顺序执行这些 Init 容器。每个 Init 容器负责执行一些初始化任务,例如加载配置、准备数据等。这些任务在主容器启动之前完成,确保主容器运行时具备所需的环境。
- Initialized 状态设置: 一旦所有 Init 容器成功完成,kubelet 将设置 Pod 的
Initialized
状态为 True。这表示 Pod 已经完成了初始化阶段,并且已经准备好开始运行主容器。
探针配置:
在 Pod 中定义探针是为了监控容器的健康状况。在上述提供的 YAML 示例中,定义了一个 readinessProbe
,该探针使用 HTTP GET 请求检查容器的 /health
路径是否可达。以下是该探针的配置细节:
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
httpGet
配置: 使用 HTTP GET 请求进行健康检查,检查路径为/health
,端口为 8080。initialDelaySeconds
: 探针将在容器启动后等待 5 秒钟再执行第一次检查。periodSeconds
: 探针将每隔 10 秒执行一次检查。
PodReadyToStartContainersCondition:
如果启用了 PodReadyToStartContainersCondition 特性门控,Kubelet 会通过 Pod 的 status.conditions
字段中的 PodReadyToStartContainers
状态来报告 Pod 是否达到了初始化里程碑。这个条件反映了 Pod 是否具备了运行容器的必要条件,例如 Init 容器的成功完成、网络的正确配置等。 PodReadyToStartContainersCondition 的设置为 True 表示 Pod 已经准备好开始运行容器。
3. 终止阶段:
-
体面终止过程: Pod 在终止时尝试以优雅的方式关闭容器,可以配置
terminationGracePeriodSeconds
。terminationGracePeriodSeconds: 30
-
Pod 的垃圾收集: PodGC 控制器监视已终止的 Pod,当数量超过阈值时,删除已终止的 Pod 防止资源泄露。
-
强制终止: 在需要立即删除 Pod 时,可以使用
kubectl delete
命令并设置宽限期为 0。kubectl delete pod example-pod --grace-period=0 --force
k8中的三种不同类型的探针
在 Kubernetes 中,探针(Probes)用于定期检查容器的健康状态,以确保容器能够正常运行。主要有三种类型的探针:livenessProbe
、readinessProbe
和 startupProbe
。
1. livenessProbe
存活探针:
-
目的: 指示容器是否仍在运行。
-
配置方式:
livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 periodSeconds: 10
exec
:使用指定的命令检查容器是否存活。如果命令成功执行(返回码为0),则认为容器存活。initialDelaySeconds
:容器启动后等待5秒再执行第一次检查。periodSeconds
:每隔10秒执行一次检查。
2. readinessProbe
就绪探针:
-
目的: 指示容器是否准备好接收流量。
-
配置方式:
readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 5 periodSeconds: 10
httpGet
:对容器的指定路径和端口执行 HTTP GET 请求,如果返回码在200到399之间,认为容器准备好接收流量。initialDelaySeconds
:容器启动后等待5秒再执行第一次检查。periodSeconds
:每隔10秒执行一次检查。
3. startupProbe
启动探针:
-
目的: 指示容器中的应用是否已经启动。
-
配置方式:
startupProbe: exec: command: - check-app-started.sh initialDelaySeconds: 10 periodSeconds: 5
exec
:使用指定的命令检查应用是否已经启动。如果命令成功执行,认为应用已经启动。initialDelaySeconds
:容器启动后等待10秒再执行第一次检查。periodSeconds
:每隔5秒执行一次检查。
更多推荐
所有评论(0)