一、什么是Init Container
Init Container就是用来做初始化工作的容器,可以是一个或者多个,如果有多个的话,这些容器会按定义的顺序依次执行,只有所有的Init Container执行完后,主容器才会被启动。我们知道一个Pod里面的所有容器是共享数据卷和网络命名空间的,所以Init Container里面产生的数据可以被主容器使用到的。
Init Container与应用容器本质上是一样的,但他们是仅运行一次就结束的任务,并且必须在成功执行完后,系统才能继续执行下一个容器
二、Init Container应用场景
- 等待其他量关联组件正确运行(例如solr启动先依赖zookeeper)
- 基于环境变量或配置模板生成配置文件
- 从远程数据库获取本地所需配置,或者将吱声注册到某个中央数据库中
- 下载相关依赖包,或者对系统进行一些预配置操作(可以用python或者bash对系统做初始化操作)
三、初始容器使用
cat > myapp.yaml << EFO
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;']
EFO
以上pod定义包含两个初始容器,第一个等待myservice
服务可用,第二个等待mydb
服务可用,这两个pod执行完成,应用容器开始执行
下面是myservice
和mydb
两个服务的yaml文件
cat > services.yaml << EFO
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
EFO
#------------------------#
cat > mydb.yaml << EFO
kind: Service
apiVersion: v1
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9377
EFO
分别构建这些pod、service:
# 1、首先构建myapp这个pod、
[root@k8s-master01 app]# kubectl create -f myapp.yaml
pod/myapp-pod created
# 2、查看状态,现在是不会创建成功的因为那2个servicer没初始化
[root@k8s-master01 app]# kubectl get -f myapp.yaml
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:ImagePullBackOff 0 11s
# 3、构建那2个servier
[root@k8s-master01 app]# kubectl create -f services.yaml
service/myservice created
[root@k8s-master01 app]# kubectl create -f mydb.yaml
service/mydb created
# 4、查看这2个svc
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mydb ClusterIP 10.96.15.77 <none> 80/TCP 38s
myservice ClusterIP 10.101.111.161 <none> 80/TCP 52s
# 5、查看pod是否构建完成,可以看到已经构建完成。
[root@k8s-master01 app]# kubectl get -f myapp.yaml
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 4m46s
# 这样查看也可以
[root@k8s-master01 app]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 6m46s