Pod的初始化容器和健康检测-探针(Pod-2)

Pod 的初始化容器(init Containers)

Init Containers(初始化容器) 是在 Pod 的主容器(应用容器)启动之前运行的专用容器,用于完成主容器启动前需要的初始化工作。它们为应用容器提供了隔离的初始化环境,确保主容器启动时所有依赖条件都已满足。

 vim initc.yaml
 ---------------------------------------
 apiVersion: v1
 kind: Pod
 metadata:
   name: app-with-init
 spec:
   initContainers:
   - name: wait-for-db  # 第一个 Init Container:等待数据库服务
     image: 192.168.57.200:8099/library/busybox:latest
     command: ['sh', '-c', 'ls -lh']
   - name: fetch-config  # 第二个 Init Container:下载配置文件
     image: 192.168.57.200:8099/library/busybox:latest
     command: ['sh', '-c', 'pwd']
   containers:
   - name: app-main  # 主应用容器
     image: 192.168.57.200:8099/library/nginx:1.21
 ---------------------------------------
 # 应用修改后的配置文件
 # 执行以下命令创建包含初始化容器的 Pod:
 kubectl apply -f myapp-with-init.yaml
 # 如果提示 “已存在”,可先删除旧 Pod 再创建:
 kubectl delete pod myapp  # 删除旧 Pod(如有)
 # 查看 Pod 整体状态:
 kubectl get pod 
 ​
 ##若初始化容器正在运行,状态会显示 Init:0/1(表示 1 个初始化容器中,0 个已完成)。
 ##若初始化容器未完成(如等待 myservice),状态会显示 Init:0/1 并持续等待。
 ##当初始化容器成功完成后,状态会变为 Running(主容器启动)。
 ​
 # 如果kubectl describe pod显示是node节点的IP不匹配,可以在错误的那个节点上修改成新的IP
 systemctl stop kubelet
 ip addr add 10.244.3.1/24 dev cni0
 ip sddr del 10.244.2.1/24 dev cni0
 ip addr(查看是否修改成功)
 systemctl start kubelet
 # 然后回主节点查看kubectl get pod

Pod的健康检测-探针

三种探针:

  • livenessProbe:存活探针,检测容器是否正常,如果容器“卡死”则重启容器;

  • readinessProbe:就绪探针,检测容器中的服务是否正常使用,服务请求不正常,则将容器在Service endpoints移除,暂停流量转发;

  • startupProbe:启动探针,针对启动较慢的服务设置,延长等待时间,防止无限重启,等待超时则重启容器;

三种探针区别:

探针类型核心作用失败后果典型使用场景
存活探针(livenessProbe)判断容器是否“存活”(如进程是否卡死)触发容器重启(符合重启策略时)应用死锁、进程无响应
就绪探针(readinessProbe)判断容器是否“可用”(如服务是否启动完成、能处理请求)容器从Service endpoints中移除,流量不转发应用启动慢(如加载配置/数据)、依赖服务未就绪(如连不上数据库)
启动探针(startupProbe)给慢启动容器“兜底”,判断是否“启动完成”同存活探针,触发容器重启超大应用启动(如大数据组件、重型服务),避免存活探针误判重启

三种检测方式:

1.exec命令:在容器内执行某些命令,通过命令退出码判断状态(0=成功,非0=失败)。

  • 示例:执行cat /tmp/healthy,若文件存在则探针成功。

2.httpGet请求:向容器发送http请求,通过http状态码判断请求是否成功(2xx/3xx 表示成功,> 400 则表示请求失败)。

  • 示例:访问http://localhost:8080/actuator/health(Spring Boot健康检查接口)。

3.tcpSocket检查:通过TCP检测,尝试与容器内的指定IP、端口建立TCP连接,连接成功=探针成功

  • 示例:检查容器的80端口是否能正常建立连接(适用于非HTTP服务,如MySQL、Redis)。

