作者 Todd Neal (AWS), Matthias Bertschy (ARMO), Sergey Kanzhelev (Google), Gunju Kim (NAVER), Shannon Kularathna (Google)
本文介绍如何使用新的边车特性,该特性允许设置可重新启动的 Init 容器,并已在 Kubernetes 1.28 中以 Alpha 状态提供。我们希望听取你的反馈,以便尽快将此功能推进到毕业阶段。
“边车(Sidecar)” 的概念几乎从一开始就是 Kubernetes 的一部分。2015 年,一篇关于边车容器的 博客文章[1] 将边车描述为“扩展和增强‘主’容器”的附加容器。边车容器已成为一种常见的 Kubernetes 部署模式,通常用于网络代理或作为日志系统的一部分。到目前为止,边车一直是 Kubernetes 用户在缺少原生支持的情况下应用的概念。缺乏原生支持也导致了一些使用摩擦,此增强功能旨在解决这些问题。
Kubernetes 1.28 在 Init 容器[2]中添加了一个新的 restartPolicy
字段,该字段可以在 SidecarContainers
特性门控[3] 启用时使用。
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 终止[5] 继续只根据主容器来判定。restartPolicy
为 Always
的所有 Init 容器(称为 Sidecar)不会阻止 Pod 在主容器退出后进入终止状态。
可重新启动的 Init 容器的以下属性使其非常适合边车部署模式:
restartPolicy
,Init 容器都有明确定义的启动顺序。因此,你可以确保清单中的边车容器会在边车声明之后的所有容器之前启动。你可能会发现内置边车容器对于以下工作负载很有用:
在引入边车特性之前,可以使用以下选项来根据边车容器的预期生命周期来实现边车行为:
内置的边车特性解决了生命周期与 Pod 生命周期相同的场景,并具有以下额外优势:
我们建议在 Alpha 阶段仅对短期存在的测试集群[7]启用边车特性门控。如果你已经有一个被配置为主容器的边车,且它可以在 Pod 的整个生命周期内运行, 则可以将其移至 Pod 规约的 initContainers
部分,并将 restartPolicy
设置为 Always
。在许多情况下,边车容器能够继续像以前一样工作,并且额外的好处是可以定义启动顺序,并且不会延长 Pod 的生命周期。
内置的边车容器的 Alpha 版本具有以下已知问题,我们将在将该功能升级为 Beta 之前解决这些问题:
kubectl describe node
命令描述的节点的输出不正确。输出显示的资源使用量低于实际使用量,因为它没有计算边车容器的资源使用量。在 Alpha 阶段,我们希望你在你的环境中尝试边车容器,并在遇到错误或异常点时登记问题。我们对以下方面的反馈特别感兴趣:
要登记问题,请访问 Kubernetes GitHub 仓库[8]。
除了要解决的已知问题之外,我们正在努力为边车和主容器添加终止顺序。终止顺序能够确保边车容器仅在 Pod 的主容器退出后才终止。
我们很高兴看到 Kubernetes 引入了边车特性,并对反馈感兴趣。
自最初的 KEP 编写以来已经过去了很多年,因此如果我们漏掉了多年来致力于此特性的相关人员,请接受我们的道歉。我们尽最大努力去认可参与这项工作的人们。
[1]
博客文章: https://kubernetes.io/blog/2015/06/the-distributed-system-toolkit-patterns/
[2]
Init 容器: https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/init-containers/
[3]
特性门控: https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/feature-gates/
[4]
startupProbe: https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-startup-probes
[5]
Pod 终止: https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination
[6]
Istio 中的 Kubernetes 原生边车容器博客文章: https://istio.io/latest/blog/2023/native-sidecars/
[7]
短期存在的测试集群: https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/feature-gates/#feature-stages
[8]
Kubernetes GitHub 仓库: https://github.com/kubernetes/kubernetes/issues/new/choose
[9]
mrunalp: https://github.com/mrunalp/
[10]
thockin: https://github.com/thockin/
[11]
bobbypage: https://github.com/bobbypage
[12]
smarterclayton: https://github.com/smarterclayton
[13]
howardjohn: https://github.com/howardjohn
[14]
derekwaynecarr: https://github.com/derekwaynecarr
[15]
dchen1107: https://github.com/dchen1107
[16]
jpbetz: https://github.com/Jpbetz
[17]
Joseph-Irving: https://github.com/Joseph-Irving
[18]
rata: https://github.com/rata
[19]
swatisehgal: https://github.com/swatisehgal
[20]
ffromani: https://github.com/ffromani
[21]
alculquicondor: https://github.com/Alculquicondor
[22]
wojtek-t: https://github.com/Wojtek-t
[23]
ahg-g: https://github.com/ahg-g
[24]
adisky: https://github.com/Adisky
[25]
边车容器 API: https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/init-containers/#api-for-sidecar-containers
[26]
Sidecar KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/753-sidecar-containers/README.md