InitContainer用途:
1帮辟、Init 容器可以包含一些安裝過(guò)程中應(yīng)用容器中不存在的實(shí)用工具或個(gè)性化代碼旭绒;
2、Init 容器可以安全地運(yùn)行這些工具首昔,避免這些工具導(dǎo)致應(yīng)用鏡像的安全性降低;
3糙俗、Init容器可以以root身份運(yùn)行勒奇,執(zhí)行一些高權(quán)限命令;
4巧骚、Init容器相關(guān)操作執(zhí)行完成以后即退出赊颠,不會(huì)給業(yè)務(wù)容器帶來(lái)安全隱患。
初始化容器和PostStart區(qū)別
PostStart:依賴主應(yīng)用的環(huán)境劈彪,而且并不一定先于Command運(yùn)行竣蹦。
InitContainer:不依賴主應(yīng)用的環(huán)境,可以有更高的權(quán)限和更多的工具沧奴,一定會(huì)在主應(yīng)用啟動(dòng)之前完成痘括。
初始化容器和普通容器的區(qū)別
1、它們總是運(yùn)行到完成滔吠;
2纲菌、上一個(gè)運(yùn)行完成才會(huì)運(yùn)行下一個(gè);
3疮绷、如果 Pod 的 Init 容器失敗翰舌,Kubernetes 會(huì)不斷地重啟該 Pod,直到 Init 容器成功為止冬骚,但是Pod 對(duì)應(yīng)的 restartPolicy 值為 Never椅贱,Kubernetes 不會(huì)重新啟動(dòng) Pod。
4只冻、Init 容器不支持 lifecycle庇麦、livenessProbe、readinessProbe 和 startupProbe喜德。
示例:
注意:init容器修改或生成的配置山橄,必須用volume掛載到容器中
示例1:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: es-cluster
spec:
serviceName: elasticsearch
replicas: 3
selector:
matchLabels:
app: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
volumes:
- name: data
emptyDir: {}
initContainers:
- name: fix-permissions
image: busybox
command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
securityContext:
privileged: true
volumeMounts:
- name: data
mountPath: /usr/share/elasticsearch/data
- name: increase-vm-max-map
image: busybox
command: ["sysctl", "-w", "vm.max_map_count=262144"]
securityContext:
privileged: true
- name: increase-fd-ulimit
image: busybox
command: ["sh", "-c", "ulimit -n 65536"]
securityContext:
privileged: true
containers:
- name: elasticsearch
#image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.3
image: dotbalo/es:2.4.6-cluster
imagePullPolicy: Always
resources:
limits:
cpu: 1000m
requests:
cpu: 100m
ports:
- containerPort: 9200
name: rest
protocol: TCP
- containerPort: 9300
name: inter-node
protocol: TCP
volumeMounts:
- name: data
mountPath: /usr/share/elasticsearch/data
env:
- name: "cluster.name"
value: "pscm-cluster"
- name: "CLUSTER_NAME"
value: "pscm-cluster"
- name: "discovery.zen.minimum_master_nodes"
value: "2"
- name: "MINIMUM_MASTER_NODES"
value: "2"
- name: "node.name"
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: "NODE_NAME"
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: "discovery.zen.ping.unicast.hosts"
value: "es-cluster-0.elasticsearch, es-cluster-1.elasticsearch, es-cluster-2.elasticsearch"
#- name: ES_JAVA_OPTS
# value: "-Xms512m -Xmx512m"
示例2:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: test-init
name: test-init
namespace: kube-public
spec:
replicas: 1
selector:
matchLabels:
app: test-init
template:
metadata:
labels:
app: test-init
spec:
volumes:
- name: data
emptyDir: {}
initContainers:
- command:
- sh
- -c
- touch /mnt/test-init.txt
image: nginx
imagePullPolicy: IfNotPresent
name: init-touch
volumeMounts:
- name: data
mountPath: /mnt
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: test-init
volumeMounts:
- name: data
mountPath: /mnt
示例3:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: test-init
name: test-init
namespace: kube-public
spec:
replicas: 3
selector:
matchLabels:
app: test-init
template:
metadata:
labels:
app: test-init
spec:
volumes:
- name: data
emptyDir: {}
initContainers:
- command:
- sh
- -c
- touch /mnt/test-init.txt
image: nginx
imagePullPolicy: IfNotPresent
name: init-touch
volumeMounts:
- name: data
mountPath: /mnt
- command:
- sh
- -c
- for i in `seq 1 100`; do echo $i; sleep 1; done
image: nginx
imagePullPolicy: IfNotPresent
name: echo
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: test-init
volumeMounts:
- name: data
mountPath: /mnt