Kubernetes 使用环境变量提供有关其他服务的信息(向同一命名空间中所有正在运行的 pod 提供)。例如:
"UIMANAGEMENT_V6_2_2_SERVICE_PORT_HTTP": "80"
"UIMANAGEMENT_V6_2_2_SERVICE_PORT_GRPC": "5111"
"UIMANAGEMENT_V6_2_2_SERVICE_PORT": "80"
"UIMANAGEMENT_V6_2_2_SERVICE_HOST": "10.110.7.1"
- ...
UIMANAGEMENT_V6_2_2
我们的服务部署名称在哪里。
我们想使用这些数据来实现简单的服务发现,但我刚刚发现,当在集群中部署新服务时,这些信息不会在运行时更新到已经运行的 pod 中。这只是 k8s 配置问题,还是当前不支持运行时更新?
谢谢。
答案1
Kubernetes 不支持更新正在运行的 pod 上的环境变量。
但是,如果您将 pod 部署到 Kubernetes 中deployment.apps
,则可以编辑部署中的环境变量,这将导致 Kubernetes 使用新环境变量的值部署 pod 的新实例,并使用旧变量值终止旧 pod。
例如,如果你使用Pod
如下 API 部署一个 pod:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
env:
- name: TEST_VAR
value: "123"
您将无法kubectl edit pod nginx-pod
更新 的值设置TEST_VAR
。如果您想要更新TEST_VAR
环境变量,则需要删除 pod 并使用更新的值“手动”重新创建它。
您应该使用Deployment.app
API 部署 pod,如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
env:
- name: TEST_VAR
value: "123"
这将允许您执行kubectl edit deployments.apps nginx-deployment
,甚至更轻松地kubectl set env deployment/nginx-deployment TEST_VAR="456"
,来更新TEST_VAR
值。 Kubernetes 将为您删除并重新创建 pod。
答案2
服务应该位于 k8s 服务负载均衡器后面,因此无需更新,因为 k8s 服务将跟踪其 pod。
如果你必须与特定的 pod 对话,例如在 deamonset 中,你可以设置 k8s headless 服务
看https://kubernetes.io/docs/concepts/services-networking/service/