这篇文章已经一年多了,较旧的文章可能包含过时的内容。请检查从发表以来,页面中的信息是否变得不正确。
作者:Todd Neal (AWS), Matthias Bertschy (ARMO), Sergey Kanzhelev (Google), Gunju Kim (NAVER), Shannon Kularathna (Google)
本文介绍了如何使用新的边车(Sidecar)功能,该功能支持可重新启动的 Init 容器, 并且在 Kubernetes 1.28 以 Alpha 版本发布。我们希望得到你的反馈,以便我们尽快完成此功能。
“边车”的概念几乎从一开始就是 Kubernetes 的一部分。在 2015 年, 一篇关于复合容器的博客文章(英文)将边车描述为“扩展和增强 ‘main’ 容器”的附加容器。 边车容器已成为一种常见的 Kubernetes 部署模式,通常用于网络代理或作为日志系统的一部分。 到目前为止,边车已经成为 Kubernetes 用户在没有原生支持情况下使用的概念。 缺乏原生支持导致了一些使用摩擦,此增强功能旨在解决这些问题。
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 容器的行为,如下所示:
Pod 终止继续仅依赖于主容器。
restartPolicy 为 Always 的 Init 容器(称为边车)不会阻止 Pod 在主容器退出后终止。
可重新启动的 Init 容器的以下属性使其非常适合边车部署模式:
restartPolicy,初始化容器都有一个明确定义的启动顺序,
因此你可以确保你的边车在其所在清单中声明的后续任何容器之前启动。你可能会发现内置边车容器对于以下工作负载很有用:
在边车功能出现之前,可以使用以下选项来根据边车容器的所需生命周期来实现边车行为:
内置的边车功能解决了其生命周期与 Pod 生命周期相同的用例,并具有以下额外优势:
我们建议仅在 Alpha 阶段的短期测试集群中使用边车功能。
如果你有一个现有的边车,被配置为主容器,以便它可以在 Pod 的生命周期内运行,
则可以将其移至 Pod 规范的 initContainers 部分,并将 restartPolicy 指定为 Always。
在许多情况下,边车应该像以前一样工作,并具有定义启动顺序且不会延长 Pod 生命周期的额外好处。
内置边车容器的 Alpha 版本具有以下已知问题,我们将在该功能升级为 Beta 之前解决这些问题:
kubectl describe node 的输出不正确。输出显示的资源使用量低于实际使用量,
因为它没有对边车容器使用新的资源使用计算方式。在 Alpha 阶段,我们希望你在环境中尝试边车容器,并在遇到错误或摩擦点时提出问题。我们对以下方面的反馈特别感兴趣:
要提出问题,请参阅 Kubernetes GitHub 存储库。
除了将要解决的已知问题之外,我们正在努力为边车和主容器添加终止顺序。这将确保边车容器仅在 Pod 主容器退出后终止。
我们很高兴看到 Kubernetes 引入了边车功能,并期望得到反馈。
自从最初的 KEP 编写以来已经过去了很多年,因此如果我们遗漏了多年来致力于此功能的任何人,我们将深表歉意。 这也是识别该功能参与者的最大限度努力。