假设有一个后端应用程序,其私钥存储在 .env 文件中。
对于项目文件结构:
|-App files
|-Dockerfile
|-.env
如果我在本地运行 docker 映像,则可以在 API 请求期间使用有效的公钥正常访问应用程序。但是,如果我使用相同的 docker 映像将容器部署到 AKS 集群中,则应用程序失败。
我想知道 AKS 群集中的容器如何处理 .env 文件。我应该怎么做才能解决这个问题?
假设有一个后端应用程序,其私钥存储在 .env 文件中。
对于项目文件结构:
|-App files
|-Dockerfile
|-.env
如果我在本地运行 docker 映像,则可以在 API 请求期间使用有效的公钥正常访问应用程序。但是,如果我使用相同的 docker 映像将容器部署到 AKS 集群中,则应用程序失败。
我想知道 AKS 群集中的容器如何处理 .env 文件。我应该怎么做才能解决这个问题?
将其移出评论以获得更好的可见性。
首先也是最重要的是 docker 与 kubernetes 不同。在 docker 上有效的东西不会直接在 Kubernetes 上有效。Docker 是一个容器运行时,而 kubernetes 是一个容器编排工具,它位于 docker 之上(现在并不总是containerd使用 docker)。
互联网上有许多资源描述了关键区别。例如,这个来自microsoft docs
首先configmaps并且secrets应该创建:
可以创建不同类型的秘密。
进一步参考configMaps和看起来secrets像environment variables(configmaps 和 secrets 具有相同的结构):
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- ...
env:
-
name: ADMIN_PASS
valueFrom:
secretKeyRef: # here secretref is used for sensitive data
key: admin
name: admin-password
-
name: MYSQL_DB_STRING
valueFrom:
configMapKeyRef: # this is not sensitive data so can be used configmap
key: db_config
name: connection_string
...
下面是使用秘密作为文件安装在特定目录中的示例:
apiVersion: apps/v1
kind: Deployment
metadata:
...
spec:
containers:
- ...
volumeMounts:
- name: secrets-files
mountPath: "/mnt/secret.file1" # "secret.file1" file will be created in "/mnt" directory
subPath: secret.file1
volumes:
- name: secrets-files
secret:
secretName: my-secret # name of the Secret
有一篇很好的文章解释并展示了秘密的用例及其限制,例如大小限制为 1Mb。