作者
徐迪,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/clusternet,點贊並支持,也歡迎各種形式的討論與合作。
關於我們
更多關於雲原生的案例和知識,可關注同名【騰訊雲原生】公眾號~
福利:
①公眾號后台回復【手冊】,可獲得《騰訊雲原生路線圖手冊》&《騰訊雲原生最佳實踐》~
②公眾號后台回復【系列】,可獲得《15個系列100+篇超實用雲原生原創干貨合集》,包含Kubernetes 降本增效、K8s 性能優化實踐、最佳實踐等系列。
③公眾號后台回復【白皮書】,可獲得《騰訊雲容器安全白皮書》&《降本之源-雲原生成本管理白皮書v1.0》
③公眾號后台回復【光速入門】,可獲得騰訊騰訊雲專家5萬字精華教程,光速入門Prometheus和Grafana。
【騰訊雲原生】雲說新品、雲研新術、雲游新活、雲賞資訊,掃碼關注同名公眾號,及時獲取更多干貨!!