文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

腾讯开源的 Kubernetes 多集群管理和跨集群编排工具 Clusternet

2024-12-14 01:19

关注

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 组件需要部署在各个子集群中,主要负责:

clusternet-hub 组件部署和运行在父集群中,通过 AA(Aggregated APIServer) 的方式进行工作,主要负责:

 注意:由于 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 命令来创建资源。

3 部署

从上面的架构可以看出我们需要在子集群和父集群中分别部署 clusternet-agent 和 clusternet-hub 组件。

首先在集群中 Clone 项目代码:

  1. $ git clone https://github.com/clusternet/clusternet.git 

在父集群中部署 clusternet-hub 组件:

  1. $ kubectl apply -f deploy/hub 

然后为 clusternet-agent 创建一个 bootstrap token:

  1. $ # 下面命令将创建一个 bootstrap token:07401b.f395accd246ae52d 
  2. $ kubectl apply -f manifests/samples/cluster_bootstrap_token.yaml 

然后在子集群中部署 clusternet-agent,帮助子集群注册到父集群,clusternet-agent 可以配置以下三种同步模式(通过标志 --cluster-sync-mode 配置):

特性 AppPusher 在 agent 端工作,这主要是出于以下两个原因:

  1. 当一个子集群禁用 AppPusher 时,父集群不会向其部署任何应用程序,即使设置为 Push 或 Dual 模式,这个时候,这个子集群的工作方式就像 Pull 模式。
  2. 要部署的资源被表示为 Description 对象,你也可以运行你自己的控制器来 watch 该对象的变化,然后来分发和部署资源。

部署 clusternet-agent 后,首先要创建一个包含集群注册用的 Token 的 Secret:

  1. $ # create namespace clusternet-system if not created 
  2. $ kubectl create ns clusternet-system 
  3. $ # here we use the token created above 
  4. $ 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。

  1. $ # 部署之前,根据自己的需求更新同步模式 
  2. $ kubectl apply -f deploy/agent 

部署完成后检查集群注册情况:

  1. $ # clsrr 是 ClusterRegistrationRequest 对象的别名 
  2. $ kubectl get clsrr 
  3. NAME                                              CLUSTER ID                             STATUS     AGE 
  4. clusternet-dc91021d-2361-4f6d-a404-7c33b9e01118   dc91021d-2361-4f6d-a404-7c33b9e01118   Approved   3d6h 
  5. $ kubectl get clsrr clusternet-dc91021d-2361-4f6d-a404-7c33b9e01118 -o yaml 
  6. apiVersion: clusters.clusternet.io/v1beta1 
  7. kind: ClusterRegistrationRequest 
  8. metadata: 
  9.   labels: 
  10.     clusters.clusternet.io/cluster-id: dc91021d-2361-4f6d-a404-7c33b9e01118 
  11.     clusters.clusternet.io/cluster-name: clusternet-cluster-dzqkw 
  12.     clusters.clusternet.io/registered-by: clusternet-agent 
  13.   name: clusternet-dc91021d-2361-4f6d-a404-7c33b9e01118 
  14. spec: 
  15.   clusterId: dc91021d-2361-4f6d-a404-7c33b9e01118 
  16.   clusterName: clusternet-cluster-dzqkw 
  17.   clusterType: EdgeClusterSelfProvisioned 
  18. status: 
  19.   caCertificate: REDACTED 
  20.   dedicatedNamespace: clusternet-dhxfs 
  21.   managedClusterName: clusternet-cluster-dzqkw 
  22.   result: Approved 
  23.   token: REDACTED 

