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,并关闭该特性。

 

 

环境

  1. kubernetes 1.20.4
  2. 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 自己默认的环境变量除外。

 

posted @ 2024-07-09 11:44  david_cloud  阅读(157)  评论(0)    收藏  举报