【问题标题】:How to Inject Environment Variables into Kubernetes Pods Before Deployment如何在部署前将环境变量注入 Kubernetes Pod
【发布时间】:2019-11-16 22:26:49
【问题描述】:

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

【问题讨论】:

  • 你好,也许您需要使用“80”而不是仅使用 80
  • 我已经试过了,还是不行。 :(
  • 你试图做错事。环境变量和容器的端口号没有关系。容器启动后,可以在容器内部访问环境变量。容器的端口描述了创建容器的配置。如果您能多描述一下您的需求,会更容易回答您的问题
  • 如果我理解正确,您需要将环境变量值指定为端口号,那么您正在尝试做相反的事情。查看此页面以获取更多信息kubernetes.io/docs/tasks/inject-data-application/…
  • 我认为this 能按预期回答您的问题-

标签: kubernetes kubernetes-pod


【解决方案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/develop/docs/ytt-data-values.md

【讨论】:

  • 此语法已更改。现在正确的做法是:ytt -f . --data-values-env MYVAL -f test.yml -f values.yml | kubectl apply -f-
【解决方案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 之前将 shell 脚本运行到您的 yaml,最好使用 @ 987654323@ 将解析环境变量并使用 env 变量替换 containerPort 重新生成 yaml 文件。也许这个 github link 可以帮助你为什么 kubectl 永远不会支持变量替换。

【讨论】:

  • sed 对于管道变量替换很有用。
【解决方案3】:

下面的例子有一个环境变量“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"

【讨论】:

  • gr8,但是你如何在 Spring Boot 应用程序中使用它?我正在尝试使用此依赖项在 pod 上使用 kubectl 机密公开:spring-cloud-starter-kubernetes-config,我得到了这个异常:io.fabric8.kubernetes.client.KubernetesClientException
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 2022-01-11
  • 1970-01-01
  • 2020-12-29
  • 2020-03-30
  • 2021-08-19
相关资源
最近更新 更多