Kubernetes的Sidecar模式

简介: Kubernetes的Sidecar模式

实践

apiVersion: v1
kind: Pod
metadata:
  name: test-sidecar
spec:
  volumes:
    - name: share-path
      emptyDir: {}
  containers:
  - name: sidecar
    image: busybox
    command: ["/bin/sh", "-c", "sleep 3600"]
    volumeMounts:
    - name: share-path
      mountPath: /var/share/sidecar
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "sleep 20"]
  - name: main
    image: busybox
    command: ["/bin/sh", "-c", "sleep 6666"]
    volumeMounts:
    - name: share-path
      mountPath: /var/share/main

创建日志

在多个容器的Pod中,通常业务容器需要依赖sidecar。启动时sidecar需要先启动,退出时sidecar需要在业务容器退出后再退出。k8s目前对于sidecar的生命周期比较有争议,见issue、sidecarcontainers。

Kubernetes Pod 内有两种容器: 初始化容器(init container)和应用容器(app container)。

kubectl describe pod/test-sidecar -n default

Events:
  Type    Reason     Age                From               Message
  ----    ------     ----               ----               -------
  Normal  Scheduled  11m                default-scheduler  Successfully assigned default/test-sidecar to rds005-worker-1
  Normal  Pulled     11m                kubelet            Successfully pulled image "busybox" in 405.005566ms
  Normal  Created    11m                kubelet            Created container main
  Normal  Pulling    11m                kubelet            Pulling image "busybox"
  Normal  Pulled     11m                kubelet            Successfully pulled image "busybox" in 140.242714ms
  Normal  Started    10m                kubelet            Started container main
  Normal  Created    74s (x2 over 11m)  kubelet            Created container sidecar
  Normal  Pulling    74s (x2 over 11m)  kubelet            Pulling image "busybox"
  Normal  Pulled     74s                kubelet            Successfully pulled image "busybox" in 385.214008ms
  Normal  Started    73s (x2 over 11m)  kubelet            Started container sidecar

此方案可能存在的缺点:

如果sidecar启动失败或者hook失败,其他容器会立即启动

退出顺序

容器启动顺序比较好解决,退出顺序则是按照相反的顺序,业务容器先退出,之后sidecar再退出。

目前,在kubelet删除pod步骤如下;

  • 遍历容器,每个容器起一个goroutine删除
  • 删除时,先执行pre stop hook,得到gracePeriod=DeletionGracePeriodSeconds-period(stophook)
  • 再调用cri删除接口m.runtimeService.StopContainer(containerID.ID, gracePeriod)

如果在sidecar的pre stop hook检测业务容器状态,那么可以延迟退出。

apiVersion: v1
kind: Pod
metadata:
  name: test-stop
spec:
  containers:
  - name: sidecar
    image: busybox
    command: 
    - "/bin/sh"
    - "-c"
    - |
      trap "touch /lifecycle/sidecar-terminated" 15
      until [ -f "/lifecycle/sidecar-terminated" ];do
        date
        sleep 1
      done
      sleep 5
      cat /lifecycle/main-terminated
      t=$(date)
      echo "sidecar exit at $t"
    lifecycle:
      preStop:
        exec:
          command:
          - "/bin/sh"
          - "-c"
          - |
            until [ -f "/lifecycle/main-terminated" ];do
              sleep 1
            done
            t=$(date)
            echo "main exit at $t" > /lifecycle/main-terminated
    volumeMounts:
    - name: lifecycle
      mountPath: /lifecycle
  - name: main
    image: busybox
    command: 
    - "/bin/sh"
    - "-c"
    - |
      trap "touch /lifecycle/main-terminated" 15
      until [ -f "/lifecycle/main-terminated" ];do
        date
        sleep 1
      done
    volumeMounts:
    - name: lifecycle
      mountPath: /lifecycle
  volumes:
  - name: lifecycle
    emptyDir: {}

通过测试,使用postStopHook可以达到sidecar延迟退出的目的,但这种方式也有一些缺点

  • 配置复杂,多个sidecar都需要配置postStop监听业务容器状态
  • 业务容器需要有可观察性(提供特定形式的健康检测)
  • poststop执行异常,会等到最大优雅退出时间(默认30s)后才终止

总结

在这里插入图片描述

相关命令

# 进入指定的pod容器中
kubectl exec -it test-sidecar -c sidecar -- sh
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
Kubernetes 虚拟化 网络架构
在K8S中,flannel有几种模式?
在K8S中,flannel有几种模式?
|
存储 Kubernetes 前端开发
k8s部署DataEase1.16.0cluster模式
k8s部署DataEase1.16.0cluster模式
|
弹性计算 Kubernetes Serverless
Kubernetes 的架构问题之Serverless Container中不支持特权模式的问题如何解决
Kubernetes 的架构问题之Serverless Container中不支持特权模式的问题如何解决
191 9
|
存储 Kubernetes 安全
在K8S中,你用的flannel是哪个工作模式及fannel的底层原理如何实现数据报文转发的?
在K8S中,你用的flannel是哪个工作模式及fannel的底层原理如何实现数据报文转发的?
|
Kubernetes 负载均衡 算法
k8s学习--kube-proxy的三种工作模式详细解释
k8s学习--kube-proxy的三种工作模式详细解释
550 0
|
Kubernetes Linux 容器
K8S中,flannel有几种模式?
K8S中,flannel有几种模式?
|
Kubernetes 负载均衡 监控
在K8S中,kube-proxy的工作模式是什么?
在K8S中,kube-proxy的工作模式是什么?
|
存储 Kubernetes 容器
在k8S中,所支持的存储供应模式有哪些?
在k8S中,所支持的存储供应模式有哪些?
|
存储 Kubernetes API
在K8S中,calico工作原理与网络模式是什么?
在K8S中,calico工作原理与网络模式是什么?
|
Kubernetes 数据处理 调度
天呐!部署 Kubernetes 模式的 Havenask 集群太震撼了!
【6月更文挑战第11天】Kubernetes 与 Havenask 集群结合,打造高效智能的数据处理解决方案。Kubernetes 如指挥家精准调度资源,Havenask 快速响应查询,简化复杂任务,优化资源管理。通过搭建 Kubernetes 环境并配置 Havenask,实现高可扩展性和容错性,保障服务连续性。开发者因此能专注业务逻辑,享受自动化基础设施管理带来的便利。这项创新技术组合引领未来,开启数据处理新篇章。拥抱技术新时代!
198 3

热门文章

最新文章