DaoCloud道客云原生开源项目Clusterpedia,全称The Encyclopedia of Kubernetes clusters,源码查看地址:https://github.com/clusterpedia-io/clusterpedia。

在多集群时代,我们可以通过 cluster-api 来批量创建管理集群,使用 Karmada/Clusternet 来分发部署应用。不过我们貌似还是缺少了什么功能,我们要如何去统一的查看多个集群中的资源呢?

对于单个集群的资源,我们可以使用 kubectl 来查看搜索资源,但是在想要检索多集群的资源时,貌似没有什么趁手的产品可以使用。这个问题不会再困扰你,因为在 DaoCloud道客云原生开源项目Clusterpedia的加持下,你手上的 kubectl 已经可以用来检索多集群资源啦!

例如,使用 kubectl 来获取多个集群下 kube-system 命名空间内的 deployments。

$ kubectl get deployments -n kube-systemCLUSTER     NAME                         READY   UP-TO-DATE   AVAILABLE   AGEcluster-1   calico-kube-controllers      1/1     1            1           63dcluster-1   coredns                      2/2     2            2           63dcluster-2   calico-kube-controllers      1/1     1            1           109dcluster-2   coredns-coredns              2/2     2            2           109dcluster-2   dce-chart-manager            1/1     1            1           109dcluster-2   dce-clair                    1/1     1            1           109d

01 Clusterpedia介绍

Clusterpedia,名字借鉴自 Wikipedia,同样也展现了 Clusterpedia 的核心理念 —— 多集群的百科全书。

通过聚合多集群资源,在兼容 Kubernetes OpenAPI 的基础上额外提供了更加强大的检索功能,让用户更快更方便的在多集群中获取到想要的任何资源。

当然 Clusterpedia 的能力并不仅仅只是检索查看,未来还会支持对资源的简单控制,就像 wiki 同样支持编辑词条一样。

架构设计

Clusterpedia在架构上分为四个部分:

  • Clusterpedia APIServer:以 Aggregated API 的方式注册到 Kube APIServer,通过统一的入口来提供服务。
  • ClusterSynchro Manager:管理用于同步集群资源的 Cluster Synchro。
  • Storage Layer (存储层):用来连接操作具体的存储组件,然后通过存储层接口注册到 Clusterpedia APIServer 和 ClusterSynchro Manager 中。
  • 存储组件:具体的存储设施,例如 mysql, postgres,redis 或者其他图数据库。

另外,Clusterpedia 会使用 PediaCluster 这个自定义资源来实现集群认证和资源收集配置

Clusterpedia 还提供了可以接入 mysql 和 postgres 的默认存储层。

Clusterpedia 并不关心用户所使用的具体存储设置是什么,用户可以根据自己的需求来选择或者实现存储层,然后将存储层以插件的形式注册到 Clusterpedia 中来使用。

特性和功能

  • 支持复杂的检索条件,过滤条件,排序,分页等等
  • 支持查询资源时请求附带关系资源
  • 统一主集群和多集群资源检索入口
  • 兼容 kubernetes OpenAPI, 可以直接使用 kubectl 进行多集群检索, 而无需第三方插件或者工具
  • 兼容收集不同版本的集群资源,不受主集群版本约束,
  • 资源收集高性能,低内存
  • 根据集群当前的健康状态,自动启停资源收集
  • 插件化存储层,用户可以根据自己需求使用其他存储组件来自定义存储层
  • 高可用

02 部署Clusterpedia

关于部署的详细流程,可以查看 README,这里着重介绍了如何使用 clusterpedia。https://github.com/clusterpedia-io/clusterpedia#%E9%83%A8%E7%BD%B2

03 集群资源收集

clusterpedia 部署完成后,我们可以通过 kubectl 来操作 PediaCluster 资源。

$ kubectl get pediaclusters
在 examples 目录下,可以看到 PediaCluster 的示例apiVersion: clusters.clusterpedia.io/v1alpha1kind: PediaClustermetadata:name: cluster-examplespec:apiserverURL: "https://172.30.43.41:6443"caData: ""tokenData: ""certData: ""keyData: ""resources:- group: appsresources:- deployments- group: ""resources:- pods

