我为一个新项目奠定了基础,在该项目中,我们将在具有多种环境(开发,登台,生产)的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
答案 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" : ""
}
]
}
}
}