在 ClusterRegistrationRequest 被批准后,状态将被更新,如果需要的话,可以用相应的凭证来访问父集群。这些凭证已经用指定范围内的 RBAC 规则设置了,可以查看下面的两个规则。

  1. apiVersion: rbac.authorization.k8s.io/v1 
  2. kind: ClusterRole 
  3. metadata: 
  4.   annotations: 
  5.     clusternet.io/autoupdate: "true" 
  6.   labels: 
  7.     clusters.clusternet.io/bootstrapping: rbac-defaults 
  8.     clusters.clusternet.io/cluster-id: dc91021d-2361-4f6d-a404-7c33b9e01118 
  9.     clusternet.io/created-by: clusternet-hub 
  10.   name: clusternet-dc91021d-2361-4f6d-a404-7c33b9e01118 
  11. rules: 
  12.   - apiGroups: 
  13.       - clusters.clusternet.io 
  14.     resources: 
  15.       - clusterregistrationrequests 
  16.     verbs: 
  17.       - create 
  18.       - get 
  19.   - apiGroups: 
  20.       - proxies.clusternet.io 
  21.     resourceNames: 
  22.       - dc91021d-2361-4f6d-a404-7c33b9e01118 
  23.     resources: 
  24.       - sockets 
  25.     verbs: 
  26.       - '*' 
  27.  
  28. --- 
  29.  
  30. apiVersion: rbac.authorization.k8s.io/v1 
  31. kind: Role 
  32. metadata: 
  33.   annotations: 
  34.     clusternet.io/autoupdate: "true" 
  35.   labels: 
  36.     clusters.clusternet.io/bootstrapping: rbac-defaults 
  37.     clusternet.io/created-by: clusternet-hub 
  38.   name: clusternet-managedcluster-role 
  39.   namespace: clusternet-dhxfs 
  40. rules: 
  41.   - apiGroups: 
  42.       - '*' 
  43.     resources: 
  44.       - '*' 
  45.     verbs: 
  46.       - '*' 

然后检查被管理集群的状态:

  1. $ # mcls 是 ManagedCluster 对象的别名 
  2. $ # kubectl get mcls -A 
  3. $ # or append "-o wide" to display extra columns 
  4. $ kubectl get mcls -A -o wide 
  5. NAMESPACE          NAME                       CLUSTER ID                             CLUSTER TYPE                 SYNC MODE   KUBERNETES   READYZ   AGE 
  6. clusternet-dhxfs   clusternet-cluster-dzqkw   dc91021d-2361-4f6d-a404-7c33b9e01118   EdgeClusterSelfProvisioned   Dual        v1.19.10     true     7d23h 
  7. $ kubectl get mcls -n clusternet-dhxfs   clusternet-cluster-dzqkw -o yaml 
  8. apiVersion: clusters.clusternet.io/v1beta1 
  9. kind: ManagedCluster 
  10. metadata: 
  11.   labels: 
  12.     clusters.clusternet.io/cluster-id: dc91021d-2361-4f6d-a404-7c33b9e01118 
  13.     clusters.clusternet.io/cluster-name: clusternet-cluster-dzqkw 
  14.     clusternet.io/created-by: clusternet-agent 
  15.   name: clusternet-cluster-dzqkw 
  16.   namespace: clusternet-dhxfs 
  17. spec: 
  18.   clusterId: dc91021d-2361-4f6d-a404-7c33b9e01118 
  19.   clusterType: EdgeClusterSelfProvisioned 
  20.   syncMode: Dual 
  21. status: 
  22.   apiserverURL: http://10.0.0.10:8080 
  23.   appPusher: true 
  24.   healthz: true 
  25.   k8sVersion: v1.19.10 
  26.   lastObservedTime: "2021-06-30T08:55:14Z" 
  27.   livez: true 
  28.   platform: linux/amd64 
  29.   readyz: true 

默认情况下,clusternet-agent 每3分钟更新一次 ManagedCluster 的状态,这可以通过标志 --cluster-status-update-frequency 来进行配置。

然后我们可以通过 krew 来安装 Clusternet 的 kubectl 插件:

  1. $ kubectl krew install clusternet 

安装完成后就可以使用 kubectl clusternet 命令了:

  1. $ kubectl clusternet -h 
  2. Usage: 
  3.   clusternet [flags] 
  4.   clusternet [command] 
  5.  
  6. Available Commands: 
  7.   apply       Apply a configuration to a resource by filename or stdin 
  8.   create      Create a resource from a file or from stdin. 
  9.   delete      Delete resources by filenames, stdin, resources and names, or by resources and label selector 
  10.   edit        Edit a resource on the server 
  11.   get         Display one or many resources 
  12.   help        Help about any command 
  13.   scale       Set a new size for a Deployment, ReplicaSet or Replication Controller 
  14.   version     Print the plugin version information 

4 示例

当 Clusternet 部署完成后,接下来我们就可以来尝试将应用部署到多个集群了。Clusternet 支持从一个托管集群的一组 API 中向多个集群部署应用程序。

注意:Deployer 特性需要由 clusternet-hub 开启。

