我们在 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:
service
server
您可以根据部署执行此操作:
env:
- name: SERVICENAME_PORT_HTTP
# omitting the value: just sets it to the empty string in the container
# and the rest
或者你可以声明一个包含有问题的 ConfigMap 并用它们全部覆盖envFrom:
(这样就不必修补每个受影响的 Deployment