PediaCluster 在配置上可以分成两部分

  • 集群认证
  • 指定资源收集 .spec.resources

集群认证

caData , tokenData , certData , keyData 字段用于集群的验证。

当前暂时不支持从 ConfigMap 或者 Secret 中获取验证相关的信息,不过已经在 Roadmap 中了。

在设置验证字段时,注意要使用 base64 后的字符串

在 examples 目录下提供了生成用于访问子集群的 rbac yam  clusterpedia_synchro_rbac.yaml ,来方便的获取子集群的权限 token。

在子集群中部署该 yaml,然后获取对应的 token 和 ca 证书。

$ # 当前 kubectl 连接到子集群中$ kubectl apply -f examples/clusterpedia_synchro_rbac.yamlclusterrole.rbac.authorization.k8s.io/clusterpedia-synchro createdserviceaccount/clusterpedia-synchro createdclusterrolebinding.rbac.authorization.k8s.io/clusterpedia-synchro created$ SYNCHRO_TOKEN=$(kubectl get secret $(kubectl get serviceaccount clusterpedia-synchro -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}')$ SYNCHRO_CA=$(kubectl get secret $(kubectl get serviceaccount clusterpedia-synchro -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.ca\.crt}')

复制 ./examples/pediacluster.yaml, 并修改 .spec.apiserverURL 和 .metadata.name 字段,并且将 $SYNCHRO_TOKEN 和 $SYNCHRO_CA 填写到 tokenData 和 caData 中。

使用 kubectl apply 创建。

$ kubectl apply -f cluster-1.yaml
pediacluster.clusters.clusterpedia.io/cluster-1 created

为了方便后续使用,建议再创建一个 cluster-2

资源收集

可以通过设置 spec.resources 字段的 group 和 group 下的 resources 来进行指定收集的资源。

在 status 中我们也可以看到资源的收集状态。

status:conditions:- lastTransitionTime: "2021-12-02T04:00:45Z"message: ""reason: Healthystatus: "True"type: Readyresources:- group: ""resources:- kind: Podnamespaced: trueresource: podssyncConditions:- lastTransitionTime: "2021-12-02T04:00:45Z"status: SyncingstorageVersion: v1version: v1- group: appsresources:- kind: Deploymentnamespaced: trueresource: deploymentssyncConditions:- lastTransitionTime: "2021-12-02T04:00:45Z"status: SyncingstorageVersion: v1version: v1version: v1.22.2

04 资源检索

配置好我们需要收集的资源后,我们就可以进行重头戏了 —— 集群检索

clusterpedia 支持两种资源检索:

  • 兼容 Kubernetes OpenAPI 的资源检索
  • 集合资源 (Collection Resource) 的检索

$ kubectl api-resources | grep pedia.clusterpedia.iocollectionresources     pedia.clusterpedia.io/v1alpha1  false   CollectionResourceresources               pedia.clusterpedia.io/v1alpha1  false   Resources

为了方便我们更好的使用 kubectl 来进行检索,我们可以先通过 make gen-clusterconfig 来为子集群创建用于检索的 ‘快捷方式’。

$ make gen-clusterconfigs./hack/gen-clusterconfigs.shCurrent Context: kubernetes-admin@kubernetesCurrent Cluster: kubernetesServer: https://10.9.11.11:6443TLS Server Name:Insecure Skip TLS Verify:Certificate Authority:Certificate Authority Data: ***Cluster "clusterpedia" set.Cluster "cluster-1" set.

使用 kubectl config get-clusters 可以查看当前支持的集群。

其中 clusterpedia 是一个特殊的 cluster,用于多集群检索,以 kubectl –cluster clusterpedia 的方式来检索多个集群的资源。

多集群资源检索

我们先看一下我们都收集了哪些资源,只有被收集的资源才可以进行检索。

$ kubectl --cluster clusterpedia api-resourcesNAME          SHORTNAMES   APIVERSION   NAMESPACED   KINDpods          po           v1           true         Poddeployments   deploy       apps/v1      true         Deployment

可以看到当前收集并支持 pods 和 deployments.apps 两种资源

