我目前使用 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
显然,这种特定的语法还不能工作。但这样的事情可能吗?如果可能的话,如何做?
我宁愿不依赖单独的配置工具。秘密沙ConfigMap
看起来很有希望,但显然它们不能以适合此目的的方式使用。如果我可以直接引用以此方式定义的静态 IP 地址,gcloud compute addresses create service-address
那就最好了。
答案1
一个更简单/更清洁的解决方案:envsubst
在 deploy.yml 中:
LoadbalancerIP: $LBIP
然后只需创建你的环境变量并像这样运行 kubectl:
export LBIP="1.2.3.4"
envsubst < deploy.yml | kubectl apply -f -
您只需将常规 Bash 变量放入要使用的任何文件(在本例中为 YAML 清单)中,然后让 ensubst 读取该文件。它将输出文件,其中环境变量被替换为其值。您还可以使用它来创建新文件,如下所示:
envsubst < input.yml > output.yml
envsubst
例如在 Ubuntu/Debian 软件包中可用gettext
。
答案2
还有另一个令人愉快的简单解决方案:我my-address
定义了一个 Google Compute Address,并且我显然可以在服务规范中使用它,如下所示:loadBalancerIP: my-address
。
有了这个作为 IP 地址和密码秘密的“外部”源,我的简单用例(在 GKE 环境中)就不再需要配置工具(或模板)。
现已过时:sed
毕竟,我已决定使用某种配置工具,即“内置”工具。
我的Deployment.yaml
现在包含一个“模板变量”,例如
loadBalancerIP: $$EXTERNAL_IP
我使用 1.2.3.4 作为外部 IP 地址来部署服务
cat Deployment.yaml | sed s/\$\$EXTERNAL_IP/1.2.3.4/ | kubectl create -f -
答案3
你可以编写一个简单的预处理器来对 yaml 文件进行变量替换(或者你可以使用jsonnet在 json 配置文件上完成同样的事情)。
有一些讨论直接将模板添加到 Kubernetes 配置中但尚未实施或可用。
答案4
直到模板最简单的方法是运行一个作业,使用 Kubernetes API更新服务。基于 alpine 的镜像中的一个简短的 shell 脚本,加上一个 secret(包含 IP 地址)和一个 configmap(包含模板),应该足够简单。困难的部分是正确使用 apiserver 的身份验证和授权功能。
https://stackoverflow.com/questions/30690186/how-do-i-access-the-kubernetes-api-from-within-a-pod-container给出了访问 API 的示例。显然,您需要通过 POST 来/api/v1/命名空间/默认/服务而不是该示例中的 GET。