Kubernetes开发指南(4) - Sidecar 容器实例

Kubernetes是一种容器编排工具,用于在云或本地服务器内部署和管理容器化应用程序。

您可以在 Kubernetes 中创建和管理的最小可部署单元是Pod。一个 Pod 封装了一个或多个容器化应用程序。在 pod 中配置单个容器是一种常见的用例,但在某些情况下,需要在 pod 中封装多个容器。当有两个或多个容器彼此紧密耦合并且需要共享相同资源时,通常会发生这种情况。

在本文中,您将了解 Kubernetes sidecar 容器,包括如何实现它们,以及部署 sidecar 容器时应遵循的最佳实践。

什么是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 容器,以及创建和部署它们的最佳实践。

相关推荐
炒空心菜菜44 分钟前
MapReduce 实现 WordCount
java·开发语言·ide·后端·spark·eclipse·mapreduce
小锋学长生活大爆炸1 小时前
【教程】Docker更换存储位置
运维·docker·容器
gnufre2 小时前
Kubernetes 1.28 无 Docker 运行时环境下的容器化构建实践:Kaniko + Jenkins 全链路详解
kubernetes·jenkins·kaniko
wowocpp3 小时前
spring boot Controller 和 RestController 的区别
java·spring boot·后端
后青春期的诗go3 小时前
基于Rust语言的Rocket框架和Sqlx库开发WebAPI项目记录(二)
开发语言·后端·rust·rocket框架
freellf3 小时前
go语言学习进阶
后端·学习·golang
全栈派森5 小时前
云存储最佳实践
后端·python·程序人生·flask
川石教育5 小时前
测试工程师如何学会Kubernetes(k8s)容器知识
云原生·容器·kubernetes·kubernetes容器·kubernetes教程
CircleMouse5 小时前
基于 RedisTemplate 的分页缓存设计
java·开发语言·后端·spring·缓存
獨枭6 小时前
使用 163 邮箱实现 Spring Boot 邮箱验证码登录
java·spring boot·后端