Kubernetes容器的env变量

时间:2018-08-05 22:51:44

标签: docker kubernetes containers

我想将一些值从Kubernetes yaml文件传递到容器。这些值将在我的Java应用程序中使用System.getenv("x_slave_host")读取。 我有这个dockerfile:

FROM jetty:9.4
...
ARG slave_host
ENV x_slave_host $slave_host
...
$JETTY_HOME/start.jar -Djetty.port=9090

kubernetes yaml文件包含我在env部分中添加的部分:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: master
spec:
  template:
    metadata:
      labels:
        app: master
    spec:
      volumes:
      - name: shared-data
        emptyDir: {}
      containers:
      - name: master
        image: xregistry.azurecr.io/Y:latest
        ports:
        - containerPort: 9090
        volumeMounts:
        - name: shared-data
          mountPath: ~/.X/experiment
      - env:
        - name: slave_host
          value: slavevalue
      - name: jupyter
        image: xregistry.azurecr.io/X:latest
        ports:
        - containerPort: 8000
        - containerPort: 8888
        volumeMounts:
        - name: shared-data
          mountPath: /var/folder/experiment
      imagePullSecrets:
      - name: acr-auth

在本地,当我使用docker compose做同样的事情时,它使用args工作。这是一个片段:

  master:
    image: master
    build:
      context: ./master
      args:
        - slave_host=slavevalue
    ports:
      - "9090:9090"

所以现在我尝试在Kubernetes中做同样的事情。但是,我收到以下错误(在Azure上部署):

    error: error validating "D:\\a\\r1\\a\\_X\\deployment\\kub-deploy.yaml": error validating data: field spec.template.spec.containers[1].name for v1.Container is required; if you choose to ignore these errors, turn validation off with --validate=false

换句话说,如何将我的docker compose文件重写为kubernetes并传递此参数。

谢谢!

2 个答案:

答案 0 :(得分:2)

env部分应添加到容器下方,如下所示:

  containers:
  - name: master
    env:
    - name: slave_host
      value: slavevalue

答案 1 :(得分:2)

除了添加环境变量(例如,您可以直接在Deployment清单中创建ConfigMap(或Secret,具体取决于要存储的数据)并在清单中引用它们。与手动将环境变量添加到几个不同的应用程序相比,这是在应用程序之间共享相同的环境变量的好方法。

请注意,ConfigMap可以由一对或多对key: value组成,并且不仅限于存储环境变量,它只是用例之一。正如我之前提到的,如果数据被归类为敏感数据,请考虑使用Secret

ConfigMap清单的示例,在这种情况下,用于存储环境变量:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-env-var
data:
  slave_host: slavevalue

要创建一个ConfigMap,并使用key=value持有一对kubectl create

kubectl create configmap my-env --from-literal=slave_host=slavevalue

要掌握ConfigMap中配置的所有环境变量,请在清单中使用以下内容:

  containers:
    envFrom:
      - configMapRef:
          name: my-env-var

或者,如果您想从ConfigMap中选择一个包含多个变量的特定环境变量,则:

  containers:
    env:
      - name: slave_host
        valueFrom:
          configMapKeyRef:
            name: my-env-var
            key: slave_host

有关在不同情况下使用ConfigMap的更多示例,请参见此@Kun Li