加载中...

Kubernetes系列(三)--深入Pod


1. Pod配置文件详解

使用配置文件创建 Pod,编写 nginx-demo.yaml 内容如下:

apiVersion: v1 # api 文档版本
kind: Pod      # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata:      # Pod 相关的元数据,用于描述 Pod 的数据
  name: nginx-demo    # Pod 的名称
  labels:      # 定义 Pod 的标签
    type: app       # 自定义label标签,名字为 type,值为 app
    version: 1.0.0  # 自定义label标签,描述 Pod 版本号
  namespace: 'default'  # 命名空间的配置
spec:          # 期望 Pod 按照这里面的描述进行创建
  containers:       # 对于 Pod 中的容器描述
  - name: nginx     # 容器的名称
    image: nginx:latest    # 指定容器的镜像
    imagePullPolicy: IfNotPresent  # 镜像拉取策略:只有当本地不存在时才会拉取
    command:    # 指定容器启动时执行的命令: nginx -g 'daemon off;'
    - nginx
    - -g
    - 'daemon off;'
    ports:
    - name: http  # 端口名称
      containerPort: 80  # 描述容器内要暴漏什么端口
      protocol: TCP      # 描述该端口是基于哪种协议通信的
    env:          # 环境变量
    - name: USER         # 环境变量名称
      value: wuye        # 环境变量值
    resources:
      requests:   # 最少需要多少资源
        cpu: 100m        # 限制 cpu 最少使用 0.1 个核心(1000m等于一个cpu)
        memory: "100Mi"  # 限制内存最少使用100兆
      limits:     # 最多可以用多少资源
        cpu: 500m        # 限制 cpu 最多使用 0.5 个核心
        memory: "200Mi"  # 限制内存最多使用200兆
  restartPolicy: OnFailure  # 重启策略

文件编辑之后创建Pod:

kubectl create -f nginx-demo.yaml
kubectl describe po nginx-demo      # 查看容器描述信息
kubectl get po -o wide              # 查看 pod 状态

route -n   # 可以通过route命令查看路由表,如果没有route命令请安装net-tools

2. Pod探针

2.1 探针是什么

探针的概念:https://v1-31.docs.kubernetes.io/zh-cn/docs/concepts/configuration/liveness-readiness-startup-probes/

探针的使用:https://v1-31.docs.kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

在 Kubernetes(k8s)中,探针(Probes) 是确保容器化应用稳定运行的核心机制。它通过主动检测应用状态,自动执行故障恢复或流量管理,实现“自愈”能力。

Kubernetes 提供三种探针:

  1. 存活探针(Liveness Probe)livenessProbe
    检测应用是否“活着”。若失败,k8s会重启容器,适用于处理死锁或僵死进程。
  2. 就绪探针(Readiness Probe)readinessProbe
    判断应用是否“准备好”接收流量。若失败,从Service端点移除Pod,避免请求被转发到未就绪的实例。
  3. 启动探针(Startup Probe)startupProbe
    针对启动缓慢的应用,延迟其他探针的检查,确保初始化完成后再接受存活和就绪检查。

探针的优先级规则:

  • 启动探针(Startup Probe)优先级最高

    如果配置了启动探针,Kubernetes 会优先执行它,在启动探针成功之前,存活探针(Liveness)和就绪探针(Readiness)不会启动

    • 用途:为慢启动应用争取初始化时间,避免存活/就绪探针过早介入导致容器被误重启或拒绝流量。
  • 存活探针和就绪探针并行运行

    启动探针成功后,存活和就绪探针会独立并行执行,二者无优先级之分,但职责不同

    • 存活探针失败 → 重启容器。
    • 就绪探针失败 → 从 Service 摘除 Pod。

示例配置(YAML片段):

containers:
  - name: my-app
    livenessProbe:            # 应用存活探针
      httpGet:                # 探测方式,基于http请求探测
        path: /healthz
        port: 8080
      initialDelaySeconds: 5  # 等待5秒后开始检查
      failureThreshold: 3     # 失败多少次才算真正失败
      periodSeconds: 10       # 失败后间隔多少秒再次检测
      successThreshold: 1     # 请求多少次成功才算成功
      timeoutSeconds: 5       # 请求的超时时间
    readinessProbe:
      tcpSocket:
        port: 80
      periodSeconds: 10  # 每10秒检测一次

2.2 探针的使用

在上面已经介绍过了探针分为3种类型,用法是完全一致的,这里以启动探针 startupProbe 为例:

同样以前面写的 nginx-demo 为例,首先查看并删除已存在的pod:

kubectl get po   # 查看pod
kubectl delete po nginx-demo

修改 nginx-demo.yaml,添加启动探针startupProbe 配置,以下是部分片段:

