导言

随着云计算的普及和多云环境的复杂性增加,组织面临着对多集群管理以及边缘计算的迫切需求。Open Cluster Management(OCM)作为一个开源工具,为管理和监控多个 Kubernetes 集群提供了一种创新性的解决方案。本文将深入探讨 OCM 的多集群架构,以及如何在复杂的 IT 环境中实现高效的管理和协同工作。


OCM 简介

OCM (Open Cluster Management) 是阿里与红帽共同推出的一种 K8s 多集群实现方案。其最大的特色在于采用借鉴了 K8s 控制面组件+Kubelet 架构模式的所谓 “Hub-Agent” 设计架构,通过一个小型轻量级的控制集群,就能够管理多至数千个集群。


OCM与CNCF

OpenClusterManagement(OCM)项目在 21年 11 月 9 日的 CNCF(Cloud Native Computing Foundation) 委员会会议中正式批准为 CNCF 的沙箱项目,并且也吸引了微软 AKS 研发同学的加盟。同时 OCM 社区也即将在 KubeCon 2021 中国的主题演讲里展开介绍 KubeVela 社区和 OCM 社区正在共建的集成特性。

【k8s多集群管理】简介(一):解析 Open Cluster Management(OCM)的多集群架构及应用场景_容器


OCM 架构

在宏观架构设计上 OpenClusterManagement 主要采用了自治管理架构,同时功能组件高度模块化可剪裁。以下是 OCM 多集群架构的主要组成部分:

枢纽集群(Hub 集群)

  • OCM 部署一个中心化的控制平面,即 OCM Hub。
  • Hub 集群使用 MultiClusterHub Operator 来管理、升级和安装 hub 集群组件。
  • Hub 集群使用异步工作请求模型和搜索收集器来聚合来自多个集群的信息。通过数据库,hub 集群维护在其上运行的集群和应用程序的状态。

受管集群(Manged 集群)

  • 受管(managed) 集群指用来定义由 hub 集群管理的其他集群的术语。本地集群是一个术语,它用于定义也是一个受管集群的 hub 集群。这两者的连接使用 klusterlet 进行,这是在受管集群上安装的代理。
  • 受管集群接收并应用来自 hub 集群的请求,并使其能够为受管集群中的集群生命周期、应用程序生命周期、监管以及可观察性提供服务。例如,如果启用了可观察性服务,受管集群会将指标发送到 hub 集群。

【k8s多集群管理】简介(一):解析 Open Cluster Management(OCM)的多集群架构及应用场景_容器_02

OCM功能模块

集群生命周期管理:

  • 集群生命周期定义了在不同基础架构云供应商、私有云和内部数据中心的创建、导入、管理和销毁 Kubernetes 集群的过程。
  • 集群生命周期功能由 multicluster engine for Kubernetes operator 提供。
  • 通过 hub 集群控制台,您可以查看所有集群的聚合的健康状态信息,或者查看多个 Kubernetes 集群的单个健康状况指标。

应用程序生命周期

  • 应用程序生命周期定义了用来管理您所管理的集群中应用程序资源的进程。通过使用多集群应用程序,可以在多个受管集群中部署资源,并对具有高可用性的应用程序的所有方面完全控制 Kubernetes 资源更新。
  • 多集群应用程序使用 Kubernetes 规格,但提供了对资源的部署和生命周期管理进行额外的自动化。
  • 可以设置一个持续 GitOps 环境,以便在开发、临时和生产环境中的集群间自动实现应用程序一致性。

监管

  • 通过监管,可以定义可以强制实现安全合规的策略,或提醒出现违反了环境配置的合规要求的更改,从中央接口在所有管理集群中管理策略和合规性要求。
  • OCM 提供集群间应用程序的一致性管理,用户可以轻松部署和升级应用程序,而无需深入了解底层集群。

自定义插件

  • OCM 有一个名为addon-framework的内置机制 ,可帮助开发人员基于基础组件开发扩展,以便在自定义情况下处理多个集群。
  • 一个典型的插件应该由 Addon Agent 和 Addon Manager 两种组件构成。

【k8s多集群管理】简介(一):解析 Open Cluster Management(OCM)的多集群架构及应用场景_容器_03


应用场景

集群管理

OCM 可以帮助用户轻松地部署和配置集群。通过 OCM,用户可以定义节点的角色、配置集群参数,并自动将这些配置应用于整个集群。

Work 模块可以通过将一个 ManifestWork 的资源写入集群命名空间,非常方便的把资源从hub cluster调度到managed cluster上。

下图为导入集群的过程,通过 ManagedCluster 和 KlusterletAddonConfig 设置集群并为集群添加附加组件。

【k8s多集群管理】简介(一):解析 Open Cluster Management(OCM)的多集群架构及应用场景_容器_04

