我目前使用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的例子。 显然,在这个例子中,你需要POST到/ api / v1 / namespaces / default / services,而不是GET。