背景:
目前我们正在使用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
or test.env
文件:
docker run --env-file prod.env <image>
然后,我们的应用程序根据中定义的环境变量获取其配置prod.env
。
问题:有没有办法从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
如果不可能,建议的方法是什么?
发布于 2019-04-15 14:21:34
env-secret.yaml:
apiVersion: v1
kind: Secret
metadata:
name: env-secret
type: Opaque
stringData:
.env: |-
APP_NAME=Laravel
APP_ENV=local
进入deployment.yaml
或pod.yaml
spec:
...
volumeMounts:
- name: foo
mountPath: "/var/www/html/.env"
subPath: .env
volumes:
- name: foo
secret:
secretName: env-secret
````
发布于 2019-04-15 15:36:30
可以通过使用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
(注意env
将数组作为值)
重复每个值。
无论使用哪种方法,您现在可以定义两个不同的Secrets,一个用于生产,一个用于开发。
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
并将正确的Secret部署到正确的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中指定的值填充其环境变量。
发布于 2020-08-14 16:07:59
kubectl create secret generic test-secrets --from-file=env
https://stackoverflow.com/questions/-100009009
复制相似问题