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


18

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

显然,此特定语法尚不可用。但是这样的事情有可能吗?

我宁愿不要依赖单独的配置工具秘密 S和ConfigMap小号似乎前途无量,但显然他们不能在适合这个目的的方式被消耗掉。如果我可以直接引用用它定义的静态IP地址,gcloud compute addresses create service-address那将是最佳选择。

Answers:


27

一个更容易/更清洁的解决方案: envsubst

在deploy.yml中:

LoadbalancerIP: $LBIP

然后只需创建您的env var并像这样运行kubectl:

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

您只需将常规的Bash变量放入要使用的任何文件(在本例中为YAML清单)中,便可以读取该文件。它将输出带有env vars值的文件。您还可以使用它来创建新文件,如下所示:

envsubst < input.yml > output.yml

envsubst在例如Ubuntu / Debian gettext软件包中可用。


2
为+1 envsubst。直到现在才知道这一点
user1129682

1
它不是更容易/更清洁,因为它需要单独的工具,默认情况下并非所有系统(例如Mac)上都安装了该工具
Ivan

@Ivan他的问题是“但是这样的事情可能吗?如果可以,怎么办?”,这就是他的问题的答案。问题不是“默认情况下如何使用每个操作系统上可用的工具来做到这一点?”。是的,它比1使用起来容易1)清洁2)更清洁sed。根据您的定义,建议的解决方案sed也不会更容易/更干净,因为sed默认情况下Windows计算机上未安装该解决方案。
Jan Grewe,

尚不清楚您与“ sed”选项进行了比较。
伊万

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 -

1
Jan Grewe的方法更为通用,可以应用于任意数量的变量。我建议您接受他的回答,而不是接受您自己的回答(这种回答不太普遍,需要针对每个其他变量进行调整)。
TekTimmy


0

模板可用之前,最简单的方法是运行一个使用Kubernetes API更新服务的作业。基于高山的映像中的简短外壳脚本,再加上一个秘密(包含IP地址)和一个configmap(包含模板),应该足够简单。困难的地方是正确使用apiserver的身份验证和授权功能。

/programming/30690186/how-do-i-access-the-kubernetes-api-from-within-a-pod-container提供了访问API的示例。显然,在该示例中,您将要发布到/ api / v1 / namespaces / default / services而不是GET。


听起来很有趣,但是请您详细说明一下。您能否给出或指出合适的Shell脚本的示例。
Drux
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.