ManagedCluster 代表 OCM 中已注册或等待接受的 Kubernetes 集群。在受管集群中的 klusterlet 代理负责主动维护/刷新 ManagedClusterhub 集群上相应资源的状态。另一方面,ManagedCluster 从 hub 集群中删除 表示该集群被从 hub 集群中拒绝/放逐。

导入后的集群可以在集群列表 ManagedCluster 中找到,集群 Cluster 支持的操作如下图所示:

【k8s多集群管理】简介(一):解析 Open Cluster Management(OCM)的多集群架构及应用场景_容器_05

其中集群集 ManagedClusterSet 用于将一些托管集群分组为一个“集合”,以便 hub 管理员可以在更高级别上操作这些集群。


k8s 资源部署调度

Kubernetes 用于容器编排,而 OCM 可以用于更高层次的应用部署和更新。管理员可以使用 OCM 定义应用的拓扑结构、配置参数等,然后结合 Kubernetes 进行底层容器的部署和更新。

假设我们想将 nginx 与服务帐户一起部署到“cluster1”中:

apiVersion: work.open-cluster-management.io/v1
kind: ManifestWork
metadata:
  namespace: cluster1
  name: example-manifestwork
spec:
  workload:
    manifests:
      - apiVersion: v1
        kind: ServiceAccount
        metadata:
          namespace: default
          name: my-sa
      - apiVersion: apps/v1
        kind: Deployment
        metadata:
          namespace: default
          name: nginx-deployment
          labels:
            app: nginx
        spec:
          replicas: 3
          selector:
            matchLabels:
              app: nginx
          template:
            metadata:
              labels:
                app: nginx
            spec:
              serviceAccountName: my-sa
              containers:
                - name: nginx
                  image: nginx:1.14.2
                  ports:
                    - containerPort: 80

ManifestWork 用于定义集线器上要应用于托管集群的一组 Kubernetes 资源。在 open-cluster-management 项目中,ManifestWork 必须在集群命名空间中创建资源。在工作项目中实现的工作代理在托管集群上运行,并监视 ManifestWorkhub 集群上集群命名空间中的资源。


除此之外,还可以通过放置 Placement 选定的托管集群来分配工作负载。

Placement API 用于动态选择一组 ManagedCluster 中的一个或多个 ManagedClusterSets ,以便将工作负载部署到这些集群中。

例如,安装 OCM 插件策略后 ,Policy 包含 Placement 映射的插件可以将其分发 Policy 到托管集群。

下图展示了对订阅应用的使用放置规则,可以使用 Placement 按标签或声明选择器过滤集群,而且 Placement 还提供了一些默认的优先级排序器,可用于排序和选择最合适的集群,从而实现资源的高效调度利用。

【k8s多集群管理】简介(一):解析 Open Cluster Management(OCM)的多集群架构及应用场景_云计算_06


与 Argo CD 集成

Argo CD是一种声明式 GitOps 持续交付工具,允许开发人员从现有的 Git 工作流程中定义和控制 Kubernetes 应用程序资源的部署。通过将开放集群管理 (OCM) 与 Argo CD 集成,可以实现跨大量 OCM 托管集群管理 Argo CD 应用程序的自动化和更大的灵活性。

要实现OCM与ArgoCd集成,大致分为以下步骤:

  1. 将 OCM 托管集群注册到 ArgoCD。
  2. 创建集群决策资源生成器的配置。
  3. 授予Argo CD访问OCM资源的权限。
  4. 将至少一个托管集群集绑定到argocd命名空间。
  5. 创建应用集。

【k8s多集群管理】简介(一):解析 Open Cluster Management(OCM)的多集群架构及应用场景_容器_07

应用集 ApplicationSet 引用了先前创建和放置的集群决策资源生成器。这将帮助 Argo CD 确定应用程序应该部署在哪里。由所引用的放置选择的受管理集群可以动态地改变。通过在规范 requeueAfterSeconds 中设置生成器 ApplicationSet,Argo CD 将定期检查引用放置的集群决策,并确保应用程序部署到正确的托管集群。生成的应用集示例如下:

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: guestbook-app
  namespace: argocd
spec:
  generators:
    - clusterDecisionResource:
        configMapRef: ocm-placement-generator
        labelSelector:
          matchLabels:
            cluster.open-cluster-management.io/placement: guestbook-app-placement
        requeueAfterSeconds: 30
  template:
    metadata:
      name: '{{clusterName}}-guestbook-app'
    spec:
      project: default
      source:
        repoURL: 'https://github.com/argoproj/argocd-example-apps.git'
        targetRevision: HEAD
        path: guestbook
      destination:
        name: '{{clusterName}}'
        namespace: guestbook
      syncPolicy:
        automated:
          prune: true
        syncOptions:
          - CreateNamespace=true


总结

Open Cluster Management 的多集群架构为企业提供了在复杂的多云环境中有效管理 Kubernetes 集群的新途径。通过其统一的管理平台、自定义策略和跨云支持,OCM 在多集群环境中的运维和应用部署变得更加简便和灵活。


引用

内容参考

图片来源