3 回答

TA貢獻1808條經驗 獲得超4個贊
作為一般的 Un*x 語句,您無法在進程啟動后更改進程中的環境變量。(你可以setenv?(3)你自己的環境,并且你可以在execve?(2)它時指定一個新進程的環境,但是一旦啟動,你就不能再改變它。)
此限制適用于更高級別。如果您有docker run
一個容器,那么它-e
設置環境變量的選項是您必須刪除并重新創建容器才能更改的內容之一。這env:
是 Kubernetes Pod 規范的眾多不可變部分之一;如果不刪除并重新創建 Pod,您也無法更改它。
如果您已通過 Deployment 部署了 pod(您確實應該這樣做),則可以更改 Deployment 規范中的環境變量設置(在源代碼管理中編輯 YAML 文件及其,或直接編輯kubectl apply -f
)kubectl edit
。這將導致 Kubernetes 使用新的日志值啟動新的 pod,并按順序關閉舊的 pod,從而進行零停機更新。?像這樣刪除和重新創建 Pod 是完全正常的,并且每當您想要更改部署內的映像以獲得今天的構建時都會發生。
如果您的應用程序能夠注意到其加載的配置文件的更改(并且必須對其進行專門編碼才能做到這一點),那么另一種適合您的路徑是將 ConfigMap 掛載到容器中;如果更改 ConfigMap 內容,容器看到的文件將會更改,但不會重新啟動。

TA貢獻1818條經驗 獲得超3個贊
您可以運行該命令kubectl exec -it <container_name> bash
并使用容器內的命令行來更改環境變量。您可以通過運行命令export LOG_LEVEL=debug
或export LOG_LEVEL=error
在容器內來完成。

TA貢獻1995條經驗 獲得超2個贊
首先,了解這應該發生在應用程序級別。也就是說,這不是 Kubernetes 應該為你做的事情。
話雖這么說,您可以讓應用程序檢查環境變量的值(您已經在這樣做),并且根據該值是什么,它可以設置應用程序的日志級別。換句話說,讓應用程序代碼輪詢環境變量以查看它是否已更改。
您可以像 Shahaf 建議的那樣注入環境變量,但這需要您exec
進入 pod,這可能并不總是可行或良好的做法。
我建議你跑kubectl set env rs [REPLICASET_NAME] SOME_ENVIRONMENT_VAR=1
。
話雖如此,您需要考慮為什么這很重要。Kubernetes 的構建原則是“ Pod 應該像牛一樣對待,而不是寵物”。這意味著當一個 Pod 不再有用或不同步時,它應該被終止,并且應該啟動一個代表代碼當前狀態的新 Pod 來代替它。
不管你如何去做你需要做的事情,你真的不應該在生產中這樣做,甚至不應該在登臺中這樣做。
相反,讓您的應用程序的基礎環境變量設置適合該環境的日志級別。
- 3 回答
- 0 關注
- 251 瀏覽
添加回答
舉報