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 从不重启:无论容器以何种状态终止,都不重启
相关推荐
❀͜͡傀儡师3 小时前
Docker部署Kafka Native
docker·容器·kafka
乐之者v5 小时前
使用 Lens连接阿里云k8s集群
java·阿里云·kubernetes
可爱的小小小狼5 小时前
k8s中的kubelet
容器·kubernetes·kubelet
潮落拾贝5 小时前
k8s部署前后分离架构微服务——跨域和缓存问题
微服务·架构·kubernetes
z_y_j2299704385 小时前
服务器中使用Docker部署前端项目
服务器·前端·docker·容器
稚辉君.MCA_P8_Java6 小时前
DeepSeek Java 单例模式详解
java·spring boot·微服务·单例模式·kubernetes
小刘不想改BUG6 小时前
Docker 部署微服务项目详细步骤
docker·微服务·容器
橄榄熊6 小时前
Docker MySQL 使用全流程
mysql·docker·容器
野熊佩骑8 小时前
CentOS二进制安装包方式部署K8S集群之系统初始化
运维·docker·微服务·云原生·容器·kubernetes·centos