我需要从容器内的环境变量注入容器端口。怎么做?
已通过文档链接: 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
答案 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
然后可以结合使用ytt
和kubectl
来创建和应用资源:
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"