Kubernetes 公开了比预期更多的环境变量
Kubernetes exposes more environment variables than expected
我在 AWS EKS 集群(版本 1.14)中遇到了 K8s pods 运行 的奇怪行为。这些服务是通过 Helm 3 图表部署的。情况是 pod 接收到的环境变量比预期的多。
pod 规范说变量应该从配置映射中填充。
apiVersion: v1
kind: Pod
metadata:
name: apigw-api-gateway-59cf5bfdc9-s6hrh
namespace: development
spec:
containers:
- env:
- name: JAVA_OPTS
value: -server -XX:MaxRAMPercentage=75.0 -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError
- name: GATEWAY__REDIS__HOST
value: apigw-redis-master.development.svc.cluster.local
envFrom:
- configMapRef:
name: apigw-api-gateway-env # <-- this is the map
# the rest of spec is hidden
配置映射 apigw-api-gateway-env
具有此规范:
apiVersion: v1
data:
GATEWAY__APP__ADMIN_LOPUSH: ""
GATEWAY__APP__CUSTOMER_LOPUSH: ""
GATEWAY__APP__DISABLE_RATE_LIMITS: "true"
# here are other 'GATEWAY__' envs
JMX_AUTH: "false"
JMX_ENABLED: "true"
# here are other 'JMX_' envs
kind: ConfigMap
metadata:
name: apigw-api-gateway-env
namespace: development
如果我请求环境变量列表,我可以从不同的服务中找到值。 'apigw' 应用程序的配置映射中未指定这些值;它们存储在 'lopush' 应用程序的地图中。这是一个示例。
/ # env | grep -i lopush | sort | head -n 4
GATEWAY__APP__ADMIN_LOPUSH=<hidden>
GATEWAY__APP__CUSTOMER_LOPUSH=<hidden>
LOPUSH_GAME_ADMIN_MOBILE_PORT=tcp://172.20.248.152:5050
LOPUSH_GAME_ADMIN_MOBILE_PORT_5050_TCP=tcp://172.20.248.152:5050
我还注意到这种行为在某种程度上与服务启动的顺序有关。那可能只是因为当时某些配置映射不存在。现在看来 pod 从当前命名空间中的所有配置映射接收变量。
以前有人遇到过这个问题吗?是否有可能有其他标准迫使 K8s 从其他地图填充环境?
如果您指的是 _PORT
内容,那是为了与旧的 Docker Container Links 系统兼容。命名空间中的所有服务都会以这种方式自动设置,以便更轻松地从基于 Docker 的旧系统中移动内容。
我在 AWS EKS 集群(版本 1.14)中遇到了 K8s pods 运行 的奇怪行为。这些服务是通过 Helm 3 图表部署的。情况是 pod 接收到的环境变量比预期的多。
pod 规范说变量应该从配置映射中填充。
apiVersion: v1
kind: Pod
metadata:
name: apigw-api-gateway-59cf5bfdc9-s6hrh
namespace: development
spec:
containers:
- env:
- name: JAVA_OPTS
value: -server -XX:MaxRAMPercentage=75.0 -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError
- name: GATEWAY__REDIS__HOST
value: apigw-redis-master.development.svc.cluster.local
envFrom:
- configMapRef:
name: apigw-api-gateway-env # <-- this is the map
# the rest of spec is hidden
配置映射 apigw-api-gateway-env
具有此规范:
apiVersion: v1
data:
GATEWAY__APP__ADMIN_LOPUSH: ""
GATEWAY__APP__CUSTOMER_LOPUSH: ""
GATEWAY__APP__DISABLE_RATE_LIMITS: "true"
# here are other 'GATEWAY__' envs
JMX_AUTH: "false"
JMX_ENABLED: "true"
# here are other 'JMX_' envs
kind: ConfigMap
metadata:
name: apigw-api-gateway-env
namespace: development
如果我请求环境变量列表,我可以从不同的服务中找到值。 'apigw' 应用程序的配置映射中未指定这些值;它们存储在 'lopush' 应用程序的地图中。这是一个示例。
/ # env | grep -i lopush | sort | head -n 4
GATEWAY__APP__ADMIN_LOPUSH=<hidden>
GATEWAY__APP__CUSTOMER_LOPUSH=<hidden>
LOPUSH_GAME_ADMIN_MOBILE_PORT=tcp://172.20.248.152:5050
LOPUSH_GAME_ADMIN_MOBILE_PORT_5050_TCP=tcp://172.20.248.152:5050
我还注意到这种行为在某种程度上与服务启动的顺序有关。那可能只是因为当时某些配置映射不存在。现在看来 pod 从当前命名空间中的所有配置映射接收变量。
以前有人遇到过这个问题吗?是否有可能有其他标准迫使 K8s 从其他地图填充环境?
如果您指的是 _PORT
内容,那是为了与旧的 Docker Container Links 系统兼容。命名空间中的所有服务都会以这种方式自动设置,以便更轻松地从基于 Docker 的旧系统中移动内容。