避免 pod 環境變數與 Docker 樣式的連結衝突
我們以 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:
(為了不必修補每個受影響的部署)