k8s-pod的容器类型

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 从不重启:无论容器以何种状态终止,都不重启
相关推荐
Gogo81613 小时前
docker 容器
运维·docker·容器
一条懒鱼66613 小时前
K8S-Deployment资源对象
docker·容器·kubernetes
做运维的阿瑞13 小时前
K8s 1.28.2 + Containerd + CentOS7.9 集群部署
云原生·容器·kubernetes
曾经的三心草14 小时前
微服务的编程测评系统-修改登录逻辑为邮箱登录
微服务·云原生·架构
青春不流名14 小时前
docker build -t mytomcat:10.1-jdk17 -f Dockerfile-MyTomcat .
云原生·eureka
为什么要内卷,摆烂不香吗14 小时前
Dockerfile 与 Docker Compose 在 CI/CD 管道中的分工与配合方式
ci/cd·docker·容器
weixin_3077791314 小时前
医院症状收集应用安全架构设计:基于AWS SQS和SNS的数据保护解决方案
安全·云原生·架构·云计算·aws
启明真纳15 小时前
Longhorn-k8s存储
云原生·容器·kubernetes
saber_andlibert15 小时前
【docker】存储卷
docker·容器·eureka
-大头.15 小时前
Spring消息集成:从企业模式到云原生
java·spring·云原生