初始化容器
#pod中有多个容器,容器a,依赖容器b,c,d, 需要b,c,d容器启动后,a容器才可以启动,其中有一个容器启动失败则pod启动失败,按规则进行重启
规则:
1、它们总是运行到完成。
2、每个都必须在下一个启动之前成功完成。
3、如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的
restartPolicy 为 Never,它不会重新启动。
4、Init 容器支持应用容器的全部字段和特性,但不支持 Readiness Probe,因为它们必须在 Pod 就绪之前运行完
成。
5、如果为一个 Pod 指定了多个 Init 容器,那些容器会按顺序一次运行一个。 每个 Init 容器必须运行成功,下一个
才能够运行。
6、因为 Init 容器可能会被重启、重试或者重新执行,所以 Init 容器的代码应该是幂等的。 特别地,被写到
EmptyDirs 中文件的代码,应该对输出文件可能已经存在做好准备。
7、在 Pod 上使用 activeDeadlineSeconds,在容器上使用 livenessProbe,这样能够避免 Init 容器一直失败。 这就
为 Init 容器活跃设置了一个期限。
8、在 Pod 中的每个 app 和 Init 容器的名称必须唯一;与任何其它容器共享同一个名称,会在验证时抛出错误。
9、对 Init 容器 spec 的修改,被限制在容器 image 字段中。 更改 Init 容器的 image 字段,等价于重启该 Pod
#举个例子,第一个容器创建了/xx文件夹,第二个容器在/xx中创建aa.txt文件:
#详细请见:https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
volumes:
- name: workdir
emptyDir: {}
containers:
- name: myapp-container
image: nginx
volumeMounts:
- name: workdir
mountPath: "/xx"
initContainers:
- name: init-poda
image: busybox
command: ['sh', '-c', 'touch /work-dir/aa.txt']
volumeMounts:
- name: workdir
mountPath: "/work-dir"
静态pod
#静态pod就是,不是master上创建的,而是需要到Node的/etc/kubelet.d/里创建一个yaml文件,然后根据这个yaml文件,创建一个pod,这样创建出来的node,是不会接受master的管理的。
#创建静态pod的yaml存放目录
mkdir /etc/static-pod
#查看kubelet启动脚本目录,找到 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
systemctl status kubelet -l
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf #添加参数 --pod-manifest-path
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=/etc/static-pod"
#创建静态pod的yaml文件
touch /etc/static-pod/static-pod.yaml
vim /etc/static-pod/static-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: static-web
labels:
role: myrole
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
#重启服务
systemctl daemon-reload
网友评论