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

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

摘要

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

如何注册一个集群

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

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

在注册一个集群的时候,也非常简单,通过安装 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,也可以是 。

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

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 的例子,可以参考如下例子,

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

如果使用 ServiceAccount token 来进行注册,像 k3s 就不支持使用 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-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 的对象与该集群进行关联,所有该集群的状态都会汇报到该对象中。

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

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

如何访问子集群

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjwfd.html