8

我们有一组部署(一组 pod)都使用相同的 docker 映像。例子:

  • 网页接口
  • 网络管理员
  • Web 任务工作节点
  • 数据任务工作节点
  • ...

它们都需要一组通用的环境变量,例如数据库主机的位置、外部服务的密钥等。它们还具有一组不通用的环境变量。

无论如何,有没有人可以:

  1. 重用定义了环境变量的模板
  2. 从文件加载环境变量并将它们设置在 pod 上

最佳解决方案将是命名空间感知的解决方案,因为我们使用 kubernetes 命名空间将测试、阶段和生产环境分开。

类似于 dockers env_file 的东西会很好。但我找不到与此相关的任何示例或参考。我唯一能找到的是通过秘密设置环境,但这并不干净,冗长,因为我仍然需要为每个部署编写所有环境变量。

4

2 回答 2

15

您可以使用所有常见的 env 变量对创建一个 ConfigMap 。key:value

configMap然后你可以重用 configmap 来声明as environment in的所有值Deployment

这是一个取自kubernetes 官方文档的示例。

创建一个包含多个键值对的 Co​​nfigMap。

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  SPECIAL_LEVEL: very
  SPECIAL_TYPE: charm

使用 envFrom 将所有 ConfigMap 的数据定义为 Pod 环境变量。ConfigMap 中的键成为 Pod 中的环境变量名称。

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
      - configMapRef:
          name: special-config # All the key-value pair will be taken as environment key-value pair
      env:
      - name: uncommon
        value: "uncommon value"
  restartPolicy: Never

您可以在字段中指定不常见的环境变量env

现在,要验证环境变量是否实际可用,请查看日志。

$ kubectl logs -f test-pod 
KUBERNETES_PORT=tcp://10.96.0.1:443
SPECIAL_LEVEL=very
uncommon=uncommon value
SPECIAL_TYPE=charm
...

在这里,可以看到所有提供的环境都可用。

于 2018-04-15T21:17:37.403 回答
0

您可以先添加一个秘密,然后将新创建的秘密使用到您无数的部署文件中,以共享具有值的相同环境变量:

kubectl create secret generic jwt-secret --from-literal=JWT_KEY=my_awesome_jwt_secret_code
apiVersion: apps/v1
kind: Deployment
metadata:
  name: auth-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: auth
  template:
    metadata:
      labels:
        app: auth
    spec:
      containers:
        - name: auth
          image: lord/auth
          resources:
            requests:
              memory: "128Mi"
              cpu: "250m"
            limits:
              memory: "256Mi"
              cpu: "500m"
          env:
            - name: JWT_KEY
              valueFrom:
                secretKeyRef:
                  name: jwt-secret
                  key: JWT_KEY
 process.env.JWT_KEY
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tickets-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tickets
  template:
    metadata:
      labels:
        app: tickets
    spec:
      containers:
        - name: tickets
          image: lord/tickets
          resources:
            requests:
              memory: "128Mi"
              cpu: "250m"
            limits:
              memory: "256Mi"
              cpu: "500m"
          env:
            - name: JWT_KEY
              valueFrom:
                secretKeyRef:
                  name: jwt-secret
                  key: JWT_KEY
 process.env.JWT_KEY
于 2021-05-03T12:30:14.627 回答