首先,让我们看一个示例应用。下面名为 "app-demo" 的 Subscription 定义了要分发的目标子集群,以及要部署的资源。

  1. # examples/applications/subscription.yaml 
  2. apiVersion: apps.clusternet.io/v1alpha1 
  3. kind: Subscription 
  4. metadata: 
  5.   name: app-demo 
  6.   namespace: default 
  7. spec: 
  8.   subscribers: # defines the clusters to be distributed to 
  9.     - clusterAffinity: 
  10.         matchLabels: 
  11.           clusters.clusternet.io/cluster-id: dc91021d-2361-4f6d-a404-7c33b9e01118 # PLEASE UPDATE THIS CLUSTER-ID TO YOURS!!! 
  12.   feeds: # defines all the resources to be deployed with 
  13.     - apiVersion: apps.clusternet.io/v1alpha1 
  14.       kind: HelmChart 
  15.       name: mysql 
  16.       namespace: default 
  17.     - apiVersion: v1 
  18.       kind: Namespace 
  19.       name: foo 
  20.     - apiVersion: apps/v1 
  21.       kind: Service 
  22.       name: my-nginx-svc 
  23.       namespace: foo 
  24.     - apiVersion: apps/v1 
  25.       kind: Deployment 
  26.       name: my-nginx 
  27.       namespace: foo 

在应用这个 Subscription 对象之前,请用你的集群 ID 更新 examples/applications/subscription.yaml。

在安装了 kubectl 插件 kubectl-clusternet 之后,你可以运行下面的命令将这个应用程序分发到子集群:

  1. $ kubectl clusternet apply -f examples/applications/ 
  2. helmchart.apps.clusternet.io/mysql created 
  3. namespace/foo created 
  4. deployment.apps/my-nginx created 
  5. service/my-nginx-svc created 
  6. subscription.apps.clusternet.io/app-demo created 

然后可以使用下面的命令查看刚刚创建的资源:

  1. $ # list Subscription 
  2. $ kubectl clusternet get subs -A 
  3. NAMESPACE   NAME       AGE 
  4. default     app-demo   6m4s 
  5. $ kubectl clusternet get chart 
  6. NAME             CHART   VERSION   REPO                                 STATUS   AGE 
  7. mysql            mysql   8.6.2     https://charts.bitnami.com/bitnami   Found    71s 
  8. $ kubectl clusternet get ns 
  9. NAME   CREATED AT 
  10. foo    2021-08-07T08:50:55Z 
  11. $ kubectl clusternet get svc -n foo 
  12. NAME           CREATED AT 
  13. my-nginx-svc   2021-08-07T08:50:57Z 
  14. $ kubectl clusternet get deploy -n foo 
  15. NAME       CREATED AT 
  16. my-nginx   2021-08-07T08:50:56Z 

Clusternet 将帮助部署和协调应用程序到多个集群,可以通过以下命令检查状态。

  1. $ kubectl clusternet get mcls -A 
  2. NAMESPACE          NAME                       CLUSTER ID                             SYNC MODE   KUBERNETES   READYZ   AGE 
  3. clusternet-5l82l   clusternet-cluster-hx455   dc91021d-2361-4f6d-a404-7c33b9e01118   Dual        v1.21.0      true     5d22h 
  4. $ # list Descriptions 
  5. $ kubectl clusternet get desc -A 
  6. NAMESPACE          NAME               DEPLOYER   STATUS    AGE 
  7. clusternet-5l82l   app-demo-generic   Generic    Success   2m55s 
  8. clusternet-5l82l   app-demo-helm      Helm       Success   2m55s 
  9. $ kubectl describe desc -n clusternet-5l82l   app-demo-generic 
  10. ... 
  11. Status: 
  12.   Phase:  Success 
  13. Events: 
  14.   Type    Reason                Age    From            Message 
  15.   ----    ------                ----   ----            ------- 
  16.   Normal  SuccessfullyDeployed  2m55s  clusternet-hub  Description clusternet-5l82l/app-demo-generic is deployed successfully 
  17. $ # list Helm Release 
  18. $ # hr is an alias for HelmRelease 
  19. $ kubectl clusternet get hr -n clusternet-5l82l 
  20. NAME                  CHART       VERSION   REPO                                 STATUS     AGE 
  21. helm-demo-mysql       mysql       8.6.2     https://charts.bitnami.com/bitnami   deployed   2m55s 

当然也可以在子集群中用 Helm 命令行工具来验证安装情况,比如:

  1. $ helm ls -n abc 
  2. NAME                NAMESPACE REVISION UPDATED                              STATUS   CHART             APP VERSION 
  3. 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技术圈内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