我目前使用 Kubernetes 规范Deployment.yaml
来部署服务。该规范包括对特定 IP 地址的逐字引用(标记<static-ip-address>
如下):
spec:
type: LoadBalancer
loadBalancerIP: <static-ip-address>
我担心将密码或 IP 地址等信息推送到远程 Git 存储库中。我可以通过使用环境变量来避免这种情况,例如使用部署规范和实际部署大致如下:
spec:
type: LoadBalancer
loadBalancerIP: ${SERVICE_ADDRESS}
和
export SERVICE_ADDRESS=<static-ip-address>
kubectl create -f Deployment.yaml
显然,这种特定的语法还不起作用。但是这样的事情可能吗?如果可以,怎么办?
我宁愿不依赖单独的配置工具。Secret s 和ConfigMap
s 看起来很有希望,但显然它们不能以适合此目的的方式使用。如果我可以直接引用使用它定义的静态 IP 地址gcloud compute addresses create service-address
将是最好的。
一个更简单/更清洁的解决方案:
envsubst
在 deploy.yml 中:
然后只需创建您的 env var 并像这样运行 kubectl:
您只需将常规 Bash 变量放入您要使用的任何文件中,在本例中为 YAML 清单,并已 ensubst 读取该文件。它将输出文件,其中 env vars 替换为它们的值。您还可以使用它来创建新文件,如下所示:
envsubst
在例如 Ubuntu/Debiangettext
软件包中可用。还有另一个令人愉快的简单解决方案:我
my-address
定义了一个谷歌计算地址,我显然可以在服务规范中使用它,如下所示loadBalancerIP: my-address
:有了它作为 IP 地址和密码机密的“外部”来源,我的简单用例(在 GKE 环境中)不再需要配置工具(或模板)。
现已过时:
sed
毕竟,我已决定使用某种供应工具,即“内置” 。我
Deployment.yaml
现在包含一个“模板变量”,例如我使用 1.2.3.4 作为外部 IP 地址部署服务
您可以编写一个简单的预处理器来对您的 yaml 文件进行变量替换(或者您可以使用jsonnet在 json 配置文件上完成相同的操作)。
有一些关于将模板直接添加到 Kubernetes 配置中的讨论,但它尚未实现或可用。
在模板可用之前,最简单的方法是运行使用 Kubernetes API更新服务的作业。基于 alpine 的映像中的简短 shell 脚本,加上一个秘密(包含 IP 地址)和一个配置映射(包含模板),应该足够简单。难点在于正确使用 apiserver 的身份验证和授权功能。
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。