创建后自动将补丁应用于 Kubernetes 服务

问题描述 投票:0回答:1

我有以下设置:

  • 包含简单的基于 Flask 的 Web 服务的 GitLab 存储库
  • 本地部署的私有 K8s 集群,其中配置了 GitLab 代理和前面提到的存储库正在使用的组运行器
  • 一个 GitLab CICD 管道,它使用内部服务创建自定义镜像(使用
    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 地址的方式配置的每个存储库。这就是为什么我想将集群相关的配置保留到集群本身。

kubernetes gitlab kubernetes-helm cicd
1个回答
0
投票

我会使用 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 ...)
例如。

© www.soinside.com 2019 - 2024. All rights reserved.