在 Kubernetes 部署规范中使用环境变量

在 Kubernetes 部署规范中使用环境变量

我目前使用 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。

相关内容