避免 pod 环境变量与 Docker 样式链接冲突

避免 pod 环境变量与 Docker 样式链接冲突

我们在 Kubernetes 中使用 Docker 作为容器运行时来运行或组件。它的一个问题是 pod 环境被 Docker 样式的链接变量污染,例如

  • SERVICENAME_PORT_8181_TCP
  • SERVICENAME_PORT_HTTP
  • .....
  • SERVICENAME_PORT

对于每个可见服务(同一命名空间中的服务)。在这种情况下,自动创建的变量很容易与明确声明的环境发生冲突。这有时会导致难以诊断的问题。我也不想依赖这些自动变量,因为我希望容器不依赖于 Kubernetes 服务配置的细节。目前,我正在向显式变量添加唯一的名称前缀以避免此类冲突。

有没有办法配置集群以不为每个可见服务添加这些自动变量?或者,使用其他运行时是否可以containerd解决这个问题?我很惊讶没有现成的解决方案,因为通过环境变量进行配置被认为是一种很好的做法。一般来说,我如何使用环境而不会遇到这样的命名冲突?或者服务名称被视为与容器的合同的一部分,我不应该随意更改它们?

答案1

有没有办法配置集群以不为每个可见服务添加那些自动变量?

是也不是:据我所知,不是集群范围的,但是enableServiceLinks: false字段spec:旨在让你关闭它们

或者,使用其他运行时(例如 containerd)是否可以解决这个问题?

不,这些名字是为了兼容 docker 而添加的,但与 docker 完全无关——它们是由 kubelet 注入

一般情况下,我该如何使用环境而不遇到此类命名冲突?或者服务名称被视为与容器的合同的一部分,我不应该随意更改它们?

另一个选择是,除了全面禁止它们,你也可以直接遮盖具体的那些困扰你的应用程序的;以 结尾的那些_HTTP在 Spring Boot 中尤其成问题,因为有一个非常通用的名字,Service如或metadata: { name:serviceserver

您可以根据部署执行此操作:

env:
- name: SERVICENAME_PORT_HTTP
  # omitting the value: just sets it to the empty string in the container
# and the rest

或者你可以声明一个包含有问题的 ConfigMap 并用它们全部覆盖envFrom:(这样就不必修补每个受影响的 Deployment

相关内容