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

问题描述 投票:0回答:3

我有我们正在运行的供应商应用程序的 helm 部署脚本。对于日志记录解决方案,我需要为 Fluentbit 添加一个 sidecar 容器,以将日志推送到聚合日志服务器(在本例中为 splunk)。

现在要定义这个 sidecar 容器,我想避免更改供应商定义的部署脚本。相反,我想要一些替代方法将 sidecar 容器附加到正在运行的 pod。

到目前为止,我已经了解到可以在同一个部署脚本(部署配置)中定义 sidecar 容器。

kubernetes openshift fluent-bit sidecar
3个回答
3
投票

回答评论里的问题:

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

您无法将附加容器附加到正在运行的

Pod
。您可以更新(修补)资源定义。这将强制使用新规范重新创建资源。

有一个关于此功能的 github 问题,已通过以下评论关闭:

在讨论了 SIG Node 的目标之后,明确的共识是 pod 规范中的容器列表应该保持不可变#27140 将通过 kubernetes/community#649 得到更好的解决,它允许在现有 pod 中运行临时调试容器。这不会被实施。

-- Github.com:Kubernetes:问题:允许将容器添加到正在运行的 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

您可以在这里阅读更多相关信息:


0
投票

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

您可以使用

kubectl patch
命令修改 pod,不要忘记重新应用。根据需要进行修补。

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

#1 变异准入控制器

变异准入控制器(webhook)可以修改资源,请参阅https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/

您可以使用像opa这样的通用框架。 或特定的 webhook,如 fluid-sidecar-injector(未测试)

#2 在 helm 中支持任意 sidecar

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


0
投票

对于像我这样登陆这里搜索帖子标题所说的人来说,一种临时添加 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,因为这是用于短期调试,而不是运行进程。

© www.soinside.com 2019 - 2024. All rights reserved.