将ENV用于Kubernets清单文件中的值

时间:2019-06-07 20:53:42

标签: kubernetes google-kubernetes-engine

我为一个新项目奠定了基础,在该项目中,我们将在具有多种环境(开发,登台,生产)的Google Kubernetes Engine上运行一个应用程序。每个环境都是其自己的GC项目。

我正在写一些清单文件,我想抽象出任何特定于环境的值,以便可以根据要更新/部署到的环境(项目)来重新使用它。

我已经在Kubernetes Secrets中创建了值,并且将它们转化为ENV是很简单的(请参阅DATABASE_URL)。但是,如果我想使用一个变量作为容器映像的值:gcr.io/my-app-production-123:latest,我该如何从一个秘密中传递该值?

这是从清单文件中提取特定于环境的值的正确方法吗?谢谢!

apiVersion: batch/v1
kind: Job
metadata:
  name: db-migrate
spec:
  completions: 1
  template:
    metadata:
      name: db-migrate
    spec:
      restartPolicy: Never
      containers:
      - name: db-migrate
        # how can I reference secret/env for the value of image:?
        image: gcr.io/my-app-production-242920:latest
        args: ["bundle", "exec", "rake", "db:create", "db:migrate"]
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: app-secrets
              key: DATABASE_URL

2 个答案:

答案 0 :(得分:1)

您可能需要使用高级工具来注入这样的变量。我最熟悉的是Helm,但是还有其他工具可以让您将参数注入YAML文件。

您不能按照描述的方式使用机密。您只能使用机密(或配置映射,它们非常相似)来处理mount them as files或将其用于set environment variables。您可以在有限的范围内use environment variables to define other parts of the config;但是如果您查看the API reference for containers,则会明确指出允许使用$(VARIABLE)语法的位置,并且仅允许args:command:和{{1} }。

在Helm中,您可以在YAML文件中使用Go的模板语法,因此可以编写

env:

然后使用类似的方式部署服务

image: gcr.io/my-app-production:{{ .Values.tag }}

但是我很确定没有一种方法可以在纯朴的Kubernetes中参数化Pod(或部署或有状态集或...)。

答案 1 :(得分:0)

您可以将秘密安装在容器中并使用documentation

示例:

"mySubnet" : {
  "Type" : "AWS::EC2::Subnet",
  "Properties" : {
    "VpcId" : { 
      "Ref" : "VPC"   
    },
    "CidrBlock" : "10.0.0.0/24",
    "AvailabilityZone" : {
      "Fn::Select" : [ 
        "0", 
        { 
          "Fn::GetAZs" : "" 
        } 
      ]
    }
  }
}