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
1万+

被折叠的 条评论
为什么被折叠?



