一、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 是容器的端口。
- path:
- initialDelaySeconds: 容器启动后,等待 10 秒再进行第一次探测。这是为了确保容器在启动时有足够的时间完成初始化。
- periodSeconds: 每隔 10 秒进行一次探测。
- timeoutSeconds: 如果在 5 秒内没有响应,则认为探测失败。
- failureThreshold: 连续失败 3 次才认为容器不健康。
Readiness Probe 配置
- httpGet: 使用 HTTP GET 方法访问指定的路径和端口。
- path:
/readyz
是就绪检查的路径。 - port: 8080 是容器的端口。
- path:
- 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
命令,检查数据库连接是否可用。
- command: 执行
- initialDelaySeconds: 容器启动后,等待 10 秒再进行第一次探测。
- periodSeconds: 每隔 5 秒进行一次探测。
- timeoutSeconds: 如果在 3 秒内没有响应,则认为探测失败。
- failureThreshold: 连续失败 3 次才认为容器不就绪。
通过这些配置和实战案例,你可以掌握如何在 Kubernetes 中配置和使用 Liveness Probe 和 Readiness Probe,以确保你的应用在生产环境中的高可用性和健壮性。上述配置和命令带有详细注释,能够帮助你更好地理解每个字段的含义,使配置过程更加清晰和可控。