您的位置 首页 k8s

InitC容器探测依赖服务的YAML

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

白眉大叔

关于白眉大叔linux云计算: 白眉大叔

热门文章