作者
徐迪,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。
【騰訊雲原生】雲說新品、雲研新術、雲遊新活、雲賞資訊,掃碼關注同名公眾號,及時獲取更多幹貨!!