同步集群资源

Clusterpedia 的主要功能,便是提供对多集群内的资源进行复杂检索。

通过 PediaCluster 资源来指定该集群中哪些资源需要支持复杂检索,Clusterpedia 会将这些资源实时的通过存储层同步到存储组件

# example
apiVersion: cluster.clusterpedia.io/v1alpha2
kind: PediaCluster
metadata:
  name: cluster-example
spec:
  apiserver: "https://10.30.43.43:6443"
  syncResources:
  - group: apps
    resources:
     - deployments
  - group: ""
    resources:
     - pods
     - configmaps
  - group: cert-manager.io
    versions:
      - v1
    resources:
      - certificates

内置资源同步

PediaCluster 为了方便管理和查看这些同步的资源,用户需要以 Group 为单位来配置资源

syncResources:
 - group: apps
   versions: []
   resources:
     - deployments
     - daemonsets

对于内置资源,不需要填写 versions 字段。

Clusterpedia 会根据该集群内所支持的资源版本自动选择合适的版本来收集, 并且用户无需担心版本转换的问题, Clusterpedia 会开放出该内置资源的所有版本接口。

kubectl get --raw="/apis/clusterpedia.io/v1beta1/resources/apis/apps" | jq
{
  "kind": "APIGroup",
  "apiVersion": "v1",
  "name": "apps",
  "versions": [
    {
      "groupVersion": "apps/v1",
      "version": "v1"
    },
    {
      "groupVersion": "apps/v1beta2",
      "version": "v1beta2"
    },
    {
      "groupVersion": "apps/v1beta1",
      "version": "v1beta1"
    }
  ],
  "preferredVersion": {
    "groupVersion": "apps/v1",
    "version": "v1"
  }
}

可以看到 Clusterpedia 支持 v1v1beta2v1beta1 三个版本的 Deployment

自定义资源同步

相比内置资源,自定义资源在资源版本的配置上会稍有不同。

syncResources:
 - group: cert-manager.io
   versions: []
   resources:
    - certificates

用户同样可以忽略 versions 字段,这时 Clusterpedia 就会同步该 Group 在该集群的前三个版本。

以 cert-manager.io 为例,获取被接入集群中 cert-manager.io 支持的 Group

# 在被接入集群内执行
kubectl get --raw="/apis/cert-manager.io" | jq
{
  "kind": "APIGroup",
  "apiVersion": "v1",
  "name": "cert-manager.io",
  "versions": [
    {
      "groupVersion": "cert-manager.io/v1",
      "version": "v1"
    },
    {
      "groupVersion": "cert-manager.io/v1beta1",
      "version": "v1beta1"
    },
    {
      "groupVersion": "cert-manager.io/v1alpha3",
      "version": "v1alpha3"
    },
    {
      "groupVersion": "cert-manager.io/v1alpha2",
      "version": "v1alpha2"
    }
  ],
  "preferredVersion": {
    "groupVersion": "cert-manager.io/v1",
    "version": "v1"
  }
}

可以看到,被接入集群支持 cert-manager.iov1v1beta1v1alpha3v1alpha2 四个版本。

syncResources.[group].versions 为空时,Clusterpedia 就会以 APIGroup.versions 列表的顺序,收集 v1v1beta1v1alpah3 三个版本,而 v1alpha2 不会被收集

指定自定义资源的同步版本

如果用户指定了 versions,那么就会按照 versions 的配置来收集指定的版本资源。

syncResources:
 - group: cert-manager.io
   versions:
    - v1beta1
   resources:
    - certificates

这时,只会收集 v1beta1 版本。

使用注意

自定义资源收集暂时不支持版本转换,收集了哪些版本,那么就只支持哪些资源版本的收集。

这时在检索多集群资源时,如果 cluster-1 只收集了 v1beta1 版本的资源,而检索请求 v1 版本的资源便会忽略 cluster-1 所收集的 v1beta1 版本

需要用户去协调处理自定义资源在多个集群内的版本情况

同步所有的自定义资源

自定义资源类型和版本会随着 CRD 进行变动,当一个 CRD 被创建时,我们不想同时修改 spec.syncResources 来同步资源,这时我们就可以设置 spec.syncAllCustomResources 来同步所有的自定义资源

spec:
  syncAllCustomResources: true

但是需要注意,使用该功能需要在 clustersynchro-manager 中开启相应的 Feature Gate,具体操作可以参考 同步所有自定义资源

使用通配符来同步资源

使用通配符,收集指定组下的所有类型资源

spec:
  syncResources:
  - group: "apps"
    resources:
    - "*"

通过组通配符可以收集指定的 Group 下的所有类型的资源。

例如上例中,便会同步 apps 下的所有资源

使用通配符,收集所有类型的资源

spec:
  syncResources:
  - group: "*"
    resources:
    - "*"

通过全资源通配符 可以同步集群中的内置资源,自定义资源以及聚合式 API 资源。

使用该功能会创建大量的长连接,所以需要谨慎使用,并且在 clustersynchro-manager 中开启相应的 Feature Gate, 具体操作可以参考 同步所有资源

引用 ClusterSyncResources

ClusterSyncResources 用于定义多个 PediaCluster 共同引用的集群资源同步配置,关于 ClusterSyncResources 可以查看 公共的集群资源同步配置(ClusterSyncResources)

PediaCluster 通过 spec.syncResourceRefName 来设置引用的 ClusterSyncResources

apiVersion: cluster.clusterpedia.io/v1alpha2
kind: ClusterSyncResources
metadata:
  name: global-base
spec:
  syncResources:
    - group: ""
      resources:
        - pods
    - group: "apps"
      resources:
        - "*"
---
apiVersion: cluster.clusterpedia.io/v1alpha2
kind: PediaCluster
metadata:
  name: demo1
spec:
  syncResourcesRefName: "global-base"
  syncResources:
    - group: ""
      resources:
        - pods
        - configmaps

如果 PediaCluster 同时设置了 spec.syncResourcesRefNamespec.syncResources,那么会取两者的并集。

上例中,clusterpedia 会同步 demo1 的 pods 和 confgimaps,以及 apps group 下的所有资源。

查看资源同步状态

我们可以通过 PediaCluster 资源的 Status 来查看资源的信息,同步的资源版本和状态以及存储版本

Status 中,资源会有同步版本存储版本

  • 同步版本是 Clusterpedia 从被同步集群中获取到的资源的版本
  • 存储版本是 Clusterpedia 存储到存储层中的版本
status:
  syncResources:
  - group: apps
    resources:
    - name: deployments
      kind: Deployment
      namespaced: true
      syncConditions:
      - lastTransitionTime: "2022-01-13T04:34:08Z"
        status: Syncing
        storageVersion: v1
        version: v1

通常集群资源的同步版本存储版本是相同的。

但是当接入一个比较老的集群时,集群只提供了 v1beta1 版本的 Deployment 资源,而这时资源的同步版本v1beta1存储版本v1

例如,同步 1.10 版本 Kubernetes 的 Deployment 时,同步状态为:

status:
  syncResources:
  - group: apps
    resources:
    - name: deployments
      kind: Deployment
      namespaced: true
      syncConditions:
      - lastTransitionTime: "2022-01-13T04:34:04Z"
        status: Syncing
        storageVersion: v1
        version: v1beta1

对于自定义资源来说,同步版本存储版本是一致的

接下来

资源同步完成后,便可以访问 Clusterpedia检索资源