持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情
initC容器样例
接下来我们来创建一个带有init容器的案例。
第一步:定义pod模板
init容器模板
apiVersion: v1
kind: Pod
metadata: #资源元数据
name: myapp-pod
labels:
app: myapp
spec: #期望的状态(disired state)
containers:
- name: myapp-container
image: busybox:latest
command: ['sh', '-c', 'echo The app is running! && sleep 3000']
initContainers:
- name: init-myservice
image: busybox:latest
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: busybox:latest
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
接下来来一点一点解析一下这个资源
apiVersion: v1 kind: Pod
这句话说明我要创建的是一个pod,所在的group目录是v1,这个可以通过explain查询到
kubectl explain pod
metadata: #资源元数据 name: myapp-pod labels: app: myapp
这里定义了元数据资源,当前这个pod 的名字是myapp-pod,并且定义了一个标签,key是app,value是myapp
spec: #期望的状态(disired state)
containers:
- name: myapp-container
image: busybox:latest
command: ['sh', '-c', 'echo The app is running! && sleep 3000']
initContainers:
- name: init-myservice
image: busybox:latest
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: busybox:latest
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
spec期望的状态这里面定义的内容比较多。
首先,定义了一个containers,这是应用容器。应用容器的名字是myapp-container。镜像使用的是busybox:latest。容器命令是打印一句话the app is running, 然后休眠3000秒。
第二,定义了初始化容器initContainers。初始化容器有两个:
- 第一个初始化容器名字叫init-myservice。使用的镜像是busybox:latest,执行的命令是无限循环寻找myservice,没找到,停留2s,然后继续找,直到找到为止,退出。
- 第二个初始化容器名字叫init-mydb。使用的竟像是busybox:lastest,执行的命令是无限循环寻找mydb,没找到,就停留2s,然后继续找,直到找到为止,退出。
第二步: 创建pod
我们在master上创建一个myapp-pod.yaml文件,并拷贝上述内容到文件里。
然后创建pod
kubectl create -f myapp-pod.yaml
第三步:查看刚刚创建的pod及分析日志
kubectl get pod
如上图,我们看到pod的状态:
- Ready是0/1, 因为有一个应用容器,现在已经准备好了0个,所以是0/1,
- status是Init:0/2,这个表示的是当前正在执行的是init阶段。一共有两个init容器,已经执行完0个Init容器。
我们之前说过,应用容器会在所有init容器执行完之后才执行,现在init容器一个都没有执行,所以应用容器在等待。init容器为啥没执行呢?来看看日志:
kubectl logs myapp-pod -c init-myservice
日志显示,连接超时。因为我们还没有myservice这个资源。然后init会不断的重试。
接下来我们来看看myapp-pod的事件描述
kubectl describe pod myapp-pod
我们看到myapp-pod这个pod已经启动了,也就是已经准备就绪了,但是还没有运行,通过pod的ready状态也可以看出来。原因就是在等待init就位。
其实初始化容器也是一个容器,我们通过docker ps来看看这个容器
docker ps
在node2节点上,我们找到了init-myservice容器,他一直启动着。
第四步:创建myservice
下面我们创建myservice资源。这是一个service,不理解没关系,直接copy就好.
myService
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 80
执行启动命令
kubectl create -f myservice.yaml
service和pod关联是通过label进行关联的, 所以,直接service关联的label和pod的一样,他们就可以匹配成功
等一会,service已经启动起来了,可以通过命令查看
kubectl get svc
这时在看myapp-pod的状态。
kubectl get pod
这时发现,Init容器变成了1/2,表示有一个已经成功了.
第五步:创建mydb
mydb
apiVersion: v1
kind: Service
metadata:
name: mydb
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 80
创建mydb service
kubectl create -f mydb.yaml
然后等待,这时看到Init容器变成了2/2,表示两个都已经成功了。
此时pod的状态是running状态。
\