我有我们正在运行的供应商应用程序的 helm 部署脚本。对于日志记录解决方案,我需要为 Fluentbit 添加一个 sidecar 容器,以将日志推送到聚合日志服务器(在本例中为 splunk)。
现在要定义这个 sidecar 容器,我想避免更改供应商定义的部署脚本。相反,我想要一些替代方法将 sidecar 容器附加到正在运行的 pod。
到目前为止,我已经了解到可以在同一个部署脚本(部署配置)中定义 sidecar 容器。
回答评论里的问题:
谢谢@david。这必须在部署之前完成。我想知道是否可以将 sidecar 容器附加到已部署(正在运行)的 pod 上。
您无法将附加容器附加到正在运行的
Pod
。您可以更新(修补)资源定义。这将强制使用新规范重新创建资源。
有一个关于此功能的 github 问题,已通过以下评论关闭:
在讨论了 SIG Node 的目标之后,明确的共识是 pod 规范中的容器列表应该保持不可变。 #27140 将通过 kubernetes/community#649 得到更好的解决,它允许在现有 pod 中运行临时调试容器。这不会被实施。
回答帖子部分:
现在要定义这个 sidecar 容器,我想避免更改供应商定义的部署脚本。相反,我想要一些替代方法将 sidecar 容器附加到正在运行的 pod。
下面我提供了两种将 sidecar 添加到
Deployment
的方法。 这两种方法都会重新加载 Pods
以匹配新规范:
$ kubectl patch
Helm
图表并使用 $ helm upgrade
在这两种情况下,我鼓励您检查 Kubernetes 如何处理其资源的更新。您可以通过以下链接阅读更多内容:
$ kubectl patch
完全避免编辑 Helm 图表的方法是使用:
$ kubectl patch
此方法将“修补”现有的
Deployment/StatefulSet/Daemonset
并添加 sidecar。这种方法的缺点是它不像 Helm 那样自动化,您需要为每个资源(每个 Deployment
/Statefulset
/Daemonset
等)创建一个“补丁”。如果来自 Helm 等其他来源的任何更新,此“补丁”将被覆盖。
有关更新 API 对象的文档:
Helm
图表并使用 $ helm upgrade
此方法需要编辑 Helm 图表。添加 sidecar 等所做的更改将在更新中持续存在。进行更改后,您将需要使用
$ helm upgrade RELEASE_NAME CHART
。
您可以在这里阅读更多相关信息:
kubernetes 资源是不可变的,正如 dawid-kruk 所提到的。因此修改 pod 描述将导致容器重新启动。
您可以使用
kubectl patch
命令修改 pod,不要忘记重新应用。根据需要进行修补。
或者,以下两个选项将注入 sidecar,而无需修改/分叉上游图表或破坏已部署的资源。
变异准入控制器(webhook)可以修改资源,请参阅https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/
您可以使用像opa这样的通用框架。 或特定的 webhook,如 fluid-sidecar-injector(未测试)
您可以向图表维护者提交功能请求以支持任意 sidecar 注入,就像在 Prometheus 中一样,请参阅 https://stackoverflow.com/a/62910122/1260896
对于像我这样登陆这里搜索帖子标题所说的人来说,一种临时添加 sidecar 容器的方法,从 Kubernetes 1.25 开始,调试功能已经变得稳定了!
注意:如果您的用例与问题中所述相同,请阅读其他答案!
https://kubernetes.io/docs/tasks/debug/debug-application/debug-running-pod/#ephemeral-container
所以你可以运行:
kubectl debug -it your-pod-with --image=busybox:1.28 --target=ephemeral-demo
但是当然,这不适合OP,因为这是用于短期调试,而不是运行进程。