在Kubernetes部署规范中使用环境variables

我目前使用Kubernetes规范Deployment.yaml来部署服务。 该规范包括对特定IP地址的逐字引用(在下面标记为<static-ip-address> ):

 spec: type: LoadBalancer loadBalancerIP: <static-ip-address> 

我很担心将密码或IP地址等信息推送到远程Git存储库。 我是否可以通过使用环境variables(例如部署规范和实际部署)来避免这种情况,大致如下:

 spec: type: LoadBalancer loadBalancerIP: ${SERVICE_ADDRESS} 

 export SERVICE_ADDRESS=<static-ip-address> kubectl create -f Deployment.yaml 

显然这个特定的语法不起作用。 但是,这是可能的,如果是这样的话?

我宁愿不依赖于单独的configuration工具 。 Secret s和ConfigMap似乎很有前途,但显然他们不能以适合这个目的的方式消费。 如果我可以直接引用用gcloud compute addresses create service-address定义的静态IP地址,则gcloud compute addresses create service-address最好的gcloud compute addresses create service-address

更简单/更清洁的解决scheme: envsubst

在deploy.yml中:

 LoadbalancerIP: $LBIP 

然后创build你的env var并像这样运行kubectl:

 export LBIP="1.2.3.4" envsubst < deploy.yml | kubectl apply -f - 

您只需将常规的Bashvariables放入您想要使用的任何文件(在本例中为YAML清单),并且可以读取该文件。 它将输出文件的envvariables取代它们的值。 您也可以使用它来创build像这样的新文件:

 envsubst < input.yml > output.yml 

envsubst可在例如Ubuntu / Debian的gettext包中使用。

还有一个令人愉快的简单解决scheme:我定义了一个Google Compute Address my-address ,我可以在服务规范中明确地使用它: loadBalancerIP: my-address

作为IP地址和密码的“外部”来源,对于我的简单用例(在GKE环境中),不再需要configuration工具(或多个模板)。

立即废止:毕竟,我已决定使用各种configuration工具,即“内置” sed

我的Deployment.yaml现在包含一个“模板variables”,例如

 loadBalancerIP: $$EXTERNAL_IP 

我用1.2.3.4作为外部IP地址来部署服务

 cat Deployment.yaml | sed s/\$\$EXTERNAL_IP/1.2.3.4/ | kubectl create -f - 

你可以编写一个简单的预处理器来对你的yaml文件进行variablesreplace(或者你可以使用jsonnet在jsonconfiguration文件上完成同样的事情)。

有一些关于将模板直接添加到Kubernetesconfiguration的讨论,但尚未实现或可用。

在模板可用之前,最简单的方法是运行使用Kubernetes API更新服务的作业。 基于阿尔卑斯山的图片中的一个简短的shell脚本,加上一个秘密(包含IP地址)和一个configmap(包含模板),应该足够简单。 困难的一点是正确使用apiserver的身份validation和授权function。

https://stackoverflow.com/questions/30690186/how-do-i-access-the-kubernetes-api-from-within-a-pod-container给出了一个访问API的例子&#x3002; 显然,在这个例子中,你需要POST到/ api / v1 / namespaces / default / services,而不是GET。