查看所有集群的 kube-system 命名空间下的 deployments

$ kubectl --cluster clusterpedia get deployments -n kube-systemCLUSTER     NAME                         READY   UP-TO-DATE   AVAILABLE   AGEcluster-1   calico-kube-controllers      1/1     1            1           63dcluster-1   coredns                      2/2     2            2           63dcluster-2   calico-kube-controllers      1/1     1            1           109dcluster-2   coredns-coredns              2/2     2            2           109dcluster-2   dce-chart-manager            1/1     1            1           109dcluster-2   dce-clair                    1/1     1            1           109d

查看所有集群的 kube-systemdefault 命名空间下的 deployments

$ kubectl --cluster clusterpedia get deployments -A -l "search.clusterpedia.io/namespaces in (kube-system, default)"

查看 cluster-1, cluster-2 两个集群下的 kube-systemdefault 命名空间下中的 deployments

$ kubectl --cluster clusterpedia get deployments -A -l "search.clusterpedia.io/clusters in (cluster-1, cluster-2),\search.clusterpedia.io/namespaces in (kube-system,default)"NAMESPACE     CLUSTER     NAME                         READY   UP-TO-DATE   AVAILABLE   AGEkube-system   cluster-1   calico-kube-controllers      1/1     1            1           63dkube-system   cluster-1   coredns                      2/2     2            2           63ddefault       cluster-1   dao-2048-2048                1/1     1            1           20ddefault       cluster-1   hello-world-server           1/1     1            1           26ddefault       cluster-1   my-nginx                     1/1     1            1           39ddefault       cluster-1   phpldapadmin                 1/1     1            1           40dkube-system   cluster-2   calico-kube-controllers      1/1     1            1           109dkube-system   cluster-2   coredns-coredns              2/2     2            2           109dkube-system   cluster-2   dce-chart-manager            1/1     1            1           109dkube-system   cluster-2   dce-clair                    1/1     1            1           109d

显示数据有删减,略多

查看 cluster-1cluster-2 两个集群下的 kube-systemdefault 命名空间下中的deployments,并根据资源的名字排序

$ kubectl --cluster clusterpedia get deployments -A -l "search.clusterpedia.io/clusters in (cluster-1, cluster-2),\search.clusterpedia.io/namespaces in (kube-system,default),\search.clusterpedia.io/orderby=name"kube-system   cluster-1   calico-kube-controllers      1/1     1            1           63dkube-system   cluster-2   calico-kube-controllers      1/1     1            1           109dkube-system   cluster-1   coredns                      2/2     2            2           63dkube-system   cluster-2   coredns-coredns              2/2     2            2           109ddefault       cluster-1   dao-2048-2048                1/1     1            1           20dkube-system   cluster-2   dce-chart-manager            1/1     1            1           109dkube-system   cluster-2   dce-clair                    1/1     1            1           109dkube-system   cluster-2   dce-registry                 1/1     1            1           109dkube-system   cluster-2   dce-uds-storage-server       1/1     1            1           109ddefault       cluster-1   dd-airflow-scheduler         0/1     1            0           53ddefault       cluster-1   dd-airflow-web               0/1     1            0           53dkube-system   cluster-2   metrics-server               1/1     1            1           109ddefault       cluster-1   my-nginx                     1/1     1            1           39ddefault       cluster-1   nginx-dev                    1/1     1            1           14ddefault       cluster-1   openldap                     1/1     1            1           40ddefault       cluster-1   phpldapadmin                 1/1     1            1           40d

显示数据有删减,略多

指定集群检索

我们如果想要检索指定集群的资源的话,我们可以使用 –cluster 来指定具体的集群名称

