在启动主容器之前还存在一个初始化容器(init containers
)。初始化容器的特点在于其若是启动失败,后续的主容器将不会执行。
初始化容器可以存在多个,他们之间依次执行,当多有初始化容器执行完毕后,主容器开始执行。
在之前post start hook
示例中,由于需要将送往8080的请求转发给80端口,不得不给主容器授予特权级别,用来让其在postStart
中执行iptables
规则,但是规则执行完毕后,主容器依旧拥有特权操作的权限,这种操作是不合理的。
所以我们可以将需要执行特权级别的操作放到初始化容器中,当初始化容器执行完毕就退出。免得主容器一直拥有特殊权限。
初始化容器示例
1.编写配置清单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| root@k8s-master01:~/yaml/chapter04 apiVersion: v1 kind: Pod metadata: name: init-container-demo namespace: default spec: initContainers: - name: iptables-init image: ikubernetes/admin-box:latest imagePullPolicy: IfNotPresent command: ['/bin/sh','-c'] args: ['iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80'] securityContext: capabilities: add: - NET_ADMIN containers: - name: demoapp image: ikubernetes/demoapp:v1.0 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80
|
2.应用配置清单
1 2 3 4 5 6
| root@k8s-master01:~/yaml/chapter04 pod/init-container-demo created
root@k8s-master01:~/yaml/chapter04 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES init-container-demo 1/1 Running 0 60s 10.244.3.20 k8s-node03 <none> <none>
|
3.测试
1 2 3 4 5 6 7 8 9 10
| root@k8s-master01:~/yaml/chapter04 Defaulted container "demoapp" out of: demoapp, iptables-init (init) iptables v1.8.3 (legacy): can't initialize iptables table `nat': Permission denied (you must be root) Perhaps iptables or your kernel needs to be upgraded. command terminated with exit code 3
root@k8s-master01:~/yaml/chapter04 iKubernetes demoapp v1.0 !! ClientIP: 10.244.0.0, ServerName: init-container-demo, ServerIP: 10.244.3.20!
|