ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # Init 容器 ## 介绍 简单一句话,就是init容器成功启动,应用Pod才能开始启动 如比: * 数据库启动完成后,才能开始启动应用 * 在init容器中,根据需要生成配置文件,然后在主应用pod中启动应用 (除非Pod的`restartPolicy`设置为`Never`,就不会被重启) ## 示例 ### 创建Init Pod ~~~ 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;'] ~~~ 运行yaml文件后,观察Pod,此时正处于`Init`状态 ![](https://img.kancloud.cn/9c/23/9c235ecff8b05063d64439ca9ca04634_423x103.png) 这是因为在Pod的`spec`字段中,定义了`initContainers`部分,在Pod启动中,会首先执行`command`中的命令,监听能不能正常解析`init-myservice`和`init-mydb`这两个服务,之后执行成功返回后,Pod才会正常启动。 查看myapp-pod的log日志 (init容器中的信息用describe是不能打印出来的) ~~~ kubectl log pod myapp-pod --container=init-myservice kubectl log pod myapp-pod --container=init-mydb ~~~ ![](https://img.kancloud.cn/e7/52/e75237264e73f04d58eb9926c6d3bfd9_498x157.png) ### 创建init所需要的服务 ~~~ apiVersion: v1 kind: Service metadata: name: myservice spec: ports: - protocol: TCP port: 80 targetPort: 9376 --- apiVersion: v1 kind: Service metadata: name: mydb spec: ports: - protocol: TCP port: 80 targetPort: 9377 ~~~ ![](https://img.kancloud.cn/55/96/5596aca3c15f5d65f1535c09b23cfd26_607x181.png) 添加service服务后,再次查看Pod运行情况 ![](https://img.kancloud.cn/5a/ed/5aedfa3798b57fdf098dfa46c08cdd6c_401x96.png) ## 额外回顾 当不同的namespace之前,DNS要相互访问的话,需要使用DNS完整全域名访问 在上面的实例中,Pod中定义的init容易所检测的service服务, ~~~ nslookup myservice nslookup mydb # 循环检测DNS解析 ~~~ 这个DNS名称只能用于用同一个namespaces,如果不在同一个命名空间将不能正常解析服务。 想要不通namespaces之间访问,需要使用全称,改成如下的样子 ..svc. ~~~ #如果服务在kube-system命名空间 nslookup myservice.kube-system.svc.cluster.local nslookup mydb.kube-system.svc.cluster.local ~~~