Kubernetes 相当于 Docker 中的 env-file

新手上路,请多包涵

背景:

目前我们正在使用 Docker 和 Docker Compose 来提供我们的服务。我们已将不同环境的配置外部化为定义应用程序读取的环境变量的文件。例如 prod.env 文件:

 ENV_VAR_ONE=Something Prod
ENV_VAR_TWO=Something else Prod

test.env 文件:

 ENV_VAR_ONE=Something Test
ENV_VAR_TWO=Something else Test

因此,我们可以在启动容器时简单地使用 prod.envtest.env 文件:

 docker run --env-file prod.env <image>

然后,我们的应用程序根据 prod.env 中定义的环境变量选择其配置。

问题:

  1. 有没有办法从 Kubernetes 中的文件中提供环境变量(例如在定义 pod 时),而不是像这样对它们进行硬编码:
api版本:v1
种类:豆荚
元数据:
  标签:
    上下文:docker-k8s-lab
    名称:mysql-pod
  名称:mysql-pod
规格:
  容器:
    -
      环境:
        -
          名称:MYSQL_USER
          值:mysql
        -
          名称:MYSQL_PASSWORD
          值:mysql
        -
          名称:MYSQL_DATABASE
          值:样本
        -
          名称:MYSQL_ROOT_PASSWORD
          值:超级机密
      图片:“mysql:最新”
      名称:mysql
      端口:
        -
          容器端口:3306

  1. 如果这是不可能的,建议的方法是什么?

原文由 Johan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 603
2 个回答

您可以通过使用 SecretsConfigMaps 来填充容器的环境变量。当您使用的数据是敏感数据(例如密码)时使用 Secrets,如果不是,则使用 ConfigMaps。

在您的 Pod 定义中指定容器应从 Secret 中提取值:

 apiVersion: v1
kind: Pod
metadata:
  labels:
    context: docker-k8s-lab
    name: mysql-pod
  name: mysql-pod
spec:
  containers:
  - image: "mysql:latest"
    name: mysql
    ports:
    - containerPort: 3306
    envFrom:
      - secretRef:
         name: mysql-secret

请注意,此语法仅在 Kubernetes 1.6 或更高版本中可用。在早期版本的 Kubernetes 上,您必须手动指定每个值,例如:

 env:
- name: MYSQL_USER
  valueFrom:
    secretKeyRef:
      name: mysql-secret
      key: MYSQL_USER

(注意 env 以数组为值)

并为每个值重复。

无论您使用哪种方法,您现在都可以定义两个不同的 Secret,一个用于生产,一个用于开发。

开发-secret.yaml:

 apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
type: Opaque
data:
  MYSQL_USER: bXlzcWwK
  MYSQL_PASSWORD: bXlzcWwK
  MYSQL_DATABASE: c2FtcGxlCg==
  MYSQL_ROOT_PASSWORD: c3VwZXJzZWNyZXQK

产品-secret.yaml:

 apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
type: Opaque
data:
  MYSQL_USER: am9obgo=
  MYSQL_PASSWORD: c2VjdXJlCg==
  MYSQL_DATABASE: cHJvZC1kYgo=
  MYSQL_ROOT_PASSWORD: cm9vdHkK

并将正确的密钥部署到正确的 Kubernetes 集群:

 kubectl config use-context dev
kubectl create -f dev-secret.yaml

kubectl config use-context prod
kubectl create -f prod-secret.yaml

现在,每当 Pod 启动时,它都会根据 Secret 中指定的值填充其环境变量。

原文由 Pixel Elephant 发布,翻译遵循 CC BY-SA 4.0 许可协议

Kubernetes(v1.6)的新更新 允许您(多年前)要求的内容。

您现在可以在 yaml 文件中使用 envFrom 像这样:

   containers:
  - name: django
    image: image/name
    envFrom:
      - secretRef:
         name: prod-secrets

如果 development-secrets 是您的秘密,您可以通过以下方式创建它:

 kubectl create secret generic prod-secrets --from-env-file=prod/env.txt`

其中 txt 文件内容是键值:

 DB_USER=username_here
DB_PASSWORD=password_here

文档仍然是示例湖,我不得不在这些地方进行非常努力的搜索:

注意: 在创建秘密时, --from-file--from-env-file 之间存在差异,如下面的评论中所述。

原文由 Or Duan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题