目前我们正在使用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