首页 > 解决方案 > 如何在部署前将环境变量注入 Kubernetes Pod

问题描述

我需要从我的 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

标签: kuberneteskubernetes-pod

解决方案


实现此目的的一种方法是使用模板工具,例如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/develop/docs/ytt-data-values.md


推荐阅读