我有以下设置:
Dockerfile
公开端口),将其推送到私有注册表并使用 Helm 将其部署到 K8s 集群Helm 配置包括两件事 -
deployment.yaml
(用于实际部署)和 service.yaml
用于定义将请求中继到部署的 pod 的服务。
我的集群在虚拟机中运行(Ubuntu Server 22.04,使用 K8s
microk8s
)因此,如果我想使用主机的网络浏览器访问网络服务,我不能简单地使用集群的内部网络,而是将服务暴露给虚拟机的网络将它连接到主机。
我总是要做
kubectl -n geo patch svc flask-test --patch="{\"spec\":{\"externalIPs\":[\"192.168.122.163\"]}}"
其中 IP 地址是 VM 之一。应用补丁后我有
只有在那之后我的网络浏览器才能真正与服务交互。
有没有一种方法可以在 Kubernetes 中的服务创建后自动应用补丁(通过
--patch
或 --patch-file
)?我虽然将 IP 地址添加到进行部署的 .gitlab-ci.yaml
文件,因为毕竟我可以调用 kubectl
来配置东西,就像我调用 helm
实际部署和设置我的应用程序的服务一样。然而,这有很多缺陷,包括 IP 地址可能会在某个时候更改的事实,因此需要接触以使用该 IP 地址的方式配置的每个存储库。这就是为什么我想将集群相关的配置保留到集群本身。
我会使用 Helm 直接执行此设置,而无需单独的
kubectl patch
步骤。您可以在清单中包含 IP 地址,并在部署时提供一个值。例如:
# templates/service.yaml
spec:
externalIPs:
{{- with .Values.externalIP }}
- {{ . }}
{{- else }}
[]
{{- end }}
重要的是,您不需要为此在
values.yaml
文件中包含特定设置。如果设置了 externalIP
值,那么它将被注入到服务中,但如果没有,将使用一个空列表。
这意味着你可以在命令行提供一个值,比如
helm install -n geo flask-test . \
--set externalIP=192.168.122.163
但是如果该地址发生变化,您也可以在这里更改值
helm upgrade -n geo flask-test . --reuse-values \
--set externalIP=192.168.123.321
在最后一个示例中,我使用了
--reuse-values
,因此 Helm 从上次安装使用的配置开始,并且仅更新 externalIP
值。
您的 CD 系统也可以做到这一点。如果它有某种方式找出 IP 地址是什么,您可以编写脚本在每个存储库中运行此
helm upgrade
命令,而无需实际提交任何内容。您还可以将其与您在问题和评论中描述的一些技术结合起来;如果你可以运行 shell 命令,那么你可以 --set externalIP=$(ip addr show ...)
例如。