首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Kubernetes相当于Docker中的env文件

Kubernetes相当于Docker中的env文件
EN

Stack Overflow用户
提问于 2019-04-15 05:43:03
回答 3查看 0关注 0票数 0

背景:

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

如果不可能,建议的方法是什么?

EN

回答 3

Stack Overflow用户

发布于 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.yamlpod.yaml

spec:
  ...
        volumeMounts:
        - name: foo
          mountPath: "/var/www/html/.env"
          subPath: .env
      volumes:
      - name: foo
        secret:
          secretName: env-secret
````
票数 0
EN

Stack Overflow用户

发布于 2019-04-15 15:36:30

可以通过使用SecretsConfigMaps填充容器的环境变量。当您使用的数据敏感(例如密码)时使用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中指定的值填充其环境变量。

票数 0
EN

Stack Overflow用户

发布于 2020-08-14 16:07:59

kubectl create secret generic test-secrets --from-file=env

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100009009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档