Kubernetes认证考试自学系列 | 初始化pod

书籍来源:《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]#

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/130600585