$ kubectl --cluster cluster-1 get deployments -ANAMESPACE                     CLUSTER     NAME                                          READY   UP-TO-DATE   AVAILABLE   AGEkubeapps-oidc                 cluster-1   apach2-apache                                 1/1     1            1           35dkube-system                   cluster-1   calico-kube-controllers                       1/1     1            1           63dcert-manager                  cluster-1   cert-manager                                  1/1     1            1           42dcert-manager                  cluster-1   cert-manager-cainjector                       1/1     1            1           42dcert-manager                  cluster-1   cert-manager-webhook                          1/1     1            1           42dkube-system                   cluster-1   coredns                                       2/2     2            2           63ddefault                       cluster-1   dao-2048-2048                                 1/1     1            1           20dkubernetes-dashboard          cluster-1   dashboard-metrics-scraper                     1/1     1            1           54ddefault                       cluster-1   dd-airflow-scheduler                          0/1     1            0           53ddefault                       cluster-1   dd-airflow-web                                0/1     1            0           53d

显示数据有删减,略多

除了 search.clusterpedia.io/clusters 外其余的复杂查询的支持和多集群检索相同。

如果我们要获取一个资源的详情,那么也是需要指定集群才可以。

$ kubectl --cluster cluster-1 -n kube-system get deployments corednsCLUSTER     NAME            READY   UP-TO-DATE   AVAILABLE   AGEcluster-1   apach2-apache   1/1     1            1           35d

复杂检索

clusterpedia 支持以下复杂检索:

  • 指定一个或者多个集群名称
  • 指定一个或者多个命名空间
  • 指定一个或者多个资源名称
  • 指定多个字段的排序
  • 分页功能,可以指定 size 和 offset
  • labels 过滤

对于字段的排序,实际的效果是根据存储层来决定的,默认存储层支持根据 cluster , name , namespace , created_at , resource_version 进行正序或者倒序的排序。

检索条件的传递方式

上面实例中,演示了使用 kubectl 来进行检索,而这些复杂的检索条件通过 label 来传递的。实际上 clusterpedia 还支持直接通过 url query 的传递这些检索条件。

label key 的操作符支持 ==, =, !=, in, not in 对于 size 这个条件,实际上 kubectl 可以通过 –chunk-size 来指定,而不需要通过 label key。

集合资源 (Collection Resource)

在 clusterpedia 还有对资源更加高级的聚合,使用 Collection Resource 可以一次性获取到一组不同类型的资源。

可以先查看一下当前 clusterpedia 支持哪些 Collection Resource。

$ kubectl get collectionresourcesNAME        RESOURCESworkloads   deployments.apps,daemonsets.apps,statefulsets.apps

通过获取 workloads 便可获取到一组 deployment, daemonset, statefulset 聚合在一起的资源 而且 Collection Resource 同样支持所有的复杂查询。

kubectl get collectionresources workloads 会默认获取所有集群下所有命名空间的相应资源。

$ kubectl get collectionresources workloadsCLUSTER     GROUP   VERSION   KIND         NAMESPACE                     NAME                                          AGEcluster-1   apps    v1        DaemonSet    kube-system                   vsphere-cloud-controller-manager              63dcluster-2   apps    v1        Deployment   kube-system                   calico-kube-controllers                       109dcluster-2   apps    v1        Deployment   kube-system                   coredns-coredns                               109dcluster-2   apps    v1        Deployment   dce-acm-agent                 dce-acm-agent                                 84d

在 cluster-1 中增加收集 Daemonset, 输出有删减,太多

由于 kubectl 的限制所以无法在 kubectl 来使用复杂查询,只能通过 url query 的方式来查询。

自定义 Collection Resource

Collection Resource 支持哪些资源是由存储层来提供,而默认存储层未来会支持自定义组合 Collection Resource。

05 对资源进行更复杂的操作

clusterpedia 不仅仅只是用来做资源检索,和 wiki 一样,它也应该具有对资源简单的控制能力,例如 watch, create, delete, update 等操作。

对于写操作,实际会采用双写 + 响应 warning 的方式来完成。

感兴趣的话可以在 issue 中一起讨论。

06 集群的自动发现与收集

clusterpedia 中用来表示集群的资源叫做 PediaCluster, 而不是简单的 Cluster,最主要的原因便是 clusterpedia 设计初衷便是让 clusterpedia 可以建立在已有的多集群管理平台之上。

为了遵循初衷,第一个问题便是不能和已有的多集群平台中的资源冲突, Cluster 便是一个最通用的代表集群的资源名称。

