部署之前如何将环境变量注入Kubernetes Pod

时间:2019-07-06 20:24:05

标签: kubernetes kubernetes-pod

我需要从容器内的环境变量注入容器端口。怎么做?

已通过文档链接: 1. https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/ 2. https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: default
spec:
  containers:
    - name: nginx-container
      image: nginx
      ports:
        - containerPort: $(MY_CONTAINER_PORT)
      env:
        - name: MY_CONTAINER_PORT
          value: 80
error: error validating "nginx-pod-exposed-through-env.yaml": error validating data: ValidationError(Pod.spec.containers[0].ports[0].containerPort): invalid type for io.k8s.api.core.v1.ContainerPort.containerPort: got "string", expected "integer"; if you choose to ignore these errors, turn validation off with --validate=false

3 个答案:

答案 0 :(得分:2)

您不能使用为用于公开端口的Pod定义的环境变量。 Kubernetes希望容器端口的值是整数,但是由于您提供了$(MY_CONTAINER_PORT),因此它表示不允许使用字符串值。

正确的配置是

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: default
spec:
  containers:
    - name: nginx-container
      image: nginx
      ports:
        - containerPort: 80

但是,如果您仍然需要将环境变量指定为containerPort,最好使用 helm 之类的kubernetes程序包管理器,或者在部署到kubernetes之前对Yaml运行shell脚本,最好使用{ {1}}将解析环境变量,并使用env变量代替containerPort来重新生成yaml文件。也许这个github link可能会帮助您为什么kubectl将永远不支持变量替换。

答案 1 :(得分:1)

一种实现此目的的方法是使用诸如ytt之类的模板工具。使用ytt,您可以将清单转换成类似以下模板:

#@ load("@ytt:data", "data")
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: default
spec:
  containers:
    - name: nginx-container
      image: nginx
      ports:
        - containerPort: #@ data.values.port

然后提供一个values.yml,例如:

#@data/values
---
port: 8080

假设原始模板名为test.yml,我们可以像这样运行ytt来生成输出:

$ ytt -f test.yml -f values.yml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: default
spec:
  containers:
  - name: nginx-container
    image: nginx
    ports:
    - containerPort: 8080

然后,ytt实用程序使我们可以在命令行中使用--data-value(或简称为-v)覆盖数据值。更改为端口80的示例:

$ ytt -v port=80 -f test.yml -f values.yml            
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: default
spec:
  containers:
  - name: nginx-container
    image: nginx
    ports:
    - containerPort: 80

您的原始问题听起来像是您想使用环境变量。 --data-values-env支持此功能。使用前缀MYVAL的示例:

$ export MYVAL_port=9000
$ ytt --data-values-env MYVAL -f test.yml -f values.yml   
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: default
spec:
  containers:
  - name: nginx-container
    image: nginx
    ports:
    - containerPort: 9000

然后可以结合使用yttkubectl来创建和应用资源:

ytt --data-values-env MYVAL -f test.yml -f values.yml | kubectl apply -f-

有关将数据注入ytt模板的其他信息,位于https://github.com/k14s/ytt/blob/master/docs/ytt-data-values.md

答案 2 :(得分:0)

下面的示例具有环境变量“ PASSWORD

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
spec:
  containers:
  - name: ubuntu
    image: ubuntu:latest
    command: [ "/bin/bash", "-c", "--" ]
    args: [ "while true; do sleep 30; done;" ]
    env:
    - name: PASSWORD
      value: "password"