将 Sidecar 容器添加到正在运行的 Pod 中

4
我有一个针对某供应商应用程序的Helm部署脚本。为了记录日志,我需要添加一个sidecar容器来将日志推送到聚合日志服务器(在这种情况下是Splunk)。
现在,为了定义这个sidecar容器,我想避免更改供应商定义的部署脚本。相反,我希望找到一种替代方法将sidecar容器附加到正在运行的pod中。
到目前为止,我了解到可以在同一部署脚本(部署配置)中定义sidecar容器。

1
你可以在 DeploymentYAML 定义中附加额外的容器。这份文档可能对此有所帮助:来自 Kubernetes.io 的多容器示例。请告诉我这是否是你要找的内容。 - undefined
感谢 @david。在部署之前必须完成这个任务。我想知道是否可以将一个附加容器(sidecar container)附加到已经部署(运行中)的 pod 上。 - undefined
3个回答

4
只是为了像我这样的人,着陆在这里搜索帖子标题所说的内容,一种临时添加边车容器的方法,自 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

当然,这对于楼主来说并不适用,因为这只是用于短期调试,而不是运行进程。

1
自 Kubernetes 1.23 版本开始,它已经处于测试阶段(并默认启用)。 - undefined

3

回答评论中的问题:

谢谢@david。这必须在部署之前完成。我想知道是否可以将一个早已部署(正在运行)的pod连接到一个附加的sidecar容器上。

您无法将附加容器连接到正在运行的Pod。您可以更新(修补)资源定义。这将强制使用新规范重新创建资源。

关于此功能有一个GitHub问题,该问题已关闭并附有以下评论:

在讨论了SIG Node的目标后,明确的共识是Pod规范中的容器列表应保持不变# 27140 将通过kubernetes/community#649 更好地解决,它允许在现有Pod中运行短暂的调试容器 。这将不会实现。

-- Github.com:Kubernetes:Issues:Allow containers to be added to a running pod


回答帖子部分:

现在,为了定义这个sidecar容器,我想避免更改供应商定义的部署脚本。而是希望以其他方式将sidecar容器附加到运行中的pod。

下面我列出了两种向Deployment添加sidecar的方法。这两种方法都会重新加载Pods与新的规范匹配:

  • 使用$ kubectl patch
  • 编辑Helm图表并使用$ helm upgrade

在这两种情况下,我鼓励您检查Kubernetes如何处理其资源的更新。您可以按照以下链接阅读更多相关信息:



使用$ kubectl patch

完全避免编辑Helm图表的方法是使用:

  • $ kubectl patch

这种方法将会“修补”现有的Deployment/StatefulSet/Daemonset并添加Sidecar。这种方法的缺点是它不像Helm那样自动化,您需要为每个资源(每个Deployment/Statefulset/Daemonset等)创建一个“patch”。“Patch”会在其他来源(如Helm)的任何更新时被覆盖。

有关原地更新API对象的文档:


编辑Helm Chart并使用$ helm upgrade

此方法需要编辑Helm chart。所做的更改(如添加Sidecar)将通过更新持续存在。更改后,您需要使用命令$ helm upgrade RELEASE_NAME CHART进行更新。

您可以在此处阅读更多信息:


我认为最终舵手选项是最佳解决方案。 可以在图表的值文件中添加一个标志,以便控制特定容器的部署。 标志的值可以保持为false,这样默认行为就是不创建容器,然后在部署或升级过程中覆盖标志的值,将容器添加到新的Pod中。 - undefined

0

Kubernetes资源是不可变的,正如dawid-kruk所述。因此,修改Pod描述将导致容器重新启动。

您可以使用kubectl patch命令修改Pod,并根据需要重新应用补丁。

或者,以下两个选项将在无需修改/分叉上游图表或损坏部署的资源的情况下注入sidecar。

#1 基因突变审批控制器

基因突变审批控制器(Webhook)可以修改资源,请参见https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/

您可以使用通用框架,例如opa, 或特定的Webhook,例如fluentd-sidecar-injector(未经测试)

#2 支持Helm中的任意Sidecar

您可以向图表维护人员提交功能请求,以支持任意位置的sidecar注入,就像在Prometheus中一样,参见https://stackoverflow.com/a/62910122/1260896


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接