如何在Kubernetes pod中使用Docker容器变量



我有一个Flask web应用程序作为Docker映像运行,它被部署到运行在GKE上的Kubernetes pod上。在docker-compose中包含了一些应用程序所需的环境变量。像这样:

...
services:
my-app:
build: 
...
environment:
VAR_1: foo
VAR_2: bar
...

我想在docker-compose.yaml中保留这些环境变量,以便必要时可以在本地运行应用程序。然而,当我使用Kubernetes部署来部署它时,pod中缺少这些变量并抛出错误。我发现解决这个问题的唯一方法是将以下内容添加到我的deployment.yaml:

containers:
- name: my-app
...
env:
- name: VAR_1
value: foo
- name: VAR_2
value: bar
...

是否有办法将这些环境变量的值直接从Docker容器镜像迁移到Kubernetes pod中?

我试着在Kubernetes和Docker文档和Google搜索中研究这个问题,我能找到的唯一解决方案是在deployment.yaml中包含环境变量,但我想将它们保留在docker-compose.yaml中,以便在本地运行容器。我找不到任何解释Docker容器环境变量和Kubernetes环境变量如何交互的内容。

Kompose可以将docker组合文件转换为kubernetes资源:

https://kubernetes.io/docs/tasks/configure-pod-container/translate-compose-kubernetes/

让我们假设docker-compose文件和kubernetes运行方式相同,两者都需要一个准备使用的映像,并基于它调度一个新的pod或容器。

默认情况下,这个镜像接受一组环境变量,发送这些变量:docker-compose以一种方式管理它们,kubernetes以另一种方式管理它们。(语法问题)

所以你可以在compose和kubernetes上使用相同的图像,但是发送env变量的语法会有所不同。

如果你想让它们存在,无论部署和工具,你总是可以硬编码这些环境变量在镜像本身,换句话说,在你用来构建镜像的dockerfile。

我不推荐这种方式,如果你使用的是预构建的官方镜像,它可能不适合你,但下面是一个包含env的dockerfile的例子。

FROM alpine:latest
# this is how you hardcode it
ENV VAR_1 foo
COPY helloworld.sh .
RUN chmod +x /helloworld.sh
CMD ["/helloworld.sh"]

如果你想以更好的方式管理它,你可以在你的docker-compose中使用一个。env文件来更新所有的变量,特别是当你的compose有几个应用程序共享相同的变量时。

app1:
image: ACRHOST/app1:latest
env_file:
- .env

在kubernetes端,你可以创建一个配置映射,将你的pods链接到那个configmap,然后你可以只更新configmap的值。

https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/

kubectl create configmap <map-name> <data-source>

还要注意,你可以直接从你在docker中使用的.env文件中设置你的configmap中的值,查看上面的链接。

docker-compose.yml文件和Kubernetes YAML文件有类似的用途;两者都解释了如何从Docker映像创建容器。但是,只有在运行docker-compose命令时才会读取Compose文件;在部署到Kubernetes时不会读取配置,也不会对映像进行任何永久性更改。

如果某些东西需要设置为环境变量,但实际上与任何特定的部署系统无关,则将其设置为映像的Dockerfile中的ENV。

ENV VAR_1=foo
ENV VAR_2=bar
# and don't mention either variable in either Compose or Kubernetes config

如果你不能这样指定它(例如:,数据库主机名和凭据),那么您需要将其包含在两个文件中,如您所示。请注意,有些配置可能会非常不同;密码可能来自Compose中的主机环境变量,但可能来自Kubernetes Secret。

相关内容

  • 没有找到相关文章

最新更新