GitOps:跨多个命名空间推出对 k8s 资源的更改
GitOps: Roll out changes to k8s resources across multiple namespaces
我们有一个多租户 kubernetes 集群,托管各种客户环境。 Kubernetes 命名空间用于隔离这些客户环境。这些命名空间中的每一个都配置了一组相似的 k8s 资源(部署、configmap 等)。其中一些资源在命名空间中是相同的,而另一些则不同。
从持续交付的角度来看,我正在探索以无缝方式对这些相同组件(跨命名空间)进行更改的选项。 Git-Ops/Pull-based-Continuous-Delivery 似乎是一个很好的方法,它使我们能够无缝地管理跨各种集群的数百个命名空间。
探索了几个 Git-Ops 工具,例如 ArgoCD、Fluxv2 等...但无法确定这些工具是否可以让您同时(或在可预测的范围内)对多个名称空间进行更改时间 window)。如果您可以 guide/advice 我选择正确的 tool/approach 来执行向多个名称空间的推出,这将很有帮助。了解是否可以自定义这些 Git-Ops 工具来处理此类场景也将是一件好事。
关于如何在我们的 k8s 集群中设置命名空间的说明。
Namespace: customer1
Deployments: app1, common-app, common-service
Configmaps: cm1, common-cm
Namespace: customer2
Deployments: app2, common-app, common-service
Configmaps: cm2, common-cm
common-app
、common-service
、common-cm
在 environments/namespaces 中是相同的。
app1
、cm1
、app2
、cm2
不相同。他们有不同的图像标签、标签等
我们使用 Flux 将资源部署到我们的 K8s 集群。
these tools would let you roll out changes to multiple namespaces
simultaneously (or within a predictable time window)
是的,Flux 基本上会监视您的 git 存储库是否有任何更改并将它们应用到集群。默认情况下 Flux checks for changes every 5 minutes 但可以减少(尽管我记得读过任何低于一分钟的内容都可能有问题)。
如果对多个命名空间进行了更改,它将一次性应用所有这些更改。我不必查看是否同时应用了对多个名称空间的所有更改,因为它们通常很快。
但是我必须说,我们还没有像您写的那样在“100 多个名称空间”中测试它,但它在少数几个名称空间中工作得很好。
我正在使用 Fluxv2。我的方法是为 common-app
、common-service
等创建具有相同值的图表,并在单独的 HelmReleases
上定义命名空间
因此您可以将 common-app
图表放在 clusters/production/charts/common-apps
上,并在多个 HelmReleases
上引用图表路径,看起来像这样
---
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
name: common-apps-customer1
namespace: customer1
labels:
chart: common-apps
spec:
interval: 1m
releaseName: common-apps
chart:
spec:
chart: clusters/production/charts/common-apps
sourceRef:
kind: GitRepository
name: manifests
namespace: flux-system
values:
some_key: some_value
---
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
name: common-apps-customer2
namespace: customer2
labels:
chart: common-apps
spec:
interval: 1m
releaseName: common-apps
chart:
spec:
chart: clusters/production/charts/common-apps
sourceRef:
kind: GitRepository
name: manifests
namespace: flux-system
values:
some_key: some_value
更新
for ns in $(kubectl get ns --no-headers | cut -d " " -f1); do
flux create helmrelease common-apps-$ns \
--source=GitRepository/manifests \
--chart=common-apps \
--release-name=common-apps \
--target-namespace=$ns \
--interval=1m0s \
--export > ./clusters/production/common-apps-$ns.yaml
done;
这将生成必要的清单,无论如何都应该与您的存储库同步。
我们有一个多租户 kubernetes 集群,托管各种客户环境。 Kubernetes 命名空间用于隔离这些客户环境。这些命名空间中的每一个都配置了一组相似的 k8s 资源(部署、configmap 等)。其中一些资源在命名空间中是相同的,而另一些则不同。
从持续交付的角度来看,我正在探索以无缝方式对这些相同组件(跨命名空间)进行更改的选项。 Git-Ops/Pull-based-Continuous-Delivery 似乎是一个很好的方法,它使我们能够无缝地管理跨各种集群的数百个命名空间。
探索了几个 Git-Ops 工具,例如 ArgoCD、Fluxv2 等...但无法确定这些工具是否可以让您同时(或在可预测的范围内)对多个名称空间进行更改时间 window)。如果您可以 guide/advice 我选择正确的 tool/approach 来执行向多个名称空间的推出,这将很有帮助。了解是否可以自定义这些 Git-Ops 工具来处理此类场景也将是一件好事。
关于如何在我们的 k8s 集群中设置命名空间的说明。
Namespace: customer1
Deployments: app1, common-app, common-service
Configmaps: cm1, common-cm
Namespace: customer2
Deployments: app2, common-app, common-service
Configmaps: cm2, common-cm
common-app
、common-service
、common-cm
在 environments/namespaces 中是相同的。
app1
、cm1
、app2
、cm2
不相同。他们有不同的图像标签、标签等
我们使用 Flux 将资源部署到我们的 K8s 集群。
these tools would let you roll out changes to multiple namespaces simultaneously (or within a predictable time window)
是的,Flux 基本上会监视您的 git 存储库是否有任何更改并将它们应用到集群。默认情况下 Flux checks for changes every 5 minutes 但可以减少(尽管我记得读过任何低于一分钟的内容都可能有问题)。
如果对多个命名空间进行了更改,它将一次性应用所有这些更改。我不必查看是否同时应用了对多个名称空间的所有更改,因为它们通常很快。 但是我必须说,我们还没有像您写的那样在“100 多个名称空间”中测试它,但它在少数几个名称空间中工作得很好。
我正在使用 Fluxv2。我的方法是为 common-app
、common-service
等创建具有相同值的图表,并在单独的 HelmReleases
因此您可以将 common-app
图表放在 clusters/production/charts/common-apps
上,并在多个 HelmReleases
上引用图表路径,看起来像这样
---
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
name: common-apps-customer1
namespace: customer1
labels:
chart: common-apps
spec:
interval: 1m
releaseName: common-apps
chart:
spec:
chart: clusters/production/charts/common-apps
sourceRef:
kind: GitRepository
name: manifests
namespace: flux-system
values:
some_key: some_value
---
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
name: common-apps-customer2
namespace: customer2
labels:
chart: common-apps
spec:
interval: 1m
releaseName: common-apps
chart:
spec:
chart: clusters/production/charts/common-apps
sourceRef:
kind: GitRepository
name: manifests
namespace: flux-system
values:
some_key: some_value
更新
for ns in $(kubectl get ns --no-headers | cut -d " " -f1); do
flux create helmrelease common-apps-$ns \
--source=GitRepository/manifests \
--chart=common-apps \
--release-name=common-apps \
--target-namespace=$ns \
--interval=1m0s \
--export > ./clusters/production/common-apps-$ns.yaml
done;
这将生成必要的清单,无论如何都应该与您的存储库同步。