使用共享环境变量进行K8S部署

时间:2018-04-15 19:27:31

标签: kubernetes kubernetes-deployment

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

  • web api
  • 网络管理员
  • web任务工作者节点
  • 数据任务工作节点
  • ...

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

无论如何,还有人可以:

  1. 重用定义了环境变量的模板
  2. 从文件加载环境变量并将其设置在窗格上
  3. 最佳解决方案是名称空间感知,因为我们使用kubernetes名称空间分隔测试,阶段和prod环境。

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

2 个答案:

答案 0 :(得分:2)

您可以create a ConfigMap使用所有常见kye:value对env变量。

然后,您可以重复使用configmap将configMap的所有值声明为Deployment中的环境。

以下是kubernetes official docs

的示例

创建一个包含多个键值对的ConfigMap。

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字段中指定不常见的env变量。

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

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

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

答案 1 :(得分: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