Kubernetes是一种容器编排工具,用于在云或本地服务器内部署和管理容器化应用程序。
您可以在 Kubernetes 中创建和管理的最小可部署单元是Pod。一个 Pod 封装了一个或多个容器化应用程序。在 pod 中配置单个容器是一种常见的用例,但在某些情况下,需要在 pod 中封装多个容器。当有两个或多个容器彼此紧密耦合并且需要共享相同资源时,通常会发生这种情况。
在本文中,您将了解 Kubernetes sidecar 容器,包括如何实现它们,以及部署 sidecar 容器时应遵循的最佳实践。
- Kubernetes开发指南 3 - Helm Chart 完全 指导 手册
- 图解Kubernetes开发指南(2) 深入理解 Kubernetes Service :示例、基本用法和故障排除
- 图解Kubernetes开发指南(1) 深入理解CRD
- Kubernetes日志完全指南与最佳实践

什么是Sidecar容器?
Sidecar 容器是需要与主容器一起运行的容器。这两个容器共享 Pod 存储和网络接口等资源。Sidecar 容器还可以与主容器共享存储卷,从而允许主容器访问 Sidecar 中的数据。localhost
主容器和 sidecar 容器还共享 pod 网络,并且 pod 容器可以使用pod 的 IP在同一网络上相互通信,从而减少它们之间的延迟。
Sidecar 容器允许您增强和扩展主容器的功能,而无需修改其代码库。此外,Sidecar容器应用程序可以使用与主容器应用程序不同的语言进行开发,从而提供更高的灵活性。
Sidecar的应用场景
Sidecar 容器是一个相对高级的用例,不应随意或毫无理由地部署,因为它们会增加集群的复杂性。也就是说,Sidecar容器可以通过多种方式增强主容器的功能,在本节中,我们将讨论几种最常见的用途。
设计用于共享存储或网络的应用程序
当您需要编写可以用另一种编程语言更有效地处理的功能时,Sidecar 容器会派上用场。例如,假设您使用 Laravel 开发了一个允许用户上传图像的应用程序。当用户上传图片时,您希望减小文件大小,但仍保持图像质量。您需要将此功能构建到您的应用程序中,但您找到的用于处理文件压缩的容器映像是用 C 构建的。
您可以将压缩应用程序部署为Sidecar容器,而不是重新发明轮子。当用户上传图像文件时,该文件会被发送到 sidecar 容器,并在其中进行压缩,然后保存在主容器可访问的共享存储中。

主要应用程序和日志应用程序
日志记录和审计是 Kubernetes 监控和可观察性的重要方面。为了提高任何应用程序的安全性和性能,您必须监视日志以查找潜在的安全威胁、错误和其他问题迹象。然而,原始日志通常难以理解,许多用户选择将日志导出到另一个应用程序以便于查看。
手动执行此操作既乏味又耗时,但Sidecar容器应用程序可以从共享卷读取日志并将其流式传输到另一个应用程序或集中式服务器。

