前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Clusternet:一款开源的跨云多集群云原生管控利器!

Clusternet:一款开源的跨云多集群云原生管控利器!

作者头像
腾讯云原生
发布2022-01-21 20:40:34
1.2K0
发布2022-01-21 20:40:34
举报

徐迪,Clusternet 项目发起人,腾讯云容器技术专家。

摘要

Clusternet (Cluster Internet)是一个兼具多集群管理和跨集群应用编排的开源云原生管控平台,解决了跨云、跨地域、跨可用区的集群管理问题。在项目规划阶段,就是面向未来混合云、分布式云和边缘计算等场景来设计的,支持海量集群的接入和管理、应用分发、流量治理(开发中)等。

如何注册一个集群

Clusternet 在设计的时候,完全采用 add-on 的架构,支持一键部署和安装。各个模块的更多安装方式,详见官方文档[1]

在注册一个集群的时候,也非常简单,通过安装 clusternet-agent 的 Helm Chart,即可完成一个集群的注册,见如下命令。

代码语言:javascript
复制
helm?repo?add?clusternet?https://clusternet.github.io/charts
helm?install?clusternet-agent?-n?clusternet-system?--create-namespace?\
??--set?parentURL=PLEASE-CHANGE-ME?\
??--set?registrationToken=PLEASE-CHANGE-ME?\
??clusternet/clusternet-agent

这里需要将 PLEASE-CHANGE-ME 替换为对应集群的合理配置。

  • parentURL 是管控集群的 apiserver 地址。
  • registrationToken 是一个可以访问该管控集群的 token,可以是 bootstrap token[2],也可以是 ServiceAccount token[3]

这些 token 的主要作用只是用于注册集群,因此权限可以设置的很低,如下是默认的权限设置

代码语言:javascript
复制
apiVersion:?rbac.authorization.k8s.io/v1
kind:?ClusterRole
metadata:
??name:?clusternet:system:bootstrapping
rules:
??-?apiGroups:
??????-?"clusters.clusternet.io"
????resources:
??????-?clusterregistrationrequests
????verbs:
??????-?get
??????-?create

所有 Group 为 system:bootstrappers:clusternet:register-cluster-token 的 bootstrap token 都自动拥有注册集群的权限。创建该 bootstrap token 的例子,可以参考如下例子。

代码语言:javascript
复制
$?#?如下命令会创建一个?bootstrap?token?"07401b.f395accd246ae52d"
$?#?这里你可以更改?yaml?文件,创建出你设定的值
$?kubectl?apply?-f?manifests/samples/cluster_bootstrap_token.yaml

如果使用 ServiceAccount token 来进行注册,像 k3s[4] 就不支持使用 bootstrap token ,可以参考如下的例子创建 ServiceAccount Token 用于注册集群。

代码语言:javascript
复制
$?#?你可以更改如下的?yaml?文件,再进行?apply?操作
$?#?如下命令可以创建一个?ServiceAccount?token
$?kubectl?apply?-f?manifests/samples/cluster_serviceaccount_token.yaml
$?#?通过如下的命令,即可拿到对应的?ServiceAccount?token
$?kubectl?get?secret?-n?clusternet-system?-o=jsonpath='{.items[?(@.metadata.annotations.kubernetes\.io/service-account\.name=="cluster-bootstrap-use")].data.token}'?|?base64?--decode;?echo

clusternet-agent 安装好了以后,会自动将本集群注册到上述通过 parentURL 指定的管控集群中,用对象 ClusterRegistrationRequest 来标识。每个集群都有一个独一无二的 Cluster ID,用于标识该集群。clusternet-agent 重启或者重建,并不会更改当前注册集群的 ID。

然后可以通过如下命令,查看当前已经注册的集群。

代码语言:javascript
复制
$?#?clsrr?is?an?alias?for?ClusterRegistrationRequest?
$?kubectl?get?clsrr
NAME??????????????????????????????????????????????CLUSTER?ID?????????????????????????????STATUS?????AGE
clusternet-dc91021d-2361-4f6d-a404-7c33b9e01118???dc91021d-2361-4f6d-a404-7c33b9e01118???Approved???3d6h?
$?kubectl?get?clsrr?clusternet-dc91021d-2361-4f6d-a404-7c33b9e01118?-o?yaml?
apiVersion:?clusters.clusternet.io/v1beta1?
kind:?ClusterRegistrationRequest?
metadata:?
??labels:?
????clusters.clusternet.io/cluster-id:?dc91021d-2361-4f6d-a404-7c33b9e01118?
????clusters.clusternet.io/cluster-name:?clusternet-cluster-dzqkw
????clusters.clusternet.io/registered-by:?clusternet-agent
????name:?clusternet-dc91021d-2361-4f6d-a404-7c33b9e01118?
spec:?
??clusterId:?dc91021d-2361-4f6d-a404-7c33b9e01118
??clusterName:?clusternet-cluster-dzqkw
??clusterType:?EdgeCluster
status:
??caCertificate:?REDACTED
??dedicatedNamespace:?clusternet-dhxfs
??managedClusterName:?clusternet-cluster-dzqkw
??result:?Approved
??token:?REDACTED

一旦 status.result 变为 Approved,就代表该集群已经注册成功。这个时候 clusternet-hub 会为该集群创建一个专属的 namespace,比如上述例子中就分配了一个名为 clusternet-dhxfs 的命名空间,并有一个名为 clusternet-cluster-dzqkw ManagedCluster 的对象与该集群进行关联,所有该集群的状态都会汇报到该对象中。

