【问题标题】:Accessing environment variables from a pod从 pod 访问环境变量
【发布时间】:2022-01-04 06:53:43
【问题描述】:

我编写了 golang 程序,它使用 export var name = somevalue 从系统中设置的环境变量中获取值。

cloudType = os.Getenv("CLOUD_TYPE")
clusterRegion = os.Getenv("CLUSTER_REGION")
clusterType = os.Getenv("CLUSTER_TYPE")
clusterName = os.Getenv("CLUSTER_NAME")
clusterID = os.Getenv("CLUSTER_ID")

如上所述,我的程序尝试使用 getenv func 从系统中设置的 env var 中获取值。如果运行该程序并从 env 变量中获取值,则该程序运行良好。但是当我尝试构建图像并在 pod 中运行它时,它能够从 env var 中获取值。它给出了空值。有什么方法可以从 pod 访问本地环境变量?

【问题讨论】:

  • 环境变量未“在我的系统中设置”。相反,它们被设置在一个进程中,并从那里传递给从那里开始的子进程。这与 Go 无关,顺便说一句,这是操作系统的工作方式。
  • 能否执行到 pod 中,列出环境变量并检查是否能找到您设置的变量?
  • 我没有在 pod 中设置环境变量。我在我的系统中本地设置它。

标签: go kubernetes environment-variables amazon-eks kubernetes-pod


【解决方案1】:

制作一个这样的 yaml 文件来定义配置映射

apiVersion: v1
data:
  CLOUD_TYPE: "$CLOUD_TYPE"
  CLUSTER_REGION: "$CLUSTER_REGION"
  CLUSTER_TYPE: "$CLUSTER_TYPE"
  CLUSTER_NAME: "$CLUSTER_NAME"
  CLUSTER_ID: "$CLUSTER_ID"
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: foo

确保您的配置变量已设置,然后将其应用到您的集群,首先使用 env 替换

envsubst < foo.yaml | kubectl apply -f

然后在 pod 定义中使用 config map

spec:
  containers:
  - name: mypod
    envFrom:
    - configMapRef:
        name: foo

【讨论】:

    【解决方案2】:

    您似乎没有在图像中设置环境变量。

    首先,您需要确保在映像或 pod 中设置了 env。在镜像中,您需要在 Dockerfile 中使用 ENV。 doc。在 Kubernetes pod 中,doc

    其次,您提到要从您的 pod 中获取运行时环境变量,您可以运行以下命令。

    kubectl exec -it ${POD_NAME} -- printenv
    

    【讨论】:

      【解决方案3】:

      ...haven't set the env var in the pod. I set it locally in my system

      在您的主机上设置的环境变量不会自动传递给 Pod。您可以在您的规范中 set the env 并通过您的容器访问。用主机上的变量替换规范中的环境变量的常用方法是使用envsubst &lt; draft-spec.yaml &gt; final-spec.yaml。例如,如果您有规格:

      apiVersion: v1
      kind: Pod
      metadata:
        labels:
          run: busybox
        name: busybox
      spec:
        restartPolicy: Never
        containers:
        - name: busybox
          image: busybox
          imagePullPolicy: IfNotPresent
          command: ["ash","-c","echo ${CONTAINER_MESSAGE}"]
          env:
          - name: CONTAINER_MESSAGE
            value: $HOST_MESSAGE
      

      您可以运行HOST_MESSAGE='hello, world!' envsubst '{$HOST_MESSAGE}' &lt; busybox.yaml | kubectl apply -f -。这会将 $HOST_MESSAGE 替换为“你好,世界!”但不会触及 ${CONTAINER_MESSAGE}。这种方法不依赖于 ConfigMap,它允许您在部署后使用kubectl set env 来更新变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-30
        • 2010-11-21
        • 2016-01-20
        • 1970-01-01
        • 2018-02-20
        • 2019-12-24
        相关资源
        最近更新 更多