具有共享环境变量的 K8S 部署

K8S deployments with shared environment variables

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

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

有没有什么地方可以:

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

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

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

您可以 create a ConfigMap 使用所有常见的 key:value 对环境变量。

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

这是取自 kubernetes official docs 的示例。

创建一个包含多个键值对的 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
...

到这里,可以看到提供的环境都可用了

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

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