Kubernetes 环境变量运行时更新

Kubernetes 环境变量运行时更新

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.appAPI 部署 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/

相关内容