k8s-pod的容器类型
- [一、init 容器](#一、init 容器)
- [二、pause 容器](#二、pause 容器)
- [三、sidecar 容器](#三、sidecar 容器)
一、init 容器
初始化容器像常规应用容器一样,只有一点不同:初始化容器必须在应用容器启动前运行完成
yaml
[root@k8s-1 pod]# cat init.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app.kubernetes.io/name: MyApp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
由于集群中尚未创建 myservice 和 mydb 这两个 Service,导致 nslookup 失败,初始化容器会持续打印 waiting for myservice 并等待
bash
[root@k8s-1 pod]# kubectl apply -f init.yaml
pod/myapp-pod created
[root@k8s-1 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/2 0 6s
创建service
yaml
[root@k8s-1 pod]# cat service.yaml
---
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
---
apiVersion: v1
kind: Service
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9377
[root@k8s-1 pod]# kubectl apply -f service.yaml
service/myservice created
service/mydb created
[root@k8s-1 pod]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d1h
mydb ClusterIP 10.99.6.65 <none> 80/TCP 18s
myservice ClusterIP 10.109.68.252 <none> 80/TCP 18s
[root@k8s-1 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 7m2s
初始化容器检测到服务可用后完成初始化,主容器成功启动并进入运行状态
二、pause 容器
Pause 容器(也称为 "Infra 容器")是每个 Pod 中都会最先创建的一个特殊容器,它不运行任何业务逻辑,而是作为 Pod 中所有容器的 "基础容器",负责为整个 Pod 提供共享的网络命名空间和 PID 命名空间
docker ps 中可以看到很多的 "/pause"
三、sidecar 容器
像主容器的 "副驾驶",与主容器共享 Pod 的网络和存储,提供非业务性的辅助功能,且与主容器同时启动、同时退出
yaml
[root@k8s-1 pod]# cat sidecar-1.yaml
apiVersion: v1
kind: Pod
metadata:
name: counter
spec:
containers:
- name: count
image: busybox:1.28
args:
- /bin/sh
- -c
- >
i=0;
while true;
do
echo "$i: $(date)" >> /var/log/1.log;
echo "$(date) INFO $i" >> /var/log/2.log;
i=$((i+1));
sleep 1;
done
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- name: varlog
emptyDir: {}
创建仅包含主容器的pod
bash
[root@k8s-1 pod]# kubectl apply -f sidecar-1.yaml
pod/counter created
[root@k8s-1 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
counter 1/1 Running 0 11s
myapp-pod 1/1 Running 0 21m
# 验证
[root@k8s-1 pod]# kubectl exec -it counter -- sh
/ # cd /var/log
/var/log # ls
1.log 2.log
添加边车容器
yaml
[root@k8s-1 pod]# cat sidecar-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: counter
spec:
containers:
- name: count
image: busybox:1.28
args:
- /bin/sh
- -c
- >
i=0;
while true;
do
echo "$i: $(date)" >> /var/log/1.log;
echo "$(date) INFO $i" >> /var/log/2.log;
i=$((i+1));
sleep 1;
done
volumeMounts:
- name: varlog
mountPath: /var/log
- name: count-log-1
image: busybox:1.28
args: [/bin/sh, -c, 'tail -n+1 -F /var/log/1.log']
volumeMounts:
- name: varlog
mountPath: /var/log
- name: count-log-2
image: busybox:1.28
args: [/bin/sh, -c, 'tail -n+1 -F /var/log/2.log']
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- name: varlog
emptyDir: {}
验证功能
bash
[root@k8s-1 pod]# kubectl apply -f sidecar-2.yaml
The Pod "counter" is invalid: spec.containers: Forbidden: pod updates may not add or remove containers
[root@k8s-1 pod]# kubectl delete -f sidecar-1.yaml
pod "counter" deleted
[root@k8s-1 pod]# kubectl apply -f sidecar-2.yaml
pod/counter created
[root@k8s-1 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
counter 3/3 Running 0 28s
myapp-pod 1/1 Running 0 26m
[root@k8s-1 pod]# kubectl logs counter count-log-1
0: Thu Sep 18 08:52:35 UTC 2025
1: Thu Sep 18 08:52:36 UTC 2025
2: Thu Sep 18 08:52:37 UTC 2025
3: Thu Sep 18 08:52:38 UTC 2025
删除边车容器
删除整个 Pod 后,重新创建不包含该边车容器的新 Pod
或者强制删除
bash
[root@k8s-1 pod]# kubectl delete --grace-period=0 --force -f sidecar-2.yaml
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "counter" force deleted
容器重启策略(restartPolicy)
Always
总是重启:只要容器终止,就自动重启容器OnFailure
失败时重启:仅当容器异常终止(退出码非 0)时,才重启容器Never
从不重启:无论容器以何种状态终止,都不重启