Kubernetes探针实战和生命周期

让从节点也可以使用kubectl

bash 复制代码
# 1. 将 master 节点中 /etc/kubernetes/admin.conf 拷贝到需要运行的服务器的 /etc/kubernetes 目录中

[root@master01 ~]# scp /etc/kubernetes/admin.conf node1:/etc/kubernetes/admin.conf
admin.conf                                                                                       100% 5565     6.9MB/s   00:00    


# 2. 在对应的服务器上配置环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

深入Pod

使用 YAML 文件创建 Nginx

1. 编写 Pod YAML 文件
bash 复制代码
[root@master01 pods]# cat nginx-demo.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-demo
  labels: 
    type: nginx-demo
    version: v1
spec:
  containers:
    - name: nginx
      image: nginx:latest
      imagePullPolicy: IfNotPresent
      command:
        - nginx
        - -g
        - 'daemon off;'
      ports: 
        - name: http
          containerPort: 80
      resources:
        requests:
          cpu: 100m
          memory: 128Mi
        limits:
          cpu: 200m
          memory: 256Mi
2. 执行创建命令
bash 复制代码
# 创建Pod
kubectl apply -f nginx-demo.yaml

# 查看Pod状态(等待状态变为Running)
kubectl get pods nginx-demo

# 查看Pod详细信息(排查问题用)
kubectl describe pod nginx-demo

kubectl exec -it nginx-demo /bin/bash

这条命令的本质是进入 Kubernetes 集群中名为 nginx-demo 的 Pod 内部,打开一个交互式的 Bash 终端,让你可以像操作本地服务器一样,在 Pod 里执行命令、查看文件、调试程序。
bash 复制代码
1使用describe
[root@node01 kubernetes]# kubectl describe pod nginx-demo|grep 'IP'
IP:           10.244.1.4
IPs:
  IP:  10.244.1.4

2使用 kubectl get pod nginx-demo -o wide
[root@node01 kubernetes]# kubectl get pod nginx-demo -o wide
NAME         READY   STATUS    RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
nginx-demo   1/1     Running   1          4h57m   10.244.1.4   node01   <none>           <none>

探针

一、探针类型

类型 用途
StartupProbe 检测容器内应用是否完成启动,启动完成后才会执行存活 / 就绪探针
LivenessProbe 检测容器是否 "存活",若失败则触发容器重启
ReadinessProbe 检测容器是否 "就绪"(可接收流量),若失败则从服务负载均衡中移除该容器

当配置了 startupProbe 后,会先禁用其他探针,直到 startupProbe 成功后,其他探针才会继续,防止容器在启动阶段因存活探针失败而被无限重启

二、探测方式

方式 实现逻辑
ExecAction 在容器内执行指定命令,通过命令退出码(0 为成功)判断状态
TCPSocketAction 尝试与容器的指定端口建立 TCP 连接,连接成功则状态正常
HTTPGetAction 向容器的指定 HTTP 接口发送 GET 请求,通过响应状态码(200-399 为成功)判断状态
避坑要点
  • 避免执行耗时过长的命令(如大文件遍历),否则会因探测超时导致误判。
  • 确保命令的退出码严格符合规则(0 成功,非 0 失败),自定义脚本需显式返回退出码。

三· 探针的核心配置参数

参数名 配置值 具体含义
initialDelaySeconds 60 容器启动后,延迟 60 秒才执行第一次探针检测(避免应用未初始化就被探测)。
timeoutSeconds 2 单次探针检测的超时时间为 2 秒,若 2 秒内未得到探测结果,直接判定为失败。
periodSeconds 5 探针的检测间隔为 5 秒,即每次检测完成后,等待 5 秒再执行下一次检测。
successThreshold 1 连续1 次探测成功,就将容器状态判定为 "健康 / 就绪"(就绪探针专用,存活探针默认 1 且不可改)。
failureThreshold 2 连续2 次探测失败,就将容器状态判定为 "不健康 / 未就绪",触发后续动作(如重启容器、移除流量)。

启动指针的使用

Kubernetes Pod 配置示例(结合 startup/http、liveness/exec、readiness/tcp)

bash 复制代码
      startupProbe:
        # 探测方式:发送HTTP GET请求
        httpGet:
          # 探测的HTTP路径:Nginx默认首页
          path: /index.html
          # 探测的容器端口
          port: 80
        # 失败阈值:连续探测失败3次,判定启动失败并触发容器重启
        failureThreshold: 3
        # 探测间隔:每10秒执行一次探测
        periodSeconds: 10
        # 成功阈值:连续1次探测成功,即判定启动完成
        successThreshold: 1
        # 超时时间:单次探测请求超时时间为5秒,超时则判定为失败
        timeoutSeconds: 5
    
 
      # 存活探针配置块,检测Nginx进程是否存活
      livenessProbe:
        # 采用Exec命令方式探测
        exec:
          # 定义执行的命令数组
          command:
            # 执行进程查找命令pgrep
            - pgrep
            # 指定查找的进程名为nginx
            - nginx
        # 每次探测的间隔时间为5秒
        periodSeconds: 5
        # 连续探测失败2次则判定为进程异常
        failureThreshold: 2
        # 单次命令执行的超时时间为3秒
        timeoutSeconds: 3


      # 就绪探针配置块,检测80端口是否可接收流量
      readinessProbe:
        # 采用TCP端口连接方式探测
        tcpSocket:
          # 指定探测的容器端口为80
          port: 80
        # 每次探测的间隔时间为3秒
        periodSeconds: 3
        # 连续探测失败2次则标记为未就绪
        failureThreshold: 2
        # 单次TCP连接的超时时间为2秒
        timeoutSeconds: 2