另外为了更好的去接入到已有的多集群平台上,让已经接入的集群可以自动的完成资源收集,我们需要另外的一个集群发现机制。这个发现机制需要解决以下问题:

  • 能够获取到访问集群的认证信息
  • 可以配置触发 PediaCluster 生命周期的 Condition 条件
  • 设置默认的资源收集策略,以及名称前缀等

这个功能会在 Q1 或者 Q2 中开始详细讨论实现。

07 当前进展

clusterpedia 当前处于比较早期的阶段 (v0.0.9-alpha),核心功能刚刚完成,还有很多可以优化的地方,对于这些优化点也都提了对应的 issues,欢迎大家一起讨论

这里简单说一些进入 v0.1.0 版本前的优化点:

  • 从具有 Server-Side Apply 特性的集群中收集到的资源会带有很臃肿的 managedFields 字段, clustersynchro manager 模块会增加相应 feature gate,来允许用户在收集时裁减掉这个字段
  • 同样的臃肿字段 annotations 中的 kubectl.kubernetes.io/last-applied-configuration,也要允许裁剪这个字段
  • 在指定集群获取资源时,如果集群处于异常状态时,应该在响应中添加 warning 来提醒用户
  • 对 PediaCluster 的状态信息有更准确的更新
  • 弱网环境下,资源收集的优化

更多的优化项,大家可以在 issue 中提出新的想法。

08 Roadmap

当前只是暂定的 Roadmap,具体的排期还要看社区的需求程度

2021 Q4

在 2021 的 Q4 阶段会完成上述的优化项,并且完成对自定义资源的收集

  • 详细化资源收集状态
  • 自定义资源的收集

Q1

  • 支持插件化存储层
  • 实现集群的自动发现和收集

Q2

  • 支持对集群资源更多的控制,例如 watch/create/update/delete 等操作
  • 默认存储层支持自定义 Collection Resource
  • 支持请求附带关系资源

09 使用注意

多集群网络连通性

clusterpedia 实际并不会解决多集群环境下的网络连通问题,用户可以使用tower等工具来连接访问子集群,也可以借助 submariner 或者 skupper 来解决跨集群网络问题。

当然您也可以加入我们的企业微信交流群和我们交流互动:http://blog.daocloud.io/wp-content/uploads/kefu.jpeg

DaoCloud 公司简介:「DaoCloud 道客」云原生领域的创新领导者,成立于 2014 年底,拥有自主知识产权的核心技术,致力于打造开放的云原生操作系统为企业数字化转型赋能。产品能力覆盖云原生应用的开发、交付、运维全生命周期,并提供公有云、私有云和混合云等多种交付方式。成立迄今,公司已在金融科技、先进制造、智能汽车、零售网点、城市大脑等多个领域深耕,标杆客户包括交通银行、浦发银行、上汽集团、东风汽车、海尔集团、屈臣氏、金拱门(麦当劳)等。目前,公司已完成了 D 轮超亿元融资,被誉为科技领域准独角兽企业。公司在北京、武汉、深圳、成都设立多家分公司及合资公司,总员工人数超过 350 人,是上海市高新技术企业、上海市“科技小巨人”企业和上海市“专精特新”企业,并入选了科创板培育企业名单。

