使用init探测其他服务:

init 模版:

   

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
     app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox
    command: ['sh','-c','echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox
    command: ['sh','-c','until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
  - name: init-mydb
    image: busybox
    command: ['sh','-c','until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

单独运行无法成功init因为在等待myservice运行:

command: ['sh','-c','until nslookup myservice; do echo waiting for myservice;

 

此时运行 myservice:

kind: Service
apiVersion: v1
metadata:
  name: myservice
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

在查看pod

 等待运行mydb:

command: ['sh','-c','until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

此时运行mydb:

kind: Service
apiVersion: v1
metadata:
  name: mydb
spec:
  ports:
      - protocol: TCP
        port: 80
        targetPort: 9377

 查看svc:

查看pod:

成功启动。

 

Init:
    Pod能够具有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的init容器。
    init容器与普通的容器非常像,除了如下两点:
        Init容器总是运行到成功完成为止。
        每个Init容器都必须在下一个Init容器启动之前成功完成
    如果pod的Init容器失败,kubernetes 会不断地重启该Pod,直到Init容器成功为止。然而如果Pod对应的restartPilicy 为Never,它不会重新启动  
因为init容器具有与应用程序容器分离的单独镜像,所以它们启动相关代码具有如下优势:
    它们可以包含并运行实用工具,但是出于安全考虑,是不建议在应用程序容器镜像中包含着些实用工具的。
    它们可以包含使用工具和定制化代码来安装,但是不能出现在应用程序镜像中。例如,创建镜像没必要FROM另一个镜像,只需要在安装过程中使用类似sed、awk、python或dig这样的工具。
    应用程序镜像可以分离出创建和部署的角色,二没有必要联合它们构建一个单独的镜像。
    init容器使用 linux namespace,所以相对应用程序容器来说具有不同的文件系统视图。因此,它们能够具有访问Secret的权限,而应用程序容器则不能。
    它们必须在应用程序容器启动之前运行完成,而应用程序容器是并行运行的,所以init容器能够提供了一种简单的阻塞或延迟应用容器的启动的方法,直到满足了一组先决条件。

    特殊说明:
        在Pod启动过程,Init容器会按顺序在网络和数据卷初始化之后启动,每个容器必须在下一个容器启动之前成功推出
        如果由于运行时或失败推出,将导致容器启动失败,它会根据Pod的restartPilicy指定的策略进行重试。然而,如果Pod的restartPolicy设置为Always,Init容器失败时会使用RestartPilicy策略。
        在所有的Init容器没有成功之前,Pod将不会变成Ready状态。Init容器的端口将不会在Service中进行聚集。正在初始化中的Pod处于Pending状态,但应该会将Initializing状态设置为true。
        如果Pod重启,所有Init容器必须重新执行。
        对init容器spec的修改被限制在容器image字段,修改其他字段都不会生效。更改Init容器的image字段,等价于重启该Pod
        init容器具有应用容器的所有字段,除了readinessprobe,因为init容器无法定义不同与完成的就绪之外的其他状态。这会在验证过程中强制执行
        pod中的每个app和init容器的名称必须为宜;与任何其他容器共享同一个名称,会在验证时抛出错误

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