本文发布已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。

Kubernetes v1.28:引入原生边车容器

本文解释了如何使用新的 sidecar 功能,该功能支持可重启的 init 容器,并且在 Kubernetes 1.28 中以 alpha 形式提供。我们希望您能提供反馈,以便我们尽快使此功能毕业。

“sidecar” 的概念几乎从一开始就成为 Kubernetes 的一部分。在 2015 年,关于复合容器的博客文章中将 sidecar 描述为“扩展和增强‘主’容器”的附加容器。Sidecar 容器已成为一种常见的 Kubernetes 部署模式,通常用于网络代理或作为日志记录系统的一部分。到目前为止,sidecar 是 Kubernetes 用户在没有原生支持的情况下应用的概念。缺乏原生支持导致了一些使用摩擦,此增强功能旨在解决这些问题。

1.28 中的 sidecar 容器是什么?

Kubernetes 1.28 向 init 容器添加了一个新的 restartPolicy 字段,当启用 SidecarContainers 功能门时可以使用。

apiVersion: v1
kind: Pod
spec:
  initContainers:
  - name: secret-fetch
    image: secret-fetch:1.0
  - name: network-proxy
    image: network-proxy:1.0
    restartPolicy: Always
  containers:
  ...

该字段是可选的,如果设置,唯一有效的值是 Always。设置此字段会更改 init 容器的行为,如下所示

  • 如果容器退出,则会重启
  • 任何后续 init 容器会在 startupProbe 成功完成后立即启动,而不是等待可重启的 init 容器退出
  • Pod 的资源使用计算发生变化,因为可重启的 init 容器资源现在会添加到主容器的资源请求总和中

Pod 终止仍然仅取决于主容器。具有 restartPolicyAlways 的 init 容器(称为 sidecar)不会阻止 Pod 在主容器退出后终止。

可重启的 init 容器的以下属性使其成为 sidecar 部署模式的理想选择

  • 无论您是否设置 restartPolicy,Init 容器都具有明确定义的启动顺序,因此您可以确保 sidecar 在清单中 sidecar 声明之后的任何容器声明之前启动。
  • Sidecar 容器不会延长 Pod 的生命周期,因此您可以在短生命周期的 Pod 中使用它们,而无需更改 Pod 生命周期。
  • Sidecar 容器会在退出时重启,这提高了弹性,并允许您使用 sidecar 来提供主容器可以更可靠地使用的服务。

何时使用 sidecar 容器

您可能会发现内置的 sidecar 容器对以下工作负载很有用

  • 批处理或 AI/ML 工作负载,或其他运行至完成的 Pod。这些工作负载将体验到最显著的好处。
  • 网络代理,在清单中的任何其他容器之前启动。运行的每个其他容器都可以使用代理容器的服务。有关说明,请参阅 Istio 博客文章中的 Kubernetes 原生 sidecar
  • 日志收集容器,现在可以在任何其他容器之前启动并运行到 Pod 终止。这提高了 Pod 中日志收集的可靠性。
  • Job,可以使用 sidecar 来实现任何目的,而 Job 完成不会被运行的 sidecar 阻塞。无需额外的配置即可确保此行为。

在 1.28 之前,用户如何获得 sidecar 行为?

在 sidecar 功能之前,以下选项可用于实现 sidecar 行为,具体取决于 sidecar 容器的所需生命周期

  • Sidecar 的生命周期小于 Pod 的生命周期:使用 init 容器,它提供明确定义的启动顺序。但是,sidecar 必须退出,其他 init 容器和主 Pod 容器才能启动。
  • Sidecar 的生命周期等于 Pod 的生命周期:使用与 Pod 中的工作负载容器一起运行的主容器。此方法不让您控制启动顺序,并允许 sidecar 容器在工作负载容器退出后可能阻塞 Pod 终止。

内置的 sidecar 功能解决了生命周期等于 Pod 生命周期的用例,并具有以下额外好处

  • 提供对启动顺序的控制
  • 不会阻塞 Pod 终止

将现有 sidecar 过渡到新模型

我们建议仅在 alpha 阶段的短生命周期测试集群中使用 sidecar 功能门。如果您现有的 sidecar 被配置为主容器,以便它可以运行到 pod 的生命周期,则可以将其移动到 pod 规范的 initContainers 部分,并为其指定 restartPolicyAlways。在许多情况下,sidecar 应像以前一样工作,并具有定义启动顺序和不延长 pod 生命周期的额外好处。

已知问题

内置 sidecar 容器的 alpha 版本存在以下已知问题,我们将在该功能升级到 beta 版本之前解决这些问题

  • CPU、内存、设备和拓扑管理器不知道 sidecar 容器的生命周期和额外的资源使用,并且会像 Pod 的资源请求低于实际请求一样运行。
  • 使用 sidecar 时,kubectl describe node 的输出不正确。输出显示的资源使用量低于实际使用量,因为它没有使用 sidecar 容器的新资源使用量计算。

我们需要您的反馈!

在 alpha 阶段,我们希望您在您的环境中使用 sidecar 容器,并在遇到错误或摩擦点时打开 issue。我们特别感兴趣以下方面的反馈

  • 关闭序列,尤其是在运行多个 sidecar 的情况下
  • 崩溃的 sidecar 的回退超时调整
  • sidecar 运行时 Pod 就绪和活性探测的行为

要打开 issue,请参阅Kubernetes GitHub 存储库

下一步是什么?

除了将要解决的已知问题之外,我们还在努力为 sidecar 和主容器添加终止顺序。这将确保 sidecar 容器仅在 Pod 的主容器退出后才终止。

我们很高兴看到 sidecar 功能来到 Kubernetes,并对反馈感兴趣。

致谢

自最初的 KEP 编写以来,已经过去了很多年,因此如果遗漏了多年来为此功能工作的任何人,我们深感抱歉。这是尽力尝试识别参与此工作的人员。

更多信息