Pod的生命周期

一、Pod 的基础:Pause 容器

  • 作用 :是每个 Pod 默认包含的 "根容器",负责:
    1. 维护 Pod 的网络命名空间(使 Pod 内所有容器共享同一 IP、端口等网络资源);
    2. 保持 Pod 的 "存活状态"(即使主容器异常退出,Pause 容器仍会维持 Pod 的存在)。

二、初始化阶段(Init Containers)

  • 执行逻辑 :Pod 启动后,会先按顺序运行0个或多个Init C(初始化容器)所有 Init 容器执行完成后,才会启动主容器
  • 典型用途
    1. 初始化环境(如创建目录、配置文件);
    2. 等待依赖服务就绪(如等待数据库启动);
    3. 拉取主容器所需的资源(如配置文件、依赖包)。

三、主容器(Main Container)的生命周期流程

1. 启动阶段
  • command:容器启动时执行的命令(替代容器镜像默认的启动命令)。
  • postStart 钩子函数
    • 触发时机:主容器启动后立即执行(无需等待容器内进程完全就绪)。
    • 用途:执行容器启动后的初始化操作(如注册服务到注册中心、初始化缓存)。
2. 运行阶段:探针(Probe)机制

Kubernetes 通过三类探针监控容器状态:

探针类型 作用 典型场景
Startup(启动探针) 检测容器内应用是否成功启动完成(仅在启动阶段生效)。 适用于启动慢的应用(如 Java 服务),避免其他探针过早检测导致误判。
Readiness(就绪探针) 检测容器是否可接收请求(若失败,Pod 会从服务的负载均衡列表中移除)。 应用启动后需加载配置 / 数据,加载完成前不接收流量。
Liveness(存活探针) 检测容器是否正常存活(若失败,按 Pod 的重启策略重启容器)。 应用进程死锁、无响应时,自动重启恢复。
3. 终止阶段
  • preStop 钩子函数
    • 触发时机:容器被销毁前执行(Kubernetes 会等待该钩子完成后,再发送停止信号)。
    • 用途:执行优雅终止操作(如关闭连接、持久化数据、从注册中心注销服务)。

四、生命周期管理的核心目的

通过 Init 容器、钩子函数、探针等机制,Kubernetes 实现了 Pod 的 **"可控启动、可靠运行、优雅终止"**,保证应用在分布式环境中的稳定性与可用性。

为容器配置生命周期钩子函数

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: nginx-demo
  labels: 
    type: nginx-demo
    version: v1
spec:
  # 1. 调宽限期到60秒(大于preStop的总执行时间,留冗余)
  terminationGracePeriodSeconds: 60  
  containers:
    - name: nginx
      image: nginx:latest
      imagePullPolicy: IfNotPresent
      # 2. 修正生命周期钩子:注释+逻辑+时间匹配
      lifecycle:  
        postStart:  # 容器启动后执行(修正注释和内容)
          exec:
            command:
              - sh
              - -c
              - "echo '<h1>PostStart: Nginx started!</h1>' > /usr/share/nginx/html/poststart.html"
        preStop:  # 容器终止前执行(优雅关闭+合理sleep)
          exec:
            command:
              - sh
              - -c
              - "nginx -s quit; sleep 40; echo 'sleep finished...' >> /usr/share/nginx/html/prestop.html"
      # 3. 规范command缩进(不影响运行,仅提升可读性)
      command:
        - nginx
        - -g
        - 'daemon off;'
      ports: 
        - name: http
          containerPort: 80
      resources:
        requests:
          cpu: 100m
          memory: 128Mi
        limits:
          cpu: 200m
          memory: 256Mi

这是我的个人学习笔记,主要用于记录自己对知识点的理解和梳理。由于目前仍在学习探索阶段,内容中难免存在理解偏差或表述疏漏,恳请各位大佬不吝赐教,多提宝贵意见~ 若有不同看法,欢迎理性交流探讨,感谢包容与指正!

相关推荐
时空自由民.2 小时前
SSH 免密连接服务器
运维·服务器·ssh
算法小菜鸟成长心得3 小时前
记录自己第一次将React 编写的前端部署到服务器,实现外网访问
服务器·前端·react.js
.小小陈.4 小时前
Linux高频基础实用指南:从文件操作到日志
linux·运维·服务器
Java.熵减码农10 小时前
解决Linux修改环境变量后导致登录循环进不去系统的问题
linux·运维·服务器
明天好,会的10 小时前
分形生成实验(五):人机协同破局--30万token揭示Actix-web状态管理的微妙边界
运维·服务器·前端
天骄t10 小时前
嵌入式系统与51单片机核心原理
linux·单片机·51单片机
猫头虎11 小时前
如何在浏览器里体验 Windows在线模拟器:2026最新在线windows模拟器资源合集与技术揭秘
运维·网络·windows·系统架构·开源·运维开发·开源软件
阿部多瑞 ABU11 小时前
`chenmo` —— 可编程元叙事引擎 V2.3+
linux·人工智能·python·ai写作
徐同保12 小时前
nginx转发,指向一个可以正常访问的网站
linux·服务器·nginx