保持应用程序配置最新
在 Kubernetes 中,有一个选项可以使用ConfigMaps
将容器配置变量挂载为卷。这使得动态更新主容器应用程序配置成为可能。您可以创建一个 sidecar 容器应用程序,以预定的时间间隔从 URL 检查更新的配置值,然后在有更新时更新卷存储中的配置。下次主容器应用程序从卷存储读取配置值时,它将读取更新的值。
实施 Kubernetes Sidecar 容器
为了理解 sidecar 容器,您将创建一个示例项目。该项目有两个容器:主容器,其中包含一个显示简单 HTML 页面的 nginx 应用程序,以及一个 sidecar 容器,它是一个虚拟容器,模拟从主容器中提取日志并将其发送到集中式聚合器的应用程序。
首先,设置一个Kubernetes 集群。按照minikube 启动指南在您的计算机上设置本地开发集群。安装后,使用以下命令启动集群:
在与集群交互之前,您需要按照Kubernetes 官方文档中的安装指南在计算机上安装kubectl 客户端. 安装完成后,您就可以开始与 Kubernetes 集群进行交互了。
创建一个名为 的文件sidecar-container.yaml
,并将以下 yaml 配置粘贴到其中。
yaml
metadata:
name: simple-webapp
labels:
app: webapp
spec:
containers:
- name: main-application
image: nginx
volumeMounts:
- name: shared-logs
mountPath: /var/log/nginx
- name: sidecar-container
image: busybox
command: ["sh","-c","while true; do cat /var/log/nginx/access.log; sleep 30; done"]
volumeMounts:
- name: shared-logs
mountPath: /var/log/nginx
volumes:
- name: shared-logs
emptyDir: {}
---
# Service Configuration
# --------------------
apiVersion: v1
kind: Service
metadata:
name: simple-webapp
labels:
run: simple-webapp
spec:
ports:
- port: 80
protocol: TCP
selector:
app: webapp
type: NodePort
sidecar-container.yaml
包含两种配置,一种用于 Pod,一种用于服务。Pod 配置包含主容器和 sidecar 容器。sidecar 容器放置在主容器之后,因此每当您kubectl exec
在 simple-webapp pod 上运行命令而不指定容器时,它都会直接针对主容器。
服务配置是NodePort 服务,它公开主应用程序,以便您可以在浏览器上访问它。该配置包含一个带有emptyDir的卷配置,该卷配置安装在主容器和Sidecar上。这允许Sidecar读取主容器的日志并处理它。默认情况下,主应用程序容器将其日志发送到/var/log/nginx
,这就是主容器卷安装到该目录的原因。
在此示例中,sidecar 容器每 30 秒读取一次文件并将其输出到 Kubernetes 日志,而不是将其发送到中央日志服务。command
您可以在sidecar 容器的配置中看到这一点。Kubernetes 日志捕获 sidecar 容器输出,可以通过命令查看kubectl log
。
现在您已了解该文件的内容sidecar-container.yaml
,请运行以下命令在集群上创建多容器 Pod 和服务:
lua
kubectl create -f sidecar-container.yaml
在继续之前,您需要测试 sidecar 容器。为了在 minikube 上公开您的服务,您必须运行以下命令:
css
minikube service --url simple-webapp

simple-webapp 服务
在访问生成的 URL 之前,请打开单独的终端并运行以下命令以查看 sidecar 容器的输出:
去
kubectl logs -f simple-webapp sidecar-container
目前,没有可显示的日志,因为您尚未访问主应用程序 URL。打开浏览器并访问 minikube 提供的 URL。页面加载后,返回到正在监视 Sidecar 容器上的 Kubernetes 日志的终端,现在将在其中输出。主应用程序记录您对其 URL 的访问,而 sidecar 容器正在监视日志目录。

主要应用 - 简单网页

Sidecar最佳实践
出于安全原因以及最大限度地提高 Sidecar 的效率和生产力,在实施过程中遵循 Sidecar 最佳实践至关重要。您将在本节中了解其中一些实践。
确保有足够理由来使用Sidecar
管理Sidecar可能很复杂,尤其是当您有很多Sidecar时。它们需要监控、更新和资源管理,就像标准容器一样。如果不对此进行规划,可能会导致集群性能受到影响。
由于这种复杂性,出于特定原因实施Sidecar非常重要,这将有利于您的整体应用程序。一个例子是需要使用日志记录功能或使用不同编程语言构建的文件管理系统来扩展主应用程序的功能。实现 sidecar 容器的经验法则是它们应该对应用程序有益而不是有害。
努力使它们成为小型、模块化的应用程序
Sidecar 容器是功能有限的紧凑型容器。这使得维护 sidecar 容器变得更加容易,或者在 Pod 中出现问题时快速检测错误。保持Sidecar的模块化和紧凑性有助于防止它与主容器竞争资源。
有意识的限制资源的使用
重要的是,Sidecar不要比主容器消耗更多的资源。Sidecar 是被配置为增强或扩展主容器功能的容器,其功能次于主容器。虽然保持它们紧凑可以减少资源过度消耗的可能性,但它们也需要以限制它们对资源的访问的方式进行配置。允许 sidecar 自由消耗资源,尤其是内存资源,会对 Kubernetes 集群的性能产生负面影响。
由此可能出现的一个问题是缺乏足够的 Pod 来处理工作负载。当集群中的某个节点内存不足时,系统内核会自动终止消耗内存最多的容器,并出现内存不足 (OOM) 错误,这通常会使 Pod 处于终止状态。适当的 sidecar 配置将允许您为 sidecar 容器分配资源限制,确保避免此问题。
总结
Kubernetes sidecar 容器对于增强主要容器功能非常有用。在本文中,我们向您介绍了 Sidecar 容器及其重要性,以及 Sidecar 容器何时特别有用。您还了解了如何使用主容器部署 sidecar 容器,以及创建和部署它们的最佳实践。