作者

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

摘要

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

如何注册一个集群

Clusternet 在设计的时候,齐全采纳 add-on 的架构,反对一键部署和装置。各个模块的更多装置形式,详见官网文档。

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

helm repo add clusternet https://clusternet.github.io/chartshelm 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,也能够是 ServiceAccount token。

这些 token 的次要作用只是用于注册集群,因而权限能够设置的很低,如下是默认的权限设置,

apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:  name: clusternet:system:bootstrappingrules:  - 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 clsrrNAME                                              CLUSTER ID                             STATUS     AGEclusternet-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: EdgeClusterstatus:  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/v1beta1kind: ManagedClustermetadata:  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-c15cdf274a5aspec:  clusterId: dc91021d-2361-4f6d-a404-7c33b9e01118  clusterType: EdgeCluster  syncMode: Dualstatus:  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 插件即可上手体验一番。

$ # 装置 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   AGEclusternet-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...,点赞并反对,也欢送各种模式的探讨与单干。

对于咱们

更多对于云原生的案例和常识,可关注同名【腾讯云原生】公众号~

福利:

①公众号后盾回复【手册】,可取得《腾讯云原生路线图手册》&《腾讯云原生最佳实际》~

②公众号后盾回复【系列】,可取得《15个系列100+篇超实用云原生原创干货合集》,蕴含Kubernetes 降本增效、K8s 性能优化实际、最佳实际等系列。

③公众号后盾回复【白皮书】,可取得《腾讯云容器平安白皮书》&《降本之源-云原生老本治理白皮书v1.0》

③公众号后盾回复【光速入门】,可取得腾讯腾讯云专家5万字精髓教程,光速入门Prometheus和Grafana。

【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!