代码语言:javascript
复制
apiVersion:?clusters.clusternet.io/v1beta1
kind:?ManagedCluster
metadata:
??creationTimestamp:?"2022-01-20T09:20:30Z"
??generation:?1
??labels:
????clusternet.io/created-by:?clusternet-agent
????clusters.clusternet.io/cluster-id:?dc91021d-2361-4f6d-a404-7c33b9e01118
????clusters.clusternet.io/cluster-name:?cls-bx2ro4ak
??name:?clusternet-cluster-dzqkw
??namespace:?clusternet-dhxfs
??resourceVersion:?"545410287"
??selfLink:?/apis/clusters.clusternet.io/v1beta1/namespaces/clusternet-dhxfs/managedclusters/clusternet-cluster-dzqkw
??uid:?1e6a1003-8309-40c5-8969-c15cdf274a5a
spec:
??clusterId:?dc91021d-2361-4f6d-a404-7c33b9e01118
??clusterType:?EdgeCluster
??syncMode:?Dual
status:
??allocatable:
????cpu:?2820m
????memory:?8657308Ki
??apiserverURL:?https://10.8.0.1:443
??appPusher:?true
??capacity:
????cpu:?"6"
????memory:?12094876Ki
??conditions:
??-?lastTransitionTime:?"2022-01-21T03:33:59Z"
????message:?managed?cluster?is?ready.
????reason:?ManagedClusterReady
????status:?"True"
????type:?Ready
??healthz:?true
??heartbeatFrequencySeconds:?180
??k8sVersion:?v1.21.5
??lastObservedTime:?"2022-01-21T03:33:59Z"
??livez:?true
??nodeStatistics:
????readyNodes:?3
??platform:?linux/amd64
??readyz:?true
??serviceCIDR:?10.4.0.0/14
??useSocket:?true

集群注册上来后,就可以对集群进行管理和应用分发了。我们会在下一次文章中,来介绍如何进行应用分发。

如何访问子集群

通过 Clusternet,可以对注册成功的集群进行进一步地管控。在一些运维的场景中,可能需要对某个子集群进行额外的单独操作,比如查看日志,事件,节点状态等等。

需要纳管的目标子集群可能:

  • 运行在边缘节点上或者是边缘集群,网络条件差,没有暴露外网地址
  • 运行在云上的某个 VPC 内,为了保证安全性,没有做网络打通,或者端口映射
  • 运行在自建机房内
  • 其他情形

Clusternet 为了能够提供一致的管理体验,提供了通用的访问子集群的方案,即可以通过父集群做访问代理,将请求转发到子集群中,却依然可以使用动态的 RBAC。这里 Clusternet 使用的 RBAC 是子集群自己的 RBAC,所以这些 RBAC 中用到的敏感信息并不需要在父集群中保留,做到真正的动态权限访问。

详细的访问链路,如下图所示。

为了方便,Clusternet 也提供了命令行支持,通过 kubectl-clusternet 插件即可上手体验一番。

代码语言:javascript
复制
$?#?安装?kubectl-clusternet?插件
$?kubectl?krew?install?clusternet
$?kubectl?get?mcls?-A?
NAMESPACE??????????NAME???????CLUSTER?ID?????????????????????????????SYNC?MODE???KUBERNETES???????????????????READYZ???AGE?
clusternet-ml6wg???aws-cd?????6c085c18-3baf-443c-abff-459751f5e3d3???Dual????????v1.18.4??????????????????????true?????4d6h?
clusternet-z5vqv???azure-cd???7dc5966e-6736-48dd-9a82-2e4d74d30443???Dual????????v1.20.4??????????????????????true?????43h?
$?#?通过指定?Cluster?ID,以及对应?Cluster?的?kubeconfig?文件?(这里的?apiserver?地址可以是内网地址)
$?kubectl?clusternet?--cluster-id=7dc5966e-6736-48dd-9a82-2e4d74d30443?--child-kubeconfig=./azure-cd-kubeconfig?get?ns?
NAME????????????????STATUS???AGE
clusternet-system???Active???4d20h?
default?????????????Active???24d?
kube-node-lease?????Active???24d?
kube-public?????????Active???24d?
kube-system?????????Active???24d?
test-nginx??????????Active???11d?
test-systemd????????Active???11d

关于更多使用细节,请扫描下方二维码进行了解。

加入我们

请关注 Clusternet 项目 https://github.com/clusternet/clusternet,点赞并支持,也欢迎各种形式的讨论与合作。

参考资料

[1]

官方文档:?【https://github.com/clusternet/clusternet/blob/main/docs/tutorials/installing-clusternet-with-helm.md】

[2]

bootstrap token: 【https://kubernetes.io/zh/docs/reference/access-authn-authz/bootstrap-tokens/】

[3]

ServiceAccount token: 【https://kubernetes.io/zh/docs/reference/access-authn-authz/authentication/#service-account-tokens】

[4]

k3s: 【https://k3s.io/】

互动赢好礼

精读文章,回答问题赢好礼

Q1:你希望 Clusternet 提供其他什么功能?

Q2:对Clusternet 目前的功能有什么优化建议?

1月24日上午11点由作者选出回答最佳的3位读者,送腾讯怪企鹅暖手枕一个。

重磅介绍

【燎原社】推出了专业而又系统的线下云原生技术实战营,需要系统化深入学习的同学,可扫码报名云原生技术实战营课程,腾讯云技术专家现场教学,3天搞定云原生容器化改造过程中的实际问题,扫码一键直达:

? 往期精选推荐??

点个“在看”每天学习最新技术

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-01-21,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 腾讯云原生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 摘要
  • 如何注册一个集群
  • 如何访问子集群
  • 加入我们
    • 参考资料
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    http://www.vxiaotou.com