spec:    # 期望 Pod 按照这里面的描述进行创建
  containers:       # 对于 Pod 中的容器描述
  - name: nginx     # 容器的名称
    image: nginx:latest    # 指定容器的镜像
    imagePullPolicy: IfNotPresent  # 镜像拉取策略:只有当本地不存在时才会拉取
    startupProbe:             # 使用启动探针
      httpGet:                # 探测方式:基于http请求探测
        path: /api/path
        port: 80
      initialDelaySeconds: 5  # 等待5秒后开始检查
      failureThreshold: 3     # 失败多少次才算真正失败
      periodSeconds: 10       # 失败后间隔多少秒再次检测
      successThreshold: 1     # 请求多少次成功才算成功
      timeoutSeconds: 5       # 请求的超时时间
    command:

启动并查看pod描述。

因为 nginx 中肯定是没有 /api/path 路由的,所以肯定是不成功的。这里只是为了熟悉探针的作用。如果想看成功的结果,把path改为path: /index.html 即可成功。

kubectl create -f nginx-demo.yaml
kubectl describe po nginx-demo

也可以尝试其它的检测方式:

tcpSocket:
  port: 80
exec:
  command:
  - sh
  - -c
  - "sleep 5; echo 'success' > /inited;"

# kubectl exec -it nginx-demo -c nginx -- cat /inited  # 查看写入的文件内容

3. Pod的生命周期

Pod的生命周期:https://v1-31.docs.kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-lifecycle/

容器的生命周期事件处理函数:https://v1-31.docs.kubernetes.io/zh-cn/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/

3.1 Pod的生命周期

Pod 生命周期核心阶段

Pod 是 Kubernetes 的最小调度单元,其生命周期分为以下几个关键阶段:

阶段 描述
Pending Pod 已被系统接受,但容器未完全创建(如镜像下载中、资源不足)。
Running Pod 已绑定到节点,所有容器已创建,至少一个容器在运行或正在启动/重启。
Succeeded 所有容器正常终止(退出码为0),且不再重启(常见于一次性任务 Pod)。
Failed 至少一个容器异常终止(非0退出码),且未被设置为自动重启。
Unknown 无法获取 Pod 状态(通常由节点失联导致)。

生命周期关键流程与组件

  1. 初始化阶段(Init Containers)

    • 作用:在应用容器启动前,执行初始化任务(如配置下载、依赖检查)。
    • 特点
      • 按顺序执行,前一个成功后才运行下一个。
      • 若任意 Init 容器失败,Pod 重启(根据 restartPolicy)。
    spec:
      initContainers:
        - name: init-db
          image: busybox
          command: ['sh', '-c', 'until nslookup db-service; do echo waiting; sleep 2; done']
  2. 主容器启动

    • 所有 Init 容器成功后,主容器并行启动。

    • 启动后钩子(PostStart):容器启动后立即执行(非阻塞)。

      lifecycle:
        postStart:
          exec:
            command: ['sh', '-c', 'echo "Container started" > /tmp/log']
  3. 健康检查阶段

    • 探针生效顺序
      1. 启动探针(Startup Probe):延迟存活/就绪探针,直到应用完成初始化。
      2. 存活探针(Liveness Probe):检测容器是否崩溃,失败则重启。
      3. 就绪探针(Readiness Probe):控制流量准入,失败则从 Service 摘除 Pod。
  4. 运行中状态

    • Pod 处于 Running 状态,持续响应探针检查。
    • 容器重启策略(restartPolicy)
      • Always(默认):容器退出即重启。
      • OnFailure:仅当非0退出码时重启。
      • Never:不重启。
  5. 终止阶段

    • 触发条件:手动删除、资源不足、节点故障等。

    • 终止流程

      1. 触发 PreStop 钩子(优雅关闭前的清理任务)。

        lifecycle:
          preStop:
            exec:
              command: ['sh', '-c', 'sleep 10; nginx -s quit']
      2. 发送 SIGTERM 信号 给容器,等待优雅终止(默认30秒)。

      3. 超时后强制终止(SIGKILL)。

3.2 生命周期事件应用示例

spec:
  terminationGracePeriodSeconds: 40 # 当 pod 被删除时,给这个 pod 宽限多长事件;默认30s
  containers:
  - name: nginx     # 容器的名称
    image: nginx:latest    # 指定容器的镜像
    imagePullPolicy: IfNotPresent  # 镜像拉取策略:只有当本地不存在时才会拉取
    lifecycle:    # 生命周期的配置
      postStart:  # 生命周期启动阶段做的事情,不一定在容器的 command 之前运行
        exec:
          command:
          - sh
          - -c
          - "echo '<h1>pre stop</h1>'> /usr/share/nginx/html/prestop.html"
      preStop:
        exec:
          command:
          - sh
          - -c
          - "sleep 50;echo 'sleep finished...'>> /usr/share/nginx/html/prestop.html"

文章作者: 无夜
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 无夜 !
评论
  目录