初始化容器
作者:互联网
初始化容器即应用程序的主容器启动之前要运行的容器,常用于为主容器执行一些预置操作,它们具有两种典型特征
- 初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么k8s需要重启它直到成功完成
- 每个初始化容器都必须按定义的顺序串行运行
- 如果pod对应的restartPolicy为never,它就不会重新启动
有不少场景都需要在应用容器启动之前进行部分初始化操作,例如,等待其他相关联组件服务可 用、基于环境变量或配置模板为应用程序生成配置文件、从配置中心获取配置等。初始化容器的典型应 用需求具体包含如下几种。
- 用于运行特定的工具程序,出于安全等方面的原因,这些程序不适于包含在主容器镜像中
- 提供主容器镜像中不具备的工具程序或自定义代码
- 为容器镜像的构建和部署人员提供了分离、独立工作的途径,使得它们不必协同起来制作单个镜像文件
- 初始化容器和主容器处于不同的文件系统视图中,因此可以分别安全地使用敏感数据,例如secrets资源
- 初始化容器要先于应用容器串行启动并运行完成,因此可用于延后应用容器的启动直至其依赖的条件得到满足
案例
准备镜像
docker pull busybox:1.32.0
docker pull nginx:1.17.10-alpine
initcpod.yml
apiVersion: v1
kind: Pod
metadata:
name: initcpod-test
labels:
app: initcpod-test
spec:
containers:
- name: initcpod-test
image: busybox:1.32.0
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.32.0
imagePullPolicy: IfNotPresent
command: [ 'sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;' ]
- name: init-mydb
image: busybox:1.32.0
command: [ 'sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;' ]
restartPolicy: Always
initcservice1.yml
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
selector:
app: myservice
ports:
- port: 80
targetPort: 9376
protocol: TCP
initcservice2.yml
apiVersion: v1
kind: Service
metadata:
name: mydb
spec:
selector:
app: mydb
ports:
- port: 80
targetPort: 9377
protocol: TCP
查看
先查看pod启动情况
kubectl get pods
详细查看pod启动情况
kubectl describe pod initcpod-test
查看initcpod-test中的第一个initContainer日志
kubectl logs myapp-pod -c init-myservice
运行init-myservice服务
kubectl apply -f initcservice1.yml
查看init-myservice服务运行情况
kubectl get svc
查看myapp-pod运行情况,需要耐心等一会,会发现pod的第一个init已经就绪
kubectl get pods
运行init-mydb服务
kubectl apply -f initcservice2.yml
查看init-myservice服务运行情况
kubectl get svc
查看myapp-pod运行情况,需要耐心等一会,会发现pod的两个init已经就绪,pod状态ready
kubectl get pod -w
标签:初始化,kubectl,容器,init,myservice,pod 来源: https://www.cnblogs.com/ltaodream/p/15317053.html