k8s 相当于Docker中的env文件

目前我们正在使用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.env 或 test.env 文件:

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

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

Questions:

有没有办法从Kubernetes中的文件中提供环境变量(例如在定义pod时),而不是像这样对它们进行硬编码:

apiVersion: v1
kind: Pod
metadata: 
  labels: 
    context: docker-k8s-lab
    name: mysql-pod
  name: mysql-pod
spec: 
  containers: 
    - 
      env: 
        - 
          name: MYSQL_USER
          value: mysql
        - 
          name: MYSQL_PASSWORD
          value: mysql
        - 
          name: MYSQL_DATABASE
          value: sample
        - 
          name: MYSQL_ROOT_PASSWORD
          value: supersecret
      image: "mysql:latest"
      name: mysql
      ports: 
        - 
          containerPort: 3306
如果无法做到这一点,建议的方法是什么?
configuration
docker
environment-variables
configuration-files
kubernetes

您可以通过使用Secrets或ConfigMaps填充容器的环境变量 . 当您使用的数据敏感(例如密码)时使用Secrets,而不使用ConfigMaps时使用Secrets .

在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

并重复每一个 Value 观 .

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

DEV-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
PROD-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中指定的值填充其环境变量 .

回答于 十二月 12, 2018
9
A new update for Kubernetes(v1.6) 允许你要求的(几年前) .

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

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

如果发展秘密是您的秘密,您可以通过以下方式创建:

kubectl create secret generic prod-secrets --from-file=prod/env.txt`
txt文件内容是键值的位置:

DB_USER=username_here
DB_PASSWORD=password_here
文档仍然是一些例子,我不得不在那些地方搜索:

Secrets docs,搜索 envFrom - 显示此选项可用 .

The equivalent ConfigMap docs显示了如何使用它的示例 .

回答于 十二月 12, 2018
8
使用YAML文件为Kubernetes定义pod时,没有直接的方法来指定包含容器的环境变量的不同文件 . Kubernetes项目表示他们将来会改善这一领域(见Kubernetes docs) .

与此同时,我建议使用配置工具并将pod YAML作为模板 . 例如,使用Ansible,您的pod YAML文件将如下所示:

档案 my-pod.yaml.template :

apiVersion: v1
kind: Pod
...
spec:
  containers:
  ...
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: {{ mysql_root_pasword }}
    ...

然后你的Ansible playbook可以在方便的地方指定变量 mysql_root_password ,并在创建资源时替换它,例如:

档案 my-playbook.yaml :

- hosts: my_hosts
  vars_files: 
  - my-env-vars-{{ deploy_to }}.yaml
  tasks:
  - name: create pod YAML from template
    template: src=my-pod.yaml.template dst=my-pod.yaml
  - name: create pod in Kubernetes
    command: kubectl create -f my-pod.yaml
 my-env-vars-prod.yaml :

mysql_root_password: supersecret

档案 my-env-vars-test.yaml :

mysql_root_password: notsosecret

https://stackoverflow.com/questions/66665071/providing-a-env-file-in-kubernetes
https://stackoverflow.com/questions/66665071/providing-a-env-file-in-kubernetes