当咱们在运用一个服务以前,一般会作一些初始化的工做,而这些工做通常只须要运行一次,成功后就再也不运行。为此kubernetes 引入了Init Container,用于在启动应用容器以前启动一个或多个“初始化”容器,完成应用容器的所需的预制条件。html
Init Containers与常规的容器很是相似,可是它一些独有的特征:nginx
Init Container 一般有以下应用方式:git
具体的应用场景示例:shell
这里定义一个nginx,在nginx容器启动前更改默认起始页面内容:api
apiVersion: v1 kind: Pod metadata: name: myapp-pod labels: app: myapp spec: initContainers: - name: init-myservice image: busybox command: ['sh', '-c', 'echo "this init-container test page" > /html/index.html'] volumeMounts: - name: index-dir mountPath: "/html" containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: index-dir mountPath: /usr/share/nginx/html volumes: - name: index-dir emptyDir: {}
建立容器后,能够看到,先执行初始化操做:安全
# kubectl get pod NAME READY STATUS RESTARTS AGE myapp-pod 0/1 Init:0/1 0 12s # 显示正在初始化: # kubectl get pod NAME READY STATUS RESTARTS AGE myapp-pod 0/1 PodInitializing 0 22s # kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE myapp-pod 1/1 Running 0 38s 10.2.74.5 10.0.0.3 #日志信息: # kubectl describe pod Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 29s default-scheduler Successfully assigned myapp-pod to 10.0.0.3 Normal SuccessfulMountVolume 29s kubelet, 10.0.0.3 MountVolume.SetUp succeeded for volume "index-dir" Normal SuccessfulMountVolume 29s kubelet, 10.0.0.3 MountVolume.SetUp succeeded for volume "default-token-hmvnc" Normal Pulling 28s kubelet, 10.0.0.3 pulling image "busybox" Normal Pulled 16s kubelet, 10.0.0.3 Successfully pulled image "busybox" Normal Created 16s kubelet, 10.0.0.3 Created container Normal Started 16s kubelet, 10.0.0.3 Started container Normal Pulling 15s kubelet, 10.0.0.3 pulling image "nginx" Normal Pulled 1s kubelet, 10.0.0.3 Successfully pulled image "nginx" Normal Created 1s kubelet, 10.0.0.3 Created container Normal Started 1s kubelet, 10.0.0.3 Started container
Pod中的每一个应用程序和Init Container的名称必须是惟一的; 任何Container与另外一个Container共享一个名称都会引起验证错误。服务器
在Pod从新启动时, init Container 将会从新运行,那么所执行的初始化操做也会再次执行,这就要求Init Container的操做是能够重复执行的。例如上面的示例中,在对挂载目录中文件的添加前,能够先判断文件是否已经存在的处理,来防止出错。
常见的Pod重启场景以下:markdown