Pod 重启策略、探针及实现方式详解
在 Kubernetes 中,Pod 的重启策略和探针是确保应用高可用性和健壮性的重要机制。以下大纲将详细介绍 Pod 的重启策略、三种探针及其实现方式,并通过具体命令和实战案例帮助你更好地理解这些概念。
1. Pod 重启策略
Kubernetes 提供三种重启策略(Restart Policy),用于定义 Pod 中容器的重启行为:
- Always:默认策略,容器无论退出状态如何都会被重新启动。
- OnFailure:仅当容器以非零状态退出时才会重启。
- Never:容器不会被重启。
YAML 配置示例
apiVersion: v1 # API 版本
kind: Pod # 资源类型
metadata:
name: restart-policy-example # Pod 的名称
spec:
restartPolicy: OnFailure # 重启策略
containers:
- name: my-container # 容器名称
image: nginx # 容器镜像
2. Pod 的三种探针
探针(Probe)是 Kubernetes 用于检查容器运行状况的机制。有三种探针:
- 存活探针(Liveness Probe):确定容器是否处于健康状态。如果探针失败,Kubernetes 会杀死容器,并根据重启策略决定是否重启。
- 就绪探针(Readiness Probe):确定容器是否准备好接受流量。如果探针失败,Kubernetes 会将该 Pod 从服务的负载均衡池中移除。
- 启动探针(Startup Probe):用于检测容器是否启动完成。启动探针成功后,将替代存活探针。
探针的类型
- HTTP 探针:发送 HTTP GET 请求到容器的某个端点。
- TCP 探针:尝试打开一个 TCP 连接到容器的某个端口。
- 命令探针:在容器内执行命令,检查命令的退出状态。
3. Pod 探针的实现方式
HTTP 探针示例
apiVersion: v1 # API 版本
kind: Pod # 资源类型
metadata:
name: http-probe-example # Pod 的名称
spec:
containers:
- name: my-container # 容器名称
image: nginx # 容器镜像
livenessProbe: # 存活探针配置
httpGet:
path: /healthz # 探针要访问的 HTTP 路径
port: 80 # 探针要访问的端口
initialDelaySeconds: 3 # 初始延迟时间
periodSeconds: 3 # 探测周期
readinessProbe: # 就绪探针配置
httpGet:
path: /readiness # 探针要访问的 HTTP 路径
port: 80 # 探针要访问的端口
initialDelaySeconds: 3 # 初始延迟时间
periodSeconds: 3 # 探测周期
startupProbe: # 启动探针配置
httpGet:
path: /startup # 探针要访问的 HTTP 路径
port: 80 # 探针要访问的端口
initialDelaySeconds: 3 # 初始延迟时间
periodSeconds: 3 # 探测周期
TCP 探针示例
apiVersion: v1 # API 版本
kind: Pod # 资源类型
metadata:
name: tcp-probe-example # Pod 的名称
spec:
containers:
- name: my-container # 容器名称
image: nginx # 容器镜像
livenessProbe: # 存活探针配置
tcpSocket:
port: 80 # 探针要访问的端口
initialDelaySeconds: 3 # 初始延迟时间
periodSeconds: 3 # 探测周期
命令探针示例
apiVersion: v1 # API 版本
kind: Pod # 资源类型
metadata:
name: command-probe-example # Pod 的名称
spec:
containers:
- name: my-container # 容器名称
image: busybox # 容器镜像
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600 # 启动容器时执行的命令
livenessProbe: # 存活探针配置
exec:
command:
- cat
- /tmp/healthy # 在容器内执行的命令
initialDelaySeconds: 5 # 初始延迟时间
periodSeconds: 5 # 探测周期
实战案例
案例一:配置 HTTP 探针
1. 编写 YAML 配置文件
创建一个名为 http-probe-pod.yaml
的文件,内容如下:
apiVersion: v1 # API 版本
kind: Pod # 资源类型
metadata:
name: http-probe-pod # Pod 的名称
spec:
containers:
- name: web # 容器名称
image: nginx # 容器镜像
ports:
- containerPort: 80 # 容器端口
livenessProbe: # 存活探针配置
httpGet:
path: /healthz # 探针要访问的 HTTP 路径
port: 80 # 探针要访问的端口
initialDelaySeconds: 5 # 初始延迟时间
periodSeconds: 10 # 探测周期
readinessProbe: # 就绪探针配置
httpGet:
path: /readiness # 探针要访问的 HTTP 路径
port: 80 # 探针要访问的端口
initialDelaySeconds: 5 # 初始延迟时间
periodSeconds: 10 # 探测周期
2. 应用配置
kubectl apply -f http-probe-pod.yaml # 应用 YAML 配置文件
3. 查看 Pod 状态
kubectl get pods # 获取所有 Pod 的状态
4. 描述 Pod 以获取探针的详细信息
kubectl describe pod http-probe-pod # 获取指定 Pod 的详细信息
5. 查看 Pod 日志
kubectl logs http-probe-pod # 查看指定 Pod 的日志
案例二:配置 TCP 探针
1. 编写 YAML 配置文件
创建一个名为 tcp-probe-pod.yaml
的文件,内容如下:
apiVersion: v1 # API 版本
kind: Pod # 资源类型
metadata:
name: tcp-probe-pod # Pod 的名称
spec:
containers:
- name: web # 容器名称
image: nginx # 容器镜像
ports:
- containerPort: 80 # 容器端口
livenessProbe: # 存活探针配置
tcpSocket:
port: 80 # 探针要访问的端口
initialDelaySeconds: 5 # 初始延迟时间
periodSeconds: 10 # 探测周期
2. 应用配置
kubectl apply -f tcp-probe-pod.yaml # 应用 YAML 配置文件
3. 查看 Pod 状态
kubectl get pods # 获取所有 Pod 的状态
4. 描述 Pod 以获取探针的详细信息
kubectl describe pod tcp-probe-pod # 获取指定 Pod 的详细信息
5. 查看 Pod 日志
kubectl logs tcp-probe-pod # 查看指定 Pod 的日志
案例三:配置命令探针
1. 编写 YAML 配置文件
创建一个名为 command-probe-pod.yaml
的文件,内容如下:
apiVersion: v1 # API 版本
kind: Pod # 资源类型
metadata:
name: command-probe-pod # Pod 的名称
spec:
containers:
- name: busybox # 容器名称
image: busybox # 容器镜像
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600 # 启动容器时执行的命令
livenessProbe: # 存活探针配置
exec:
command:
- cat
- /tmp/healthy # 在容器内执行的命令
initialDelaySeconds: 5 # 初始延迟时间
periodSeconds: 5 # 探测周期
2. 应用配置
kubectl apply -f command-probe-pod.yaml # 应用 YAML 配置文件
3. 查看 Pod 状态
kubectl get pods # 获取所有 Pod 的状态
4. 描述 Pod 以获取探针的详细信息
kubectl describe pod command-probe-pod # 获取指定 Pod 的详细信息
5. 查看 Pod 日志
kubectl logs command-probe-pod # 查看指定 Pod 的日志
通过这三个实战案例,你可以掌握如何在 Kubernetes 中配置和使用不同类型的探针,以确保你的应用运行在最佳状态。上述配置和命令带有详细注释,能够帮助你更好地理解每个字段的含义,使配置过程更加清晰和可控。