6. Sidecar 容器

0. 简介

边车(Sidecar)一般指的一种附有单轮的设备,加装在摩托车等车侧,而边车容器指的也是这种可以随时拆卸的容器。比如我们会经常在一个 Pod 中除了设置主程序容器外,一般还会搭载一些日志收集、服务治理、健康检查等容器,这些容器就可以称之为边车容器。

1. 一个 Pod 中运行两个容器

在 k8s 1.28版本之前,如果我们想要使用边车功能,基本上就是在一个 Pod 上部署多个容器,比如我们部门现有的日志收集就是采用这种方式,这里我们仿照同 Pod 内的容器使用共享卷通信中的镜像,写如下的 Deployment:

yaml 复制代码
kind: Deployment
apiVersion: apps/v1
metadata:
  name: two-containers
spec:
  selector:
    matchLabels:
      app: two-containers
  replicas: 1
  template:
    metadata:
      labels:
        app: two-containers
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: shared-data
          mountPath: /usr/share/nginx/html
      - name: debian
        image: debian
        volumeMounts:
        - name: shared-data
          mountPath: /pod-data
        command: ["/bin/sh","-c", "echo Hello from the debian container > /pod-data/index.html"]
      volumes:
      - name: shared-data
        emptyDir: {}

以上其实就是由debian容器写了Hello from the debian container到共享卷中,而一个 Pod 中的容器共享卷,nginx容器挂载目录/usr/share/nginx/html,所以这时候执行:

bash 复制代码
kubectl exec -it two-containers-65bfd6bc69-tqqcd -c nginx bash

可以进入nginx容器,然后执行以下命令,可以展示的确实是/usr/share/nginx/html/index.html的文件内容。

bash 复制代码
~ curl localhost
Hello from the debian container

一般而言,这种方式的边车容器,和工作负载容器没有任何权限上的差异,k8s 无法控制他们之间的启动顺序,且边车容器可能会在工作负载容器退出后阻止 Pod 终止。

不过也有牛逼的大佬在看了 k8s 源码之后提出了能够控制启动和退出顺序的方式,可参考Kubernetes中Sidecar生命周期管理

2. k8s 原生的边车容器

Kubernetes 1.28 在 Init 容器中添加了一个新的 restartPolicy 字段, 该字段在 SidecarContainers 特性门控启用时可用。

由于我的 kind 安装的 k8s 版本才 1.27,所以这里就不演示了,详情可以参考官方文档,和# 千呼万唤始出来的K8s Sidecar

相关推荐
Java之美1 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
java_cj8 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
qq_452396238 天前
第十三篇:《K8s 安全基础:RBAC、ServiceAccount、Pod Security》
java·安全·kubernetes
睡不醒男孩0308238 天前
云原生运维实战:高并发架构下的云原生可观测性、韧性降级与自动化干预体系
数据库·kubernetes·高并发·prometheus·devops·sre·缓存调优
qq_452396238 天前
第十四篇:《K8s 网络模型与 CNI 插件(Calico、Flannel、Cilium)》
网络·kubernetes·php
Hadoop_Liang8 天前
Kubernetes 应用 HTTPS 安全访问配置实践
https·kubernetes
java_cj8 天前
从0到1启动kube-apiserver:深入源码解析API Server启动全流程
docker·容器·kubernetes
Hadoop_Liang8 天前
使用Kubernetes Gateway API实现域名访问应用
容器·kubernetes·gateway
java_cj9 天前
深入kubectl create源码:从YAML到Pod的完整链路拆解
运维·云原生·容器·kubernetes