DaoCloud道客云原生开源项目Clusterpedia(The Encyclopedia of Kubernetes clusters)加持kubectl,检索多集群资源相关推荐

  1. DaoCloud道客云原生开源项目KLTS,全称为Kubernetes Long Term Support,为Kubernetes早期版本提供长期免费的维护支持

    DaoCloud道客的云原生开源项目KLTS,全称为Kubernetes Long Term Support,主要使命是为Kubernetes早期版本提供长期免费的维护支持.KLTS (官网:KLTS ...

  2. 2 月 25 日,论道京城 | 云原生开源项目应用实践报名开启

    在数字化转型的浪潮中,云原生已经逐渐成为人们关注的焦点.开源社区作为云原生技术创新的根据地,为云原生的产业发展打造了丰富的技术生态圈,也在广泛的实践中源源不断地创造着新的机遇. 想知道云原生存储技术实 ...

  3. 今年最火的 Golang 云原生开源项目,可能就是它了!

    来源 | 阿里巴巴云原生公众号 在互联网与云计算技术发展的日新月异过去五年中,应用研发人员对效率与敏捷的极致追求,终于把业界带进了一个崭新的云原生时代.而云原生理念的迅速普及,火了 Docker,红了 ...

  4. 【云原生 | Docker 高级篇】03、搭建 Redis 3主3从集群

    目录 3主3从redis集群配置 一.新建6个docker容器redis实例 二.进入容器redis-node-1并为6台机器构建集群关系 三.链接进入6381作为切入点,查看节点状态 四.​​​​​ ...

  5. 「DaoCloud 道客」云原生一体机:开箱即用,轻松上云

    在当今数字经济时代,应用及其服务既是现代企业的脸面,也是企业运营的中枢脊梁,还是业务收入的主要来源. 据 IDC 预测,从 2018 到 2023 五年内创建的应用数量高达 5 亿,等同于过去 40 ...

  6. DaoCloud道客:云原生多云应用利器-Karmada调度器

    "通过<云原生多云应用利器 - Karmada 总览篇>和 <云原生多云应用利器 - Karmada 控制器> ,为大家介绍了多云相关的简介内容和架构,以及主要的控制 ...

  7. DaoCloud道客:云原生多云应用利器-Karmada控制器

    DaoCloud道客:云原生多云应用利器-Karmada控制器 在上一篇<云原生多云应用利器– Karmada 总览篇>中已经介绍了多云的相关简介的内容和架构.接下来,在这一篇中来一起看看 ...

  8. 「DaoCloud 道客」与中国通服达成战略合作,共建工业互联网共生生态

    近日,上海道客网络科技有限公司 (「DaoCloud 道客」) 与中国通信服务股份有限公司 (中国通服) ,签署战略合作协议.双方将围绕工业互联网.智慧城市.智慧空间.电力行业等开展广泛.深度合作,结 ...

  9. 边缘计算云原生开源方案选型比较

    作者 | LanLiang 来源 | https://zhuanlan.zhihu.com/p/353429279?utm_source=wechat_session&utm_medium=s ...

最新文章

  1. Random在for以及foreach循环中产生相同随机数问题
  2. 贝叶斯网络结构学习之K2算法(基于FullBNT-1.0.4的MATLAB实现)
  3. mysql面试100题及答案_PHP面试100题汇总
  4. excel函数公式html文档,Excel中把计算式转换为运算结果的方法 EXCEL中计算出的公式如何转换成纯文本内容?...
  5. Linux 批量修改文件名
  6. C# 实现多线程的同步方法详解
  7. 使用beego开发多表查询返回字段问题
  8. Leetcode算法题(C语言)9--移动零
  9. 【学习记录】第一章 数据库设计-《SQL Server数据库设计和开发基础篇视频课程》...
  10. 零基础入门语义分割-Task5 模型训练与验证
  11. 沁恒CH582F sleep模式RTC唤醒
  12. echarts饼图legend标识位置
  13. Cadence制作flash焊盘时找不到
  14. 1977-1998全国历年高考状元现状
  15. 计算机电脑主板电池,电脑主板电池怎么放电_主板电池放电要多久_电脑主板电池为啥要放电...
  16. 机器学习之手写数字图片数据处理及识别
  17. 这部史诗级大片,燃到爆!
  18. kali2021安装GVM(openVAS)
  19. 正则表达式之小工具系列
  20. Ipmitool工具安装以及常见使用方法

热门文章

  1. Geometric Search
  2. English trip V2 - 23 Planning for the Future 为未来筹划 Teacher: Corrine
  3. 食疗下火、认知 你身体的 火
  4. VR中Unity UI系统
  5. 三星收购哈曼,物联网领域又迎来一位玩家
  6. Linux同步文件夹rsync无密码自动同步
  7. 计算机基础知识WORD7,计算机基础知识:Word常用操作(7).doc
  8. 【银河麒麟V10】【服务器】numa技术
  9. snagit 如何对录取的视频进行剪切,剪切掉不需要的部分
  10. [转]一个男人该有的气质 (马云原话),二十几岁女孩该有的内涵(杨澜)。