k8s 测试二 Pod Init
测试pod探测:init 模版:apiVersion: v1kind: Podmetadata:name: myapp-podlabels:app: myappspec:containers:- name: myapp-containerimage: busyboxcommand: ['sh','-c','echo ...
使用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容器的名称必须为宜;与任何其他容器共享同一个名称,会在验证时抛出错误
更多推荐
所有评论(0)