K8s InitContainer初始化容器
3、如果Pod的Init容器失败,Kubernetes会不断地重启该Pod,直到Init容器成功为止,但是Pod对应的restartPolicy值为Never,kubernetes不会重新启动Pod。InitContainer: 不依赖主应用的环境,可以有更高的权限和更多的工具,一定会在主应用启动之前完成。Init 容器可以包含一些在普通容器中不存在的实用工具或个性化代码替代运行。Init 容器可
记得关注一下博主,博主每天都会更新IT技术,让你有意想不到的小收获哦^_^
文章目录
提示:kubernetes 官网InitContainer初始化容器说明文档:https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
在 Kubernetes (K8s) 中,InitContainer 是一种特殊的容器,它在主容器(main container)启动之前运行。InitContainer 主要用于执行初始化任务,例如配置文件、权限调整、数据迁移等,确保主容器启动时所需的条件已经满足。
一、初始化容器的用途
Init 容器可以包含一些在普通容器中不存在的实用工具或个性化代码替代运行
Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低
Init容器可以以root身份运行,执行一些高权限命令
Init容器相关操作执行完成以后即退出,不会给业务容器带来安全隐患
二、Init容器、普通容器、PostStart区别
PostStart: 依赖主应用的环境,而且并不一定先于Command运行
InitContainer: 不依赖主应用的环境,可以有更高的权限和更多的工具,一定会在主应用启动之前完成
Init容器与普通容器非常相似,除了以下几点:
1、它们总是运行到成功完成为止
2、上一个运行成功完成之后才会运行下一个
3、如果Pod的Init容器失败,Kubernetes会不断地重启该Pod,直到Init容器成功为止,但是Pod对应的restartPolicy值为Never,kubernetes不会重新启动Pod
4、Init容器不支持lifecycle、livenessProbe、readinessProbe、startupProbe参数
三、案例一:通过Init初始化容器修改Nginx容器首页内容
### 创建Deployment(使用Volume emptyDir实现init容器与nginx容器目录共享)
mkdir -p /data/yaml/initcontainer
cat > /data/yaml/initcontainer/nginx-deploy.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deploy
name: nginx-deploy
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
initContainers:
- name: init-nginx-index
image: registry.cn-shenzhen.aliyuncs.com/dockerghost/busybox
imagePullPolicy: IfNotPresent
command:
- sh
- -c
- echo "Welcome to Nginx World" > /usr/share/nginx/html/index.html
volumeMounts:
- name: emptydir-volume
mountPath: /usr/share/nginx/html
containers:
- name: nginx
image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.26
volumeMounts:
- name: emptydir-volume
mountPath: /usr/share/nginx/html
volumes:
- name: emptydir-volume
emptyDir: {}
EOF
kubectl create -f /data/yaml/initcontainer/nginx-deploy.yaml
kubectl get pods -n default -owide
kubectl get pods -n default -oyaml
### 查看Nginx容器index.html首页是否已更改
kubectl get pods -n default -owide
kubectl exec -n default nginx-deploy-5894445769-crdp2 -c nginx -- cat /usr/share/nginx/html/index.html
curl 172.30.135.158
### 查看Deployment详细描述信息init初始化容器信息
kubectl describe pods -n default nginx-deploy-5894445769-crdp2
四、案例二:通过Init初始化容器收集Pod中容器服务日志
### 创建Deployment(使用Volume emptyDir实现init容器与nginx容器目录共享)
mkdir -p /data/yaml/initcontainer
cat > /data/yaml/initcontainer/collect-log.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.15-alpine
command: ['sh', '-c', 'while true; do echo "logging" >> /opt/logs.txt; sleep 1; done']
volumeMounts:
- name: data
mountPath: /opt
initContainers:
- name: logshipper
image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.15-alpine
restartPolicy: Always
command: ['sh', '-c', 'tail -F /opt/logs.txt']
volumeMounts:
- name: data
mountPath: /opt
volumes:
- name: data
emptyDir: {}
EOF
kubectl create -f /data/yaml/initcontainer/collect-log.yaml
kubectl get deploy -n default
kubectl get pods -n default
### 查看Pod详细描述
kubectl get pods -n defaul
kubectl describe pods -n default myapp-659fb7bf74-zzszf
### 通过init初始容器查看应用容器的日志
kubectl logs -f myapp-659fb7bf74-zzszf -c logshipper
更多推荐
所有评论(0)