Kubernetes

避免 pod 環境變數與 Docker 樣式的連結衝突

  • September 11, 2021

我們以 Docker 作為容器執行時在 Kubernetes 中執行或組件。它的一個問題是 pod 環境被 Docker 風格的連結變數污染了,比如

  • SERVICENAME_PORT_8181_TCP
  • SERVICENAME_PORT_HTTP
  • …..
  • SERVICENAME_PORT

對於每個可見服務(相同命名空間中的服務)。在這種情況下,自動創建的變數很容易與顯式聲明的環境發生衝突。這有時會導致難以診斷的問題。我也不想依賴那些自動變數,因為我希望容器不依賴於 Kubernetes 服務配置的細節。目前,我正在為顯式變數添加唯一名稱前綴以避免此類衝突。

有沒有辦法配置集群不為每個可見服務添加這些自動變數?或者,使用其他執行時會containerd解決這個問題嗎?令我驚訝的是,由於通過環境變數進行配置被認為是一種很好的做法,因此沒有現成的 googleable 解決方案。一般來說,我如何在不遇到此類命名衝突的情況下使用環境?或者服務名稱被認為是與容器契約的一部分,我不應該隨意更改它們?

有沒有辦法配置集群不為每個可見服務添加這些自動變數?

是和否:不是集群範圍的,AFAIK,但該enableServiceLinks: false欄位spec:旨在允許您將其關閉

或者,使用 containerd 等其他執行時會解決這個問題嗎?

不,這些名稱是本著與 docker 兼容的精神而添加的,但與 docker 完全無關——它們是由 kubelet 注入的

一般來說,我如何在不遇到此類命名衝突的情況下使用環境?或者服務名稱被認為是與容器契約的一部分,我不應該隨意更改它們?

另一種選擇不是全面禁止它們,您也可以只屏蔽困擾您的應用程序的*特定問題;*以 Spring Boot結尾的那些特別有問題,其中_HTTP有一個超級通用名稱,例如或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:(為了不必修補每個受影響的部署)

引用自:https://serverfault.com/questions/1077270