k8s-pod 实战三 (Liveness Probe 和 Readiness Probe 详细分析)

发布于:2024-09-05 ⋅ 阅读:(13) ⋅ 点赞:(0)

一、Liveness Probe 和 Readiness Probe 详细分析

Liveness Probe

Liveness Probe 用于检查容器是否处于健康状态。如果探针失败,Kubernetes 会杀死容器并根据重启策略决定是否重启。这对于检测和恢复应用程序中的死锁或其他致命错误非常有用。

Readiness Probe

Readiness Probe 用于检查容器是否准备好接受流量。如果探针失败,Kubernetes 会将该 Pod 从服务的负载均衡池中移除。这对于确保只有在完全准备好时才处理请求的应用程序非常有用,例如在依赖初始化或外部资源的情况下。

二、实战案例

案例场景

假设我们有一个 Web 应用程序,它有一个健康检查端点 /healthz 和一个就绪检查端点 /readyz。我们将使用 Liveness Probe 来检查应用程序的健康状态,并使用 Readiness Probe 来检查应用程序是否准备好处理请求。

1. 编写 YAML 配置文件

创建一个名为 web-app-pod.yaml 的文件,内容如下:

apiVersion: v1 # API 版本
kind: Pod # 资源类型
metadata:
  name: web-app-pod # Pod 的名称
spec:
  containers:
  - name: web-app # 容器名称
    image: my-web-app:latest # 容器镜像,假设这是你自己的 Web 应用程序镜像
    ports:
    - containerPort: 8080 # 容器端口
    livenessProbe: # 存活探针配置
      httpGet:
        path: /healthz # 探针要访问的 HTTP 路径
        port: 8080 # 探针要访问的端口
      initialDelaySeconds: 10 # 初始延迟时间,容器启动后等待 10 秒再进行探测
      periodSeconds: 10 # 探测周期,每隔 10 秒执行一次探测
      timeoutSeconds: 5 # 超时时间,如果在 5 秒内没有响应则认为探测失败
      failureThreshold: 3 # 失败阈值,连续失败 3 次才认为容器不健康
    readinessProbe: # 就绪探针配置
      httpGet:
        path: /readyz # 探针要访问的 HTTP 路径
        port: 8080 # 探针要访问的端口
      initialDelaySeconds: 10 # 初始延迟时间
      periodSeconds: 5 # 探测周期,每隔 5 秒执行一次探测
      timeoutSeconds: 3 # 超时时间
      failureThreshold: 3 # 失败阈值
2. 应用配置
kubectl apply -f web-app-pod.yaml # 应用 YAML 配置文件
3. 查看 Pod 状态
kubectl get pods # 获取所有 Pod 的状态
4. 描述 Pod 以获取探针的详细信息
kubectl describe pod web-app-pod # 获取指定 Pod 的详细信息
5. 查看 Pod 日志
kubectl logs web-app-pod # 查看指定 Pod 的日志

详细分析

Liveness Probe 配置
  • httpGet: 使用 HTTP GET 方法访问指定的路径和端口。
    • path/healthz 是健康检查的路径。
    • port: 8080 是容器的端口。
  • initialDelaySeconds: 容器启动后,等待 10 秒再进行第一次探测。这是为了确保容器在启动时有足够的时间完成初始化。
  • periodSeconds: 每隔 10 秒进行一次探测。
  • timeoutSeconds: 如果在 5 秒内没有响应,则认为探测失败。
  • failureThreshold: 连续失败 3 次才认为容器不健康。
Readiness Probe 配置
  • httpGet: 使用 HTTP GET 方法访问指定的路径和端口。
    • path/readyz 是就绪检查的路径。
    • port: 8080 是容器的端口。
  • initialDelaySeconds: 容器启动后,等待 10 秒再进行第一次探测。
  • periodSeconds: 每隔 5 秒进行一次探测。
  • timeoutSeconds: 如果在 3 秒内没有响应,则认为探测失败。
  • failureThreshold: 连续失败 3 次才认为容器不就绪。

三、实战案例扩展:更贴近实际生产环境

在生产环境中,Web 应用通常会依赖数据库和其他外部服务。我们可以通过 Readiness Probe 确保在这些依赖项可用之前,Pod 不会接受流量。

1. 编写扩展的 YAML 配置文件

假设我们的 Web 应用程序还依赖一个 PostgreSQL 数据库,并且我们需要确保数据库连接成功后才认为 Pod 就绪。

创建一个名为 web-app-pod-extended.yaml 的文件,内容如下:

apiVersion: v1 # API 版本
kind: Pod # 资源类型
metadata:
  name: web-app-pod # Pod 的名称
spec:
  containers:
  - name: web-app # 容器名称
    image: my-web-app:latest # 容器镜像,假设这是你自己的 Web 应用程序镜像
    ports:
    - containerPort: 8080 # 容器端口
    env:
    - name: DATABASE_URL # 数据库连接 URL
      value: "postgresql://user:password@db-host:5432/mydb"
    livenessProbe: # 存活探针配置
      httpGet:
        path: /healthz # 探针要访问的 HTTP 路径
        port: 8080 # 探针要访问的端口
      initialDelaySeconds: 10 # 初始延迟时间
      periodSeconds: 10 # 探测周期
      timeoutSeconds: 5 # 超时时间
      failureThreshold: 3 # 失败阈值
    readinessProbe: # 就绪探针配置
      exec:
        command:
        - /bin/sh
        - -c
        - "pg_isready -d $DATABASE_URL" # 在容器内执行的命令,检查数据库连接
      initialDelaySeconds: 10 # 初始延迟时间
      periodSeconds: 5 # 探测周期
      timeoutSeconds: 3 # 超时时间
      failureThreshold: 3 # 失败阈值
2. 应用配置
kubectl apply -f web-app-pod-extended.yaml # 应用 YAML 配置文件
3. 查看 Pod 状态
kubectl get pods # 获取所有 Pod 的状态
4. 描述 Pod 以获取探针的详细信息
kubectl describe pod web-app-pod # 获取指定 Pod 的详细信息
5. 查看 Pod 日志
kubectl logs web-app-pod # 查看指定 Pod 的日志

详细分析

Readiness Probe 配置扩展
  • exec: 使用命令探针在容器内执行命令。
    • command: 执行 pg_isready -d $DATABASE_URL 命令,检查数据库连接是否可用。
  • initialDelaySeconds: 容器启动后,等待 10 秒再进行第一次探测。
  • periodSeconds: 每隔 5 秒进行一次探测。
  • timeoutSeconds: 如果在 3 秒内没有响应,则认为探测失败。
  • failureThreshold: 连续失败 3 次才认为容器不就绪。

通过这些配置和实战案例,你可以掌握如何在 Kubernetes 中配置和使用 Liveness Probe 和 Readiness Probe,以确保你的应用在生产环境中的高可用性和健壮性。上述配置和命令带有详细注释,能够帮助你更好地理解每个字段的含义,使配置过程更加清晰和可控。


网站公告

今日签到

点亮在社区的每一天
去签到