什么是Kubernetes Sidecar容器?

7,253 阅读3分钟

Kubernetes中最有用的模式之一是Sidecar模式。但什么是sidecar模式呢?

通常情况下,Kubernetes中的Pod只包含一个容器(单容器Pod)。但一个Pod有可能包含一个以上的容器。在这种情况下,它被称为多容器荚

当另一个容器被添加到一个pod中,为主容器提供额外的功能,但不需要改变主容器,它被称为一个sidecar容器。

一个或多个共享同一个pod的容器至少要共享两样东西。

  • 一个文件系统-这意味着你可以使用共享卷在同一个pod中的两个或多个容器之间共享文件。共享卷是简单的共享文件夹。
  • 网络-同一Pod中的容器之间的通信可以通过回环接口 - localhost进行。

Sidecar模式在Kubernetes中有许多不同的应用。我只提几个用例,然后我会告诉你我是如何利用sidecar模式来发挥我的优势的。

Kubernetes中的Sidecar容器的例子

Sidecar模式的一个常见用例是添加一个额外的容器,用于代理Pod之间的请求,例如,通过Service Mesh加密Pod与Pod之间的通信,或者作为数据库代理

我是如何在Kubernetes中使用Sidecar模式的

我对Sidecar模式的实际应用是在Pod之间添加一个简单的文件同步工具,以使我能够扩展WordPress,而不必依赖直接在Pod上安装共享网络存储。不这样做有很多考虑,比如性能、弹性和成本。但我不会在这篇文章中纠缠于这个话题。

我通过共享WordPress中的wp-content文件夹和一个文件同步容器来实现挎斗模式。FileSync容器的工作是把添加到WordPress中的任何新文件上传到GCS云桶中,并确保每当有新的媒体项目被添加到GCS云桶中时,运行WordPress的每个Pod都包含wp-content中的文件副本。
所有这些逻辑都在与WordPress容器一起运行的FileSync容器中实现。只需要最小的YAML配置

为了在同一个pod内的两个容器之间实现文件共享,我们只需要添加三块YAML。

1.在pod上添加一个卷的声明。

 spec:
   volumes:
     - name: wpcontent
       emptyDir: { }

2.给wordpress容器添加一个卷挂载。

containers:
- name: wordpress
  ...  
  volumeMounts:
  - name: wpcontent
    mountPath: /var/www/html/wp-content

3.在文件同步容器中添加一个卷装载。

containers:
   name: fileSync
   volumeMounts:
     - name: wpcontent
       mountPath: /data/wpcontent

就这样,两个容器都可以通过本地存储共享文件。这种类型的共享卷的一个真正重要的方面是,文件夹中的任何数据在Pod被重新创建后都会丢失。

在我的用例中,这不是什么问题,因为一旦文件被写入本地存储,它就会被上传到GCS桶中。

所有与GCS进行同步的工作都是通过gsutil rsync 通过fileSync容器中的一个简单bash脚本完成的。
这个解决方案的好处是,如果我将来有任何关于与GCS同步的要求,我可以重新使用这个sidecar容器。