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

pjo*_*hin 3 kubernetes kubernetes-deployment

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

  • 网络API
  • 网络管理员
  • Web任务工作程序节点
  • 数据任务工作者节点
  • ...

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

无论如何,有人可以:

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

最佳解决方案是一种了解名称空间的解决方案,因为我们使用kubernetes名称空间来分隔测试,阶段和产品环境。

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

Abd*_*hin 5

您可以使用所有常见的env变量对创建ConfigMapkye:value

然后,您可以重用configmap在中将configMapas环境的所有值声明为Deployment

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

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

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  SPECIAL_LEVEL: very
  SPECIAL_TYPE: charm
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

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

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

$ kubectl logs -f test-pod 
KUBERNETES_PORT=tcp://10.96.0.1:443
SPECIAL_LEVEL=very
uncommon=uncommon value
SPECIAL_TYPE=charm
...
Run Code Online (Sandbox Code Playgroud)

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