书籍来源:《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》
一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:Kubernetes认证考试自学系列 | 汇总_COCOgsta的博客-CSDN博客
5.4.1 了解初始化容器
运行容器C1之前需要做一些准备工作,容器C1才能正常工作,那么在运行容器C1之前可以先运行容器A、容器B等做一些准备工作。先把这些准备工作做完,再运行容器C1,就可以把容器A和容器B配置成容器C1的初始化容器。只有所有的初始化容器全部正确运行完毕,普通容器C1容器才能运行,如图5-10所示。
如果任一初始化容器运行失败,则普通容器C1不会运行。如果定义了多个初始化容器,一旦某个初始化容器执行失败,则后续的初始化容器不再执行(在yaml文件里定义的先后顺序)。
初始化容器在initContainers里定义,它和containers是对齐的。
5.4.2 第一个初始化容器的例子
这个例子实现的是通过初始化容器修改物理机的内核参数。
步骤1:创建初始化容器用的yaml文件podinit.yaml,内容如下。
[root@vms10 pod]# cat podinit.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: pod3
name: pod3
spec:
containers:
- image: nginx
name: c1
imagePullPolicy: IfNotPresent
resources: {}
initContainers:
- image: docker.io/alpine:latest
name: xx
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c", "/sbin/sysctl -w vm.swappiness=10"]
securityContext:
privileged: true
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
[root@vms10 pod]#
复制代码
这里定义的pod3里有两个容器,一个初始化容器xx和一个普通容器c1。在初始化容器里使的镜像是alpine,它运行起来之后是把内核参数vm.swappiness的值改为0。感觉上初始化容器xx修改的是自己的内核参数,其实就是修改此pod所在物理机的内核参数。
普通容器c1只有在初始化容器正确运行完毕并退出之后才会运行。
步骤2:先确定两台机器上swappiness的值。
[root@vms11 ~]# cat /proc/sys/vm/swappiness
30
[root@vms11 ~]#
[root@vms12 ~]# cat/proc/sys/vm/swappiness
30
[root@vms12 ~]#
复制代码
步骤3:创建初始化pod。
[root@vms10 pod]# kubectl apply -f podinit.yaml
pod/pod3 created
[root@vms10 pod]#
复制代码
步骤4:查看pod的运行状态。
[root@vms10 pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod3 0/1 PodInitializing 0 2s
[root@vms10 pod]#
[root@vms10 pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod3 1/1 Running 0 4s
[root@vms10 pod]#
复制代码
现在pod已经正常运行了。
步骤5:查看pod是在哪台机器上运行的。
[root@vms10 pod]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE ...
pod3 1/1 Running 0 23s 10.244.14.15 vms12.rhce.cc ...
[root@vms10 pod]#
复制代码
pod是在vms12.rhce.cc上运行的。
步骤6:查看两台机器上swappiness的参数值。
[root@vms11 ~]# cat /proc/sys/vm/swappiness
30
[root@vms11 ~]#
[root@vms12 ~]# cat /proc/sys/vm/swappiness
10
[root@vms12 ~]#
复制代码
因为pod3是在vms12上运行的,所以初始化容器先修改vms12上的内核参数,修改成功之后再开始创建普通容器C1。最终看到vms12上的参数被修改了,vms11上的参数并没有被修改。
5.4.3 第二个初始化容器的例子
这个例子里演示了通过初始化容器和普通容器进行共享数据。
步骤1:创建第二个初始化pod的yaml文件initpod2.yaml,内容如下。
[root@vms10 pod]# cat initpod2.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp
labels:
app: myapp
spec:
volumes:
- name: workdir
emptyDir: {}
containers:
- name: podx
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: workdir
mountPath: "/xx" # 这里把workdir挂载到容器的/xx目录
initContainers:
- name: poda
image: busybox
imagePullPolicy: IfNotPresent
command: ['shxxx', '-c', 'touch /work-dir/aa.txt']
volumeMounts:
- name: workdir
mountPath: "/work-dir" # 这里把workdir挂载到容器的/work-dir目录
[root@vms10 pod]#
复制代码
这里创建一个名字为myapp的pod,在此pod里创建了一个名字为workdir的存储卷(卷存储后面会有专门章节讲述)。这里poda是初始化容器,它把存储卷workdir挂载到本容器的/work-dir目录里,然后在挂载点/work-dir里创建aa.txt,其实这个文件就是创建在存储卷workdir里的。
在普通容器podx里,会把存储卷workdir挂载到本容器的/xx里,访问/xx的时候实际上访问是存储卷workdir,这样在普通容器podx里应该是能看到/xx里面有aa.txt的。
但是我们看初始化容器里,shxxx这个命令应该是错误的,即初始化容器不能正确执行,则podx也是无法创建的。
步骤2:创建此pod。
[root@vms10 pod]# kubectl apply -f initpod2.yaml
pod/myapp created
[root@vms10 pod]#
复制代码
步骤3:查看pod的运行状态。
[root@vms10 pod]# kubectl get pods
NAME READY STATUS RESTART AGE
myapp 0/1 Init:0/1 0 0s
pod3 1/1 Running 0 55m
[root@vms10 pod]#
复制代码
可以看到,现在是正在创建初始化pod,因为初始化容器里的命令是错误的,所以初始化容器执行会报错,结果如下。
[root@vms10 pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp 0/1 Init:RunContainerError 0 4s
pod3 1/1 Running 0 55m
[root@vms10 pod]#
复制代码
步骤4:删除此pod。
[root@vms10 pod]# kubectl delete -f podinit2.yaml
pod "myapp" deleted
[root@vms10 pod]#
复制代码
步骤5:修改yaml文件,把command修改正确。
initContainers:
- name: poda
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'touch /work-dir/aa.txt']
volumeMounts:
- name: workdir
mountPath: "/work-dir"
复制代码
步骤6:再次创建pod。
[root@vms10 pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp 0/1 PodInitializing 0 2s
pod3 1/1 Running 0 55m
[root@vms10 pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp 1/1 Running 0 5s
pod3 1/1 Running 0 55m
复制代码
可以看到现在运行是正常的。
步骤7:查看myapp里podx里/xx的内容。
[root@vms10 pod]# kubectl exec myapp -c podx -- ls /xx
aa.txt
[root@vms10 pod]#
复制代码
步骤8:删除此pod。
[root@vms10 pod]# kubectl delete -f podinit2.yaml
pod "myapp" deleted
[root@vms10 pod]#