Clusternet:一款開源的跨雲多叢集雲原生管控利器!

騰訊雲原生發表於2022-01-21

作者

徐迪,Clusternet 專案發起人,騰訊雲容器技術專家。

摘要

Clusternet (Cluster Internet)是一個兼具多叢集管理和跨叢集應用編排的開源雲原生管控平臺,解決了跨雲、跨地域、跨可用區的叢集管理問題。 在專案規劃階段,就是面向未來混合雲、分散式雲和邊緣計算等場景來設計的,支援海量叢集的接入和管理、應用分發、流量治理(開發中)等。

如何註冊一個叢集

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,也可以是 ServiceAccount 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

叢集註冊上來後,就可以對叢集進行管理和應用分發了。我們會在下一次文章中,來介紹如何進行應用分發。

如何訪問子叢集

通過 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...,點贊並支援,也歡迎各種形式的討論與合作。

關於我們

更多關於雲原生的案例和知識,可關注同名【騰訊雲原生】公眾號~

福利:

①公眾號後臺回覆【手冊】,可獲得《騰訊雲原生路線圖手冊》&《騰訊雲原生最佳實踐》~

②公眾號後臺回覆【系列】,可獲得《15個系列100+篇超實用雲原生原創乾貨合集》,包含Kubernetes 降本增效、K8s 效能優化實踐、最佳實踐等系列。

③公眾號後臺回覆【白皮書】,可獲得《騰訊雲容器安全白皮書》&《降本之源-雲原生成本管理白皮書v1.0》

③公眾號後臺回覆【光速入門】,可獲得騰訊騰訊雲專家5萬字精華教程,光速入門Prometheus和Grafana。

【騰訊雲原生】雲說新品、雲研新術、雲遊新活、雲賞資訊,掃碼關注同名公眾號,及時獲取更多幹貨!!

相關文章