0

我们有一个多租户 kubernetes 集群,托管各种客户环境。Kubernetes 命名空间用于隔离这些客户环境。这些命名空间中的每一个都配置了一组类似的 k8s 资源(部署、配置映射等)。其中一些资源在命名空间中是相同的,而另一些则不相同。

从持续交付的角度来看,我正在探索以无缝方式对这些相同组件(跨命名空间)进行更改的选项。Git-Ops/Pull-based-Continuous-Delivery 似乎是一种很好的方法,它可以让我们无缝地管理各种集群中的 100 个命名空间。

探索了几个 Git-Ops 工具,例如 ArgoCD、Fluxv2 等……但无法弄清楚这些工具是否可以让您同时(或在可预测的时间窗口内)对多个命名空间进行更改。如果您可以指导/建议我选择正确的工具/方法来执行向多个命名空间的部署,这将很有帮助。了解这些 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在环境/命名空间中是相同的。

app1, cm1, app2,cm2不相同。它们有不同的图像标签、标签等。

4

2 回答 2

1

我正在使用 Fluxv2。我的方法是为 , 等创建具有相同值的图表 common-appcommon-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;

这将生成必要的清单,无论如何都应该与您的存储库同步。

在此处输入图像描述

于 2021-06-18T01:07:54.473 回答
0

我们使用 Flux 将资源部署到我们的 K8s 集群。

这些工具可以让您同时(或在可预测的时间窗口内)对多个命名空间进行更改

是的,Flux 基本上监控您的 git 存储库是否有任何更改并将它们应用于集群。默认情况下,Flux 每 5 分钟检查一次更改,但可以减少(尽管我记得读过任何低于一分钟的内容都可能有问题)。

如果对多个命名空间进行更改,它将一次性应用所有这些。我从来不需要查看是否同时应用了对多个命名空间的所有更改,因为它们通常很快。但是我必须说,正如您所写的那样,我们还没有在“100 多个命名空间”中对其进行测试,但它在少数几个命名空间中运行良好。

于 2021-06-17T22:18:48.063 回答