Init容器探测依赖服务的YAML
registry.cn-hangzhou.aliyuncs.com/baimeidashu/k8s:busybox-1.37.0
registry.cn-hangzhou.aliyuncs.com/baimeidashu/bmds:nginx-1.28.0
示例 1:使用 nslookup 探测服务 DNS 是否解析
这个示例适用于探测依赖的服务(比如 MySQL、Redis)是否已经在集群中创建并生成了 DNS 记录。
原理解释:Init 容器会不断执行
nslookup 命令。如果依赖的服务还没创建,DNS 解析会失败,Init 容器就会一直循环并每隔 2 秒重试一次。一旦服务创建成功,DNS 解析通过,Init 容器就会以退出码 0 成功退出,主容器随之启动。apiVersion: v1
kind: Pod
metadata:
name: app-with-dependencies
spec:
# 初始化容器:负责探测依赖
initContainers:
- name: wait-for-mysql
image: busybox:1.36
command: ['sh', '-c', 'until nslookup mysql-service.default.svc.cluster.local; do echo waiting for mysql; sleep 2; done;']
- name: wait-for-redis
image: busybox:1.36
command: ['sh', '-c', 'until nslookup redis-service.default.svc.cluster.local; do echo waiting for redis; sleep 2; done;']
# 主容器:只有当上面的 init 容器全部成功后才会启动
containers:
- name: my-app
image: nginx
ports:
- containerPort: 80
示例 2:使用 nc (netcat) 探测服务端口是否连通
有时候服务虽然创建了,但内部进程可能还没完全启动(比如 MySQL 进程正在初始化数据)。这时直接探测 TCP 端口会更加稳妥。
原理解释:
nc -z 命令会尝试与指定的 IP 和端口建立 TCP 连接。只有当依赖服务的端口真正开始监听并接受连接时,命令才会成功,Init 容器才会退出。apiVersion: v1
kind: Pod
metadata:
name: web-app-with-db-check
spec:
initContainers:
- name: check-database-port
image: busybox:1.36
command: ['sh', '-c']
args:
- |
echo "Checking if database is ready..."
# -z 表示扫描模式,不发送数据;探测 postgres-svc 的 5432 端口
until nc -z postgres-svc 5432; do
echo "Database not ready, retrying in 3 seconds..."
sleep 3
done
echo "Database is up and running!"
containers:
- name: web-app
image: myregistry/web-app:latest
ports:
- containerPort: 8080
欢迎来撩 : 汇总all
