如何在kubernetes复制控制器yaml文件中使用环境变量

时间:2016-04-08 15:57:59

标签: yaml kubernetes

如何在kubernetes yaml文件中读取环境变量? 例如,我想更改docker图像标记,但不想重写文件,如此

apiVersion: v1
kind: ReplicationController
...
spec:
  containers:
    - name: myapp
      image: myapp:${VERSION}
 ...

有了这个,我可以在不更新yaml文件的情况下kubectl rolling-update

感谢

5 个答案:

答案 0 :(得分:2)

Helm应解决您的配置问题 - link to full list

答案 1 :(得分:2)

如果您想要一个简单,轻巧的方法,则可以尝试使用envsubst。因此,假设您的示例位于bash shell中名为example.yaml的文件中,则将执行:

export VERSION=69
envsubst < example.yaml | kubectl apply -f -

Kustomize的最新版本也可以做到这一点。

答案 2 :(得分:1)

我强烈推荐使用HELM。 https://github.com/kubernetes/helm

您可以使用上述链接中包含的信息安装HELM。这将使helm命令可用。

通过运行helm create YOUR_APP_NAME,它将创建如下的目录结构。

YOUR_APP_NAME/
  Chart.yaml          # A YAML file containing information about the chart
  LICENSE             # OPTIONAL: A plain text file containing the license for the chart
  README.md           # OPTIONAL: A human-readable README file
  values.yaml         # The default configuration values for this chart
  charts/             # OPTIONAL: A directory containing any charts upon which this chart depends.
  templates/          # OPTIONAL: A directory of templates that, when combined with values,
                      # will generate valid Kubernetes manifest files.
  templates/NOTES.txt # OPTIONAL: A plain text file containing short usage notes

values.yaml文件中,您可以设置一些ENV变量,如:

container:
    name: "nginx"
    version: "latest"

ReplicationController文件中,您可以使用以下方式引用变量:

apiVersion: v1
kind: ReplicationController
...
spec:
  containers:
    - name: myapp
      image: {{.Values.container.name}}:{{.Values.container.version}}
...

复制控制器的YAML文件应放在templates目录中。

然后,您可以运行命令helm package YOUR_PACKAGE_NAME。要在K8S群集上安装软件包,您可以运行helm install PACKAGE_NAME

注意:我建议您切换到使用Deployments而不是ReplicationController。请参阅:https://kubernetes.io/docs/user-guide/deployments/

答案 3 :(得分:0)

你应该使用Deploymentkubectl set image this一样使用{{3}}:

kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1

答案 4 :(得分:-2)

也许你的意思是这个?

- name: PUBLIC_URL
  value: "http://gitserver.$(POD_NAMESPACE):$(SERVICE_PORT)"

这是docs指定的内容......但它不再适用于我。