k8s-pod 实战二 (Pod 重启策略、探针及实现方式详解)

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 中配置和使用不同类型的探针,以确保你的应用运行在最佳状态。上述配置和命令带有详细注释,能够帮助你更好地理解每个字段的含义,使配置过程更加清晰和可控。

相关推荐
蜜獾云26 分钟前
docker 安装雷池WAF防火墙 守护Web服务器
linux·运维·服务器·网络·网络安全·docker·容器
年薪丰厚2 小时前
如何在K8S集群中查看和操作Pod内的文件?
docker·云原生·容器·kubernetes·k8s·container
zhangj11252 小时前
K8S Ingress 服务配置步骤说明
云原生·容器·kubernetes
岁月变迁呀2 小时前
kubeadm搭建k8s集群
云原生·容器·kubernetes
墨水\\2 小时前
二进制部署k8s
云原生·容器·kubernetes
Source、2 小时前
k8s-metrics-server
云原生·容器·kubernetes
上海运维Q先生2 小时前
面试题整理15----K8s常见的网络插件有哪些
运维·网络·kubernetes
颜淡慕潇2 小时前
【K8S问题系列 |19 】如何解决 Pod 无法挂载 PVC问题
后端·云原生·容器·kubernetes
ProtonBase2 小时前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
大熊程序猿4 小时前
K8s证书过期
云原生·容器·kubernetes