腾讯开源的 Kubernetes 多集群编排管理工具 Clusternet 入门指南

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

6cf5abb6d6f47d7638c85191c43c467a.png

Clusternet(Cluster Internet) 是一个腾讯开源的 Kubernetes 多集群管理云原生项目,可帮助你像访问 Internet 一样轻松管理数以百万计的 Kubernetes 集群。

无论集群运行在公共云、私有云、混合云还是边缘,Clusternet 都可以让你管理/访问它们,就像它们在本地运行一样。这也有助于消除为每个集群处理不同管理工具的需要。Clusternet 还可以帮助你从托管集群中的一组 API 将应用程序部署和协调到多个集群。当你的集群在 VPC 网络、边缘或防火墙后面运行时,Clusternet 可以通过可配置的方式设置网络隧道。

Clusternet 还提供了一个 Kubernetes 风格的 API,你可以继续使用 Kubernetes 的方式,比如 KubeConfig,来访问某个管理的 Kubernetes 集群,或者一个 Kubernetes 服务。

以 Clusternet 项目为基础实现多云多集群管理平台,为用户提供跨云、跨集群、跨 region/zone 的分布式容器服务,将更好的满足多种场景需求。

1架构

下图是 Clusternet 的一个简单的架构图:

b3c77cb0e9e45926c23492e57a3c2fc0.png

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 命令来创建资源。

4d820ccf71fc776478a3d78970b26284.png
  • 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

5dd0921e6c38d2eb69b155aa10805ed5.png

点击上方图片,打开小程序,『美团外卖』红包免费领!

然后在子集群中部署 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。

ed869c28dbff79b53f8a6ff017e863be.gif

46b20f0f2658e37e8db5e5798b8f0cd6.png

你可能还喜欢

点击下方图片即可阅读

2db85c6973a96c49ec8b1c8f0faabf57.png

服务网格除了 Istio,其实你还可以有其它 8 种选择

6caaa67cc2c92d62b60fe75133bac14c.png
点击上方图片,『美团|饿了么』外卖红包天天免费领

ec7cc6c0ddcfa2fc61580ef34c7ea07d.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ansible是一个开源的自动化工具,用于集中管理和配置多个计算机系统。它可以帮助您轻松地进行配置管理、应用部署和任务自动化等操作。Ansible使用SSH协议与被管理的主机进行通信,并通过核心模块、托管机清单和连接插件等功能实现与被管理集群的交互。 在使用Ansible之前,您需要确保托管主机的SSH协议和Python版本都符合要求。然后,您可以按照以下流程进行操作: 1. 发布托管主机的SSH证书文件,以便与管理主机建立安全连接。 2. 了解Ansible的配置文件和命令,这将帮助您更好地了解和掌握Ansible的使用。 3. 对主机进行定义和分组,可以将不同类型的主机放入一个组中,或将不同类型的组添加到一个大组中。 4. 确保托管主机与管理主机之间的连通性,可以使用ansible命令来测试。 5. 如果您需要自定义分组,可以创建一个新的目录并在其中添加配置文件。请注意,每个目录下只能存在一个配置文件。 6. 您还可以使用ansible.cfg文件来指定组的引用文件,这样可以更方便地管理您的主机和组。 通过上述步骤,您可以使用Ansible来管理和配置您的集群。例如,您可以使用ansible命令来执行特定的操作或任务,也可以使用ansible.cfg文件来管理组的引用文件。同时,您还可以根据需要自定义分组,以更好地组织和管理您的主机和组。 请注意,以上是基本的使用方法和流程。Ansible还有更多高级功能和特性,可以根据您的需求进一步学习和探索。希望这些信息对您有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值