k8s 關閉 enableServiceLink-Pod-CPU-內存占用過高
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
特性說明:
enableServiceLinks特性,是k8s提供給pod發現和訪問svc的兩種方案之一(另一種是DNS)。
該特性在pod啟動時,kubelet會將active svc通過env {SVCNAME}_SERVICE_HOST、{SVCNAME}_SERVICE_PORT 形式注冊到container env,應用自身則可以通過env獲取svc訪問地址。
kubectl exec podxxx -nns -- printenv
env的數量過大,一來加劇dockerd內存泄露,二來也會影響exec執行性能(執行前會加載所有env到exec主進程)
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
1. 什么是enableServiceLinks
enableServiceLinks 表示是否將 Service 的相關信息注入到 Pod 的環境變量中,默認是 true。
2. 背景現場:
在很多環境出現dockerd內存資源占用過高,導致整機內存吃緊
過pprof分析,發現大部分內存消耗在exec env上,即在執行kubelet exec或probe時,dockerd會將container env 復制到exec obj上,當未釋放exec積累過多時,現象就是dockerd整體內存過高。
對于解決該問題,分兩個方向解決:
1. probe超時透傳至dockerd,解決exec泄露問題。
2. 當前pod默認都開啟了enableServiceLinks, 導致env過多(部分env 4000+),進一步惡化了該問題。
3. 特性說明:
enableServiceLinks特性,是k8s提供給pod發現和訪問svc的兩種方案之一(另一種是DNS)。
該特性在pod啟動時,kubelet會將active svc通過env {SVCNAME}_SERVICE_HOST、{SVCNAME}_SERVICE_PORT 形式注冊到container env,應用自身則可以通過env獲取svc訪問地址。
kubectl exec podxxx -nns -- printenv
env的數量過大,一來加劇dockerd內存泄露,二來也會影響exec執行性能(執行前會加載所有env到exec主進程)
4. 如何關閉該特性
該特性需要在pod.spec顯式關閉,在專有云場景下,可以在pod webhook中通過標簽過濾指定pod,并關閉該特性。
環境
- kubernetes 1.20.4
- Spring Boot 2.5.0-M3
目標
enableServiceLinks 表示是否將 Service 的相關信息注入到 Pod 的環境變量中,默認是 true。
示例
Pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: spring-k8s
spec:
containers:
- name: spring-k8s
image: jiangbo920827/spring-k8s:liveness
ports:
- containerPort: 8080
查看環境變量
[root@master ~]# kubectl exec spring-k8s -- printenv|grep PG
SVC_PG_SERVICE_HOST=10.110.153.250
SVC_PG_PORT_5432_TCP=tcp://10.110.153.250:5432
SVC_PG_PORT_5432_TCP_PROTO=tcp
SVC_PG_PORT_5432_TCP_ADDR=10.110.153.250
SVC_PG_PORT=tcp://10.110.153.250:5432
SVC_PG_SERVICE_PORT=5432
SVC_PG_PORT_5432_TCP_PORT=5432
刪除環境變量 yaml
apiVersion: v1
kind: Pod
metadata:
name: spring-k8s
spec:
enableServiceLinks: false
containers:
- name: spring-k8s
image: jiangbo920827/spring-k8s:liveness
ports:
- containerPort: 8080
再次通過命令 kubectl exec spring-k8s -- printenv|grep PG 查看,已經沒有相關的環境變量了。
總結
enableServiceLinks 可以設置 Service 環境變量是否注入 Pod 中,但是 k8s 自己默認的環境變量除外。

浙公網安備 33010602011771號