Clusternet:一款开源的跨云多集群云原生管控利器!
作者:徐迪,Clusternet 项目发起人,腾讯云容器技术专家
PART ONE
摘要
Clusternet (Cluster Internet)是一个兼具多集群管理和跨集群应用编排的开源云原生管控平台,解决了跨云、跨地域、跨可用区的集群管理问题。在项目规划阶段,就是面向未来混合云、分布式云和边缘计算等场景来设计的,支持海量集群的接入和管理、应用分发、流量治理(开发中)等。
PART TWO
如何注册一个集群

Clusternet 在设计的时候,完全采用 add-on 的架构,支持一键部署和安装。各个模块的更多安装方式,详见官方文档[1]。
在注册一个集群的时候,也非常简单,通过安装 clusternet-agent 的 Helm Chart,即可完成一个集群的注册,见如下命令。
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 的主要作用只是用于注册集群,因此权限可以设置的很低,如下是默认的权限设置。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: clusternet:system:bootstrapping
rules:- apiGroups:- "clusters.clusternet.io"resources:- clusterregistrationrequestsverbs:- get- create 所有 Group 为 system:bootstrappers:clusternet:register-cluster-token 的 bootstrap token 都自动拥有注册集群的权限。创建该 bootstrap token 的例子,可以参考如下例子。
$ # 如下命令会创建一个 bootstrap token "07401b.f395accd246ae52d"
$ # 这里你可以更改 yaml 文件,创建出你设定的值
$ kubectl apply -f manifests/samples/cluster_bootstrap_token.yaml 如果使用 ServiceAccount token 来进行注册,像 k3s [4] 就不支持使用 bootstrap token ,可以参考如下的例子创建 ServiceAccount Token 用于注册集群。
$ # 你可以更改如下的 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。
然后可以通过如下命令,查看当前已经注册的集群。
$ # 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-dzqkwclusters.clusternet.io/registered-by: clusternet-agentname: clusternet-dc91021d-2361-4f6d-a404-7c33b9e01118
spec: clusterId: dc91021d-2361-4f6d-a404-7c33b9e01118clusterName: clusternet-cluster-dzqkwclusterType: EdgeCluster
status:caCertificate: REDACTEDdedicatedNamespace: clusternet-dhxfsmanagedClusterName: clusternet-cluster-dzqkwresult: Approvedtoken: REDACTED 一旦 status.result 变为 Approved,就代表该集群已经注册成功。这个时候 clusternet-hub 会为该集群创建一个专属的 namespace,比如上述例子中就分配了一个名为 clusternet-dhxfs 的命名空间,并有一个名为 clusternet-cluster-dzqkw ManagedCluster 的对象与该集群进行关联,所有该集群的状态都会汇报到该对象中。
apiVersion: clusters.clusternet.io/v1beta1
kind: ManagedCluster
metadata:creationTimestamp: "2022-01-20T09:20:30Z"generation: 1labels:clusternet.io/created-by: clusternet-agentclusters.clusternet.io/cluster-id: dc91021d-2361-4f6d-a404-7c33b9e01118clusters.clusternet.io/cluster-name: cls-bx2ro4akname: clusternet-cluster-dzqkwnamespace: clusternet-dhxfsresourceVersion: "545410287"selfLink: /apis/clusters.clusternet.io/v1beta1/namespaces/clusternet-dhxfs/managedclusters/clusternet-cluster-dzqkwuid: 1e6a1003-8309-40c5-8969-c15cdf274a5a
spec:clusterId: dc91021d-2361-4f6d-a404-7c33b9e01118clusterType: EdgeClustersyncMode: Dual
status:allocatable:cpu: 2820mmemory: 8657308KiapiserverURL: https://10.8.0.1:443appPusher: truecapacity:cpu: "6"memory: 12094876Kiconditions:- lastTransitionTime: "2022-01-21T03:33:59Z"message: managed cluster is ready.reason: ManagedClusterReadystatus: "True"type: Readyhealthz: trueheartbeatFrequencySeconds: 180k8sVersion: v1.21.5lastObservedTime: "2022-01-21T03:33:59Z"livez: truenodeStatistics:readyNodes: 3platform: linux/amd64readyz: trueserviceCIDR: 10.4.0.0/14useSocket: true 集群注册上来后,就可以对集群进行管理和应用分发了。我们会在下一次文章中,来介绍如何进行应用分发。
PART THREE
如何访问子集群
通过 Clusternet,可以对注册成功的集群进行进一步地管控。在一些运维的场景中,可能需要对某个子集群进行额外的单独操作,比如查看日志,事件,节点状态等等。
需要纳管的目标子集群可能:
运行在边缘节点上或者是边缘集群,网络条件差,没有暴露外网地址
运行在云上的某个 VPC 内,为了保证安全性,没有做网络打通,或者端口映射
运行在自建机房内
其他情形
Clusternet 为了能够提供一致的管理体验,提供了通用的访问子集群的方案,即可以通过父集群做访问代理,将请求转发到子集群中,却依然可以使用动态的 RBAC。这里 Clusternet 使用的 RBAC 是子集群自己的 RBAC,所以这些 RBAC 中用到的敏感信息并不需要在父集群中保留,做到真正的动态权限访问。
详细的访问链路,如下图所示。
为了方便,Clusternet 也提供了命令行支持,通过 kubectl-clusternet 插件即可上手体验一番。
$ # 安装 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/】

腾源会(WeOpen)是腾讯云成立的汇聚开源项目、开源爱好者、开源领导者的开放社区,致力于帮助开源项目健康成长、开源爱好者能交流协助、开源领导者能发挥领袖价值,让全球开源生态变得更加繁荣。

欢迎关注「腾源会」公众号,期待你的「在看」哦~👇
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
