公众号关注 「奇妙的 Linux 世界」
设为「星标」,每天带你玩转 Linux !
Clusternet(Cluster Internet)
是一个腾讯开源的 Kubernetes 多集群管理云原生项目,可帮助你像访问 Internet 一样轻松管理数以百万计的 Kubernetes 集群。
无论集群运行在公共云、私有云、混合云还是边缘,Clusternet 都可以让你管理/访问它们,就像它们在本地运行一样。这也有助于消除为每个集群处理不同管理工具的需要。Clusternet 还可以帮助你从托管集群中的一组 API 将应用程序部署和协调到多个集群。当你的集群在 VPC 网络、边缘或防火墙后面运行时,Clusternet 可以通过可配置的方式设置网络隧道。
Clusternet
还提供了一个 Kubernetes 风格的 API,你可以继续使用 Kubernetes 的方式,比如 KubeConfig
,来访问某个管理的 Kubernetes 集群,或者一个 Kubernetes 服务。
以 Clusternet
项目为基础实现多云多集群管理平台,为用户提供跨云、跨集群、跨 region/zone 的分布式容器服务,将更好的满足多种场景需求。
1架构
下图是 Clusternet 的一个简单的架构图:
Clusternet 主要由 clusternet-agent
和 clusternet-hub
两个组件组成,非常轻量级。
其中 clusternet-agent
组件需要部署在各个子集群中,主要负责:
-
将当前集群作为子集群自动注册到父集群,也称为子集群
ManagedCluster
-
上报当前集群元信息,包括 Kubernetes 版本、运行平台、healthz/readyz/livez 健康状态、节点状态等
-
与父集群建立一个 TCP 全双工的 websocket 安全隧道连接
clusternet-hub
组件部署和运行在父集群中,通过 AA(Aggregated APIServer)
的方式进行工作,主要负责:
-
批准各个子集群注册请求,并为子集群创建专用资源,例如 namespace、ServiceAccount 和 RBAC 规则等
-
作为聚合的 apiserver (AA),用作 websocket 服务器,维护来自子集群的多个 websocket 连接
-
提供 Kubernstes 风格的 REST API 来重定向/代理/升级请求到每个子集群 ( 从一组 API 协调应用程序并将其部署到多个集群;
📌 📌 注意:由于
clusternet-hub
作为AA
运行,所以需要确保父级 apiserver 可以访问该 clusternet-hub 服务。
2概念
对于每个想要被管理的 Kubernetes 集群,我们称之为子集群,子集群注册到的集群,我们称之为父集群。组件 clusternet-agent
在子集群中运行,clusternet-hub
在父集群中运行。Clusternet 支持向不同集群分发和管理各种应用资源,包括原生 Kubernetes 各类资源(Deployment/StatefulSet/ConfigMap/Secret 等)、各类 CRD 资源,以及 HelmChart 应用等等。
下图是 Clusternet 的多集群应用分发模型,其中绿色的模块是需要用户去创建的,紫色的模块是 Clusternet 内部做流转的资源对象,此外 Clusternet 还提供了 kubectl 插件,可以通过 kubectl clusternet apply
命令来创建资源。
-
ClusterRegistrationRequest
是clusternet-agent
在父集群中为子集群注册创建的对象 -
ManagedCluster
是clusternet-hub
在批准ClusterRegistrationRequest
后在父集群中创建的一个对象 -
HelmChart
是一个 helm chart 配置的对象 -
Subscription
定义了订阅者想要安装到集群中的资源,对于每个匹配的集群,将在其专用命名空间中创建一个相应的Base
对象 -
Localization
和Globalization
将以优先级来定义 Override,数字越小则优先级越低,Localization
是命名空间范围的资源,而Globalization
是集群范围的。 -
Base
对象将被渲染为应用了Globalization
和Localization
设置Description
对象,Descritpion
是最终要部署到目标子群中的资源
3部署
从上面的架构可以看出我们需要在子集群和父集群中分别部署 clusternet-agent
和 clusternet-hub
组件。
首先在集群中 Clone 项目代码:
$ git clone https://github.com/clusternet/clusternet.git
在父集群中部署 clusternet-hub
组件:
$ kubectl apply -f deploy/hub
然后为 clusternet-agent
创建一个 bootstrap token:
$ # 下面命令将创建一个 bootstrap token:07401b.f395accd246ae52d $ kubectl apply -f manifests/samples/cluster_bootstrap_token.yaml
点击上方图片,打开小程序,『美团外卖』红包免费领!
然后在子集群中部署 clusternet-agent
,帮助子集群注册到父集群,clusternet-agent
可以配置以下三种同步模式(通过标志 --cluster-sync-mode
配置):
-
Push(推)
模式是指父集群的所有资源变化将由clusternet-hub
自动同步、推送并应用到子集群 -
Pull(拉)
模式表示clusternet-agent
将自动 watch、同步和应用所有从父集群到子集群的资源变化 -
Dual
推拉结合模式,这种模式强烈推荐,通常与特性AppPusher
一起使用
特性 AppPusher
在 agent 端工作,这主要是出于以下两个原因:
-
不建议在注册后改变同步模式,这可能会带来不一致的配置和行为,这就是为什么强烈推荐双模式。当双模式被设置后,
AppPusher
提供了一种方法来帮助将 Push 模式切换到 Pull 模式,而无需真正更改标志--cluster-sync-mode
,反之亦然。 -
出于安全考虑,如子集群的安全风险等。
-
当一个子集群禁用
AppPusher
时,父集群不会向其部署任何应用程序,即使设置为Push
或Dual
模式,这个时候,这个子集群的工作方式就像Pull
模式。 -
要部署的资源被表示为
Description
对象,你也可以运行你自己的控制器来 watch 该对象的变化,然后来分发和部署资源。
-
部署 clusternet-agent
后,首先要创建一个包含集群注册用的 Token 的 Secret:
$ # create namespace clusternet-system if not created $ kubectl create ns clusternet-system $ # here we use the token created above $ PARENTURL=https://192.168.10.10 REGTOKEN=07401b.f395accd246ae52d envsubst < ./deploy/templates/clusternet_agent_secret.yaml | kubectl apply -f -
上面的 PARENTURL
是你想注册的父集群的 apiserver 地址,必须指定 https 方案,它是目前唯一支持的方案。如果 apiserver 不是在标准的 https 端口(:443)上监听,请在 URL 中指定端口号,以确保代理连接到正确的端点,例如 https://192.168.10.10:6443
。
$ # 部署之前,根据自己的需求更新同步模式 $ kubectl apply -f deploy/agent
部署完成后检查集群注册情况:
$ # clsrr 是 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: EdgeClusterSelfProvisioned status: caCertificate: REDACTED dedicatedNamespace: clusternet-dhxfs managedClusterName: clusternet-cluster-dzqkw result: Approved token: REDACTED
在 ClusterRegistrationRequest
被批准后,状态将被更新,如果需要的话,可以用相应的凭证来访问父集群。这些凭证已经用指定范围内的 RBAC 规则设置了,可以查看下面的两个规则。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: annotations: clusternet.io/autoupdate: "true" labels: clusters.clusternet.io/bootstrapping: rbac-defaults clusters.clusternet.io/cluster-id: dc91021d-2361-4f6d-a404-7c33b9e01118 clusternet.io/created-by: clusternet-hub name: clusternet-dc91021d-2361-4f6d-a404-7c33b9e01118 rules: - apiGroups: - clusters.clusternet.io resources: - clusterregistrationrequests verbs: - create - get - apiGroups: - proxies.clusternet.io resourceNames: - dc91021d-2361-4f6d-a404-7c33b9e01118 resources: - sockets verbs: - '*' --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: annotations: clusternet.io/autoupdate: "true" labels: clusters.clusternet.io/bootstrapping: rbac-defaults clusternet.io/created-by: clusternet-hub name: clusternet-managedcluster-role namespace: clusternet-dhxfs rules: - apiGroups: - '*' resources: - '*' verbs: - '*'
然后检查被管理集群的状态:
$ # mcls 是 ManagedCluster 对象的别名 $ # kubectl get mcls -A $ # or append "-o wide" to display extra columns $ kubectl get mcls -A -o wide NAMESPACE NAME CLUSTER ID CLUSTER TYPE SYNC MODE KUBERNETES READYZ AGE clusternet-dhxfs clusternet-cluster-dzqkw dc91021d-2361-4f6d-a404-7c33b9e01118 EdgeClusterSelfProvisioned Dual v1.19.10 true 7d23h $ kubectl get mcls -n clusternet-dhxfs clusternet-cluster-dzqkw -o yaml apiVersion: clusters.clusternet.io/v1beta1 kind: ManagedCluster metadata: labels: clusters.clusternet.io/cluster-id: dc91021d-2361-4f6d-a404-7c33b9e01118 clusters.clusternet.io/cluster-name: clusternet-cluster-dzqkw clusternet.io/created-by: clusternet-agent name: clusternet-cluster-dzqkw namespace: clusternet-dhxfs spec: clusterId: dc91021d-2361-4f6d-a404-7c33b9e01118 clusterType: EdgeClusterSelfProvisioned syncMode: Dual status: apiserverURL: http://10.0.0.10:8080 appPusher: true healthz: true k8sVersion: v1.19.10 lastObservedTime: "2021-06-30T08:55:14Z" livez: true platform: linux/amd64 readyz: true
默认情况下,clusternet-agent
每3分钟更新一次 ManagedCluster
的状态,这可以通过标志 --cluster-status-update-frequency
来进行配置。
然后我们可以通过 krew
来安装 Clusternet 的 kubectl 插件:
$ kubectl krew install clusternet
安装完成后就可以使用 kubectl clusternet
命令了:
$ kubectl clusternet -h Usage: clusternet [flags] clusternet [command] Available Commands: apply Apply a configuration to a resource by filename or stdin create Create a resource from a file or from stdin. delete Delete resources by filenames, stdin, resources and names, or by resources and label selector edit Edit a resource on the server get Display one or many resources help Help about any command scale Set a new size for a Deployment, ReplicaSet or Replication Controller version Print the plugin version information
4示例
当 Clusternet 部署完成后,接下来我们就可以来尝试将应用部署到多个集群了。Clusternet 支持从一个托管集群的一组 API 中向多个集群部署应用程序。
📌 📌 注意:
Deployer
特性需要由clusternet-hub
开启。
首先,让我们看一个示例应用。下面名为 "app-demo" 的 Subscription
定义了要分发的目标子集群,以及要部署的资源。
# examples/applications/subscription.yaml apiVersion: apps.clusternet.io/v1alpha1 kind: Subscription metadata: name: app-demo namespace: default spec: subscribers: # defines the clusters to be distributed to - clusterAffinity: matchLabels: clusters.clusternet.io/cluster-id: dc91021d-2361-4f6d-a404-7c33b9e01118 # PLEASE UPDATE THIS CLUSTER-ID TO YOURS!!! feeds: # defines all the resources to be deployed with - apiVersion: apps.clusternet.io/v1alpha1 kind: HelmChart name: mysql namespace: default - apiVersion: v1 kind: Namespace name: foo - apiVersion: apps/v1 kind: Service name: my-nginx-svc namespace: foo - apiVersion: apps/v1 kind: Deployment name: my-nginx namespace: foo
在应用这个 Subscription
对象之前,请用你的集群 ID 更新 examples/applications/subscription.yaml
。
在安装了 kubectl 插件 kubectl-clusternet
之后,你可以运行下面的命令将这个应用程序分发到子集群:
$ kubectl clusternet apply -f examples/applications/ helmchart.apps.clusternet.io/mysql created namespace/foo created deployment.apps/my-nginx created service/my-nginx-svc created subscription.apps.clusternet.io/app-demo created
然后可以使用下面的命令查看刚刚创建的资源:
$ # list Subscription $ kubectl clusternet get subs -A NAMESPACE NAME AGE default app-demo 6m4s $ kubectl clusternet get chart NAME CHART VERSION REPO STATUS AGE mysql mysql 8.6.2 https://charts.bitnami.com/bitnami Found 71s $ kubectl clusternet get ns NAME CREATED AT foo 2021-08-07T08:50:55Z $ kubectl clusternet get svc -n foo NAME CREATED AT my-nginx-svc 2021-08-07T08:50:57Z $ kubectl clusternet get deploy -n foo NAME CREATED AT my-nginx 2021-08-07T08:50:56Z
Clusternet
将帮助部署和协调应用程序到多个集群,可以通过以下命令检查状态。
$ kubectl clusternet get mcls -A NAMESPACE NAME CLUSTER ID SYNC MODE KUBERNETES READYZ AGE clusternet-5l82l clusternet-cluster-hx455 dc91021d-2361-4f6d-a404-7c33b9e01118 Dual v1.21.0 true 5d22h $ # list Descriptions $ kubectl clusternet get desc -A NAMESPACE NAME DEPLOYER STATUS AGE clusternet-5l82l app-demo-generic Generic Success 2m55s clusternet-5l82l app-demo-helm Helm Success 2m55s $ kubectl describe desc -n clusternet-5l82l app-demo-generic ... Status: Phase: Success Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfullyDeployed 2m55s clusternet-hub Description clusternet-5l82l/app-demo-generic is deployed successfully $ # list Helm Release $ # hr is an alias for HelmRelease $ kubectl clusternet get hr -n clusternet-5l82l NAME CHART VERSION REPO STATUS AGE helm-demo-mysql mysql 8.6.2 https://charts.bitnami.com/bitnami deployed 2m55s
当然也可以在子集群中用 Helm 命令行工具来验证安装情况,比如:
$ helm ls -n abc NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION helm-demo-mysql abc 1 2021-07-06 14:34:44.188938 +0800 CST deployed mysql-8.6.2 8.0.25
这样我们就成功将一个应用轻松分发到多个集群了。关于 Clusternet
的更多细节和使用方法请查看官方仓库:https://github.com/clusternet/clusternet 了解更多。
本文转载自:「k8s技术圈」,原文:https://tinyurl.com/yzfrctfz,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。
你可能还喜欢
点击下方图片即可阅读
服务网格除了 Istio,其实你还可以有其它 8 种选择
点击上方图片,『美团|饿了么』外卖红包天天免费领
更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!
原文链接:https://blog.csdn.net/easylife206/article/details/121346882
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/15991