【问题标题】:GitOps: Roll out changes to k8s resources across multiple namespacesGitOps:跨多个命名空间推出对 k8s 资源的更改
【发布时间】:2021-09-02 15:59:55
【问题描述】:

我们有一个多租户 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-appcommon-servicecommon-cm 在环境/命名空间中是相同的。

app1cm1app2cm2 不相同。它们有不同的图像标签、标签等。

【问题讨论】:

    标签: kubernetes continuous-delivery argocd gitops fluxcd


    【解决方案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;
    

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

    【讨论】:

    • 因此,方法是为每个命名空间创建一个 HelmRelease 并将它们指向同一个 git 存储库。这将确保所有命名空间最终都应用来自同一个 git repo 的更改(我的理解)。这对我来说效果很好。但我想知道我们是否可以通过某种方式来避免创建多个特定于命名空间的 HelmRelease 资源(我在集群中有 100 个命名空间;希望避免重复)。有没有办法自定义流程,从集群中读取命名空间(动态)并应用更改?
    • 不直接在 Flux 中。我相信您正在寻找类似的东西:github.com/fluxcd/flux2/discussions/872
    • 但是我会这样做:
    • 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;
    • 这将生成必要的配置。我将编辑原始帖子以获得正确的格式
    【解决方案2】:

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

    这些工具可让您将更改部署到多个命名空间 同时(或在可预测的时间窗口内)

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 2021-10-13
      • 2012-06-12
      • 1970-01-01
      • 2017-10-28
      相关资源
      最近更新 更多