背景:
目前我们正在使用 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
中定义的环境变量选择其配置。
问题:
- 有没有办法从 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
- 如果这是不可能的,建议的方法是什么?
原文由 Johan 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以通过使用 Secrets 或 ConfigMaps 来填充容器的环境变量。当您使用的数据是敏感数据(例如密码)时使用 Secrets,如果不是,则使用 ConfigMaps。
在您的 Pod 定义中指定容器应从 Secret 中提取值:
请注意,此语法仅在 Kubernetes 1.6 或更高版本中可用。在早期版本的 Kubernetes 上,您必须手动指定每个值,例如:
(注意
env
以数组为值)并为每个值重复。
无论您使用哪种方法,您现在都可以定义两个不同的 Secret,一个用于生产,一个用于开发。
开发-secret.yaml:
产品-secret.yaml:
并将正确的密钥部署到正确的 Kubernetes 集群:
现在,每当 Pod 启动时,它都会根据 Secret 中指定的值填充其环境变量。