关键配置参数:避免探针误判的核心

配置探针时,需合理设置以下参数,防止因“检测时机不当”导致误判:

  • initialDelaySeconds:容器启动后,延迟多久开始第一次探针检查(单位:秒)。

    • 示例:启动慢的应用设为30秒,避免启动中被误判为失败。

  • periodSeconds:探针检查的周期(单位:秒),默认10秒。

  • failureThreshold:连续失败多少次后,判定为探针失败(默认3次)。

  • successThreshold:探针失败后,连续成功多少次后,恢复为成功状态(默认1次)。

 ### 配置存活探针
 # 通过httpget请求来配置存活探针

 vim 02-livenessProde.yaml
 apiVersion: v1
 kind: Pod
 metadata:
   name: liveness-httpget-pod
 spec:
   containers:
   - name: liveness-httpget-container
     image: 192.168.57.200:8099/library/nginx:1.21
     imagePullPolicy: IfNotPresent
     ports:
     - name: http
       containerPort: 80
     livenessProbe:
       httpGet:
         port: http
         path: /index.html
       initialDelaySeconds: 5
       periodSeconds: 3
       timeoutSeconds: 10
 # 通过tcpsocket配置存活探针
 vim 07-livenessProbe-tcp.yaml 
 apiVersion: v1
 kind: Pod
 metadata:
   name: livenessprobe-tcp
 spec:
   containers:
   - name: nginx
     image: 192.168.57.200:8099/library/nginx:1.21
     livenessProbe:
       initialDelaySeconds: 5
       timeoutSeconds: 1
       tcpSocket:
         port: 80
 # 通过tcpsocket配置存活探针
 vim 08-livenessProbe-exec.yaml
 apiVersion: v1
 kind: Pod
 metadata:
   name: liveness-exec-pod
 spec:
   containers:
   - name: liveness-exec-container
     image: 192.168.57.200:8099/library/nginx:1.21
     imagePullPolicy: IfNotPresent
     livenessProbe:
       exec:
         # 检测nginx默认页面是否存在(若存在则返回0,代表容器存活)
         command: ["ls", "-l", "/usr/share/nginx/html/index.html"]
       initialDelaySeconds: 30  # 容器启动后30秒开始检测
       periodSeconds: 10        # 每10秒检测一次

 ### 配置就绪探针
 vim 03-readinessProbe.yaml
 apiVersion: v1
 kind: Pod
 metadata:
   name: readiness-httpget-pod
 spec:
   containers:
   - name: readiness-httpget-container
     image: 192.168.57.200:8099/library/nginx:1.21
     imagePullPolicy: IfNotPresent
     ports:
     - name: http
       containerPort: 80
     readinessProbe:
       httpGet:
         path: /index.html
         port: http
       initialDelaySeconds: 20
       periodSeconds: 5
       timeoutSeconds: 10

# 配置启动探针
 vim 09-startupProbe.yaml
 apiVersion: v1
 kind: Pod
 metadata:
   name: startupprobe-httpget-pod
 spec:
   containers:
   - name: startupprobe-httpget-container
     image: 192.168.57.200:8099/library/nginx:1.21
     imagePullPolicy: IfNotPresent
     ports:
     - name: http
       containerPort: 80
     startupProbe:
       httpGet:
         path: /index.html
         port: http  # 这里引用了ports中定义的name: http,等价于port: 80,没问题
       initialDelaySeconds: 20  # 启动后20秒开始检测(可根据实际启动速度调整,nginx可缩短至5-10秒)
       periodSeconds: 5         # 每5秒检测一次
       timeoutSeconds: 10       # 单次超时10秒,合理
       failureThreshold: 10     # 允许最多10次失败(总容忍时间:10次 × 5秒 = 50秒,加上initialDelay共70秒)
 # 不管是哪种方法,最后做完都要应用更新一下
 kubectl apply -f yaml文件名
 # 查看状态
 kubectl get pod
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值