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

相关推荐
微刻时光1 分钟前
Docker部署Nginx
运维·nginx·docker·容器·经验
@东辰15 分钟前
【golang-技巧】-自定义k8s-operator-by kubebuilder
开发语言·golang·kubernetes
小安运维日记16 分钟前
CKA认证 | Day3 K8s管理应用生命周期(上)
运维·云原生·容器·kubernetes·云计算·k8s
陈小肚23 分钟前
k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储
docker·容器·kubernetes
小扳1 小时前
Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)
运维·spring boot·后端·mysql·spring cloud·docker·容器
politeboy2 小时前
关于k8s中镜像的服务端口被拒绝的问题
云原生·容器·kubernetes
weixin_438197382 小时前
K8S创建云主机配置docker仓库
linux·云原生·容器·eureka·kubernetes
皮锤打乌龟8 小时前
(干货)Jenkins使用kubernetes插件连接k8s的认证方式
运维·kubernetes·jenkins
南猿北者9 小时前
docker Network(网络)
网络·docker·容器
ggaofeng12 小时前
通过命令学习k8s
云原生·容器·kubernetes