Kasten k10 实战系列 10 – Kasten k10 多集群管理器

1.前言

在不断增长的 Kubernetes 多租户和多集群环境中,统一进行数据管理的操作,如备份和灾难恢复是纷繁复杂的。根据行业消息,大约有 20% 的企业生产环境中 Kubernetes 部署规模已经超越了 50 个 Kubernetes 集群,预计到 2021 年会更加速采用。

Kasten k10 by Veeam 从 v3.0 版本开始引入多集群管理支持,并可扩展到多租户环境。这一功能的引入满足了客户的需求,提高了生产力。在本篇文章中我将进一步解释 Kasten K10 多集群管理器的应用。

1.前言

  1. Kasten k10 多集群管理器的定义
  2. Kasten k10 多集群管理器特性
  3. k10multicluster 工具的使用
  4. 关于的 Primary 实例的参数设置
  5. 准备工作 - kubeconfig 的定义
  6. 启用多集群管理
    • 7.1 配置主实例
    • 7.2 绑定从属实例
    • 7.3 删除从属实例(如果需要)
  7. 设置 RBAC Entries
  8. Multi-Cluster 多集群管理操作
    • 9.1 集群切换
    • 9.2 创建 Global K10 Resources
  9. 总结
    参考文献
    附录

2. Kasten k10 多集群管理器的定义

K10 多集群管理器简化了跨多个 Kubernetes 集群的 K10 操作。管理员定义其 K10 实例之间的主从关系。Primary Cluster 的 K10 实例为管理员提供单一入口和仪表板来管理辅助实例,K10 资源,如策略和配置文件等,在主实例中定义并分发到辅助实例,为辅助实例制定其策略,并使辅助实例的操作和指标汇总在主要实例中。

3. Kasten k10 多集群管理器特性

Kasten K10 多集群管理器可以快速部署,且易于使用。通过 K10 多集群管理器仪表板,用户可以实现高度自动化和云原生应用的可移植性。因此云和运营团队可以更有信心地确保生产力、可扩展性和安全性。Kasten k10 多集群管理器特性包括:

多集群仪表板视图
当存在多个集群时,K10 多集群仪表板可提供简单的方法来获取关键参数,以形成聚合与实时的数据状态,包括集群总数、策略、应用程序等。

指定集群视图切换
K10 能够轻松搜索单个集群并无缝切换到该集群以查看集群相关资源的其他视图,以及定义和操作特定于该集群的策略的能力。

K8S 原生安全认证
K10 支持多种认证方式,包括 Token-based、OIDC、Red Hat OpenShift OAuth Proxy 等,因此可以使用细粒度的基于角色的访问控制 (RBAC) 来确保适当的访问级别和集群内与集群间的行动。

跨多集群策略实施
K10 提供了在主集群上定义全局策略的能力,这些策略可以有选择地应用于辅助集群,以通过自动化简化大规模备份的管理。

按需定义集群分组
利用 K10 用户能够创建自己的分组和属于多个发行版的单个集群。这使得只需单击一个按钮即可轻松地将全局策略分发到任何逻辑集群组。

4. k10multicluster 工具的使用

k10multicluster Cluster 管理的工具,我们需要在 Github 网站 kastenhq/external-tools 中下载,注意,目前 Kasten 最新版本为 4.0.8。 在使用时,请下载与你的 K10 版本相匹配的 Version

下载地址如下:

Kasten k10multicluster Tools
https://github.com/kastenhq/external-tools/releases

下载后我们需要将这个工具赋予执行的能力,并放到 /usr/local/bin/ 中以便随时都可以调用。

$ mv k10multicluster_4.0.5_linux_amd64 k10multicluster
$ sudo chmod +x k10multicluster
$ sudo cp k10multicluster /usr/local/bin/k10multicluster

5. 关于的 Primary 实例的参数设置

注意在 Primary 安装时,一定设置为 --set auth.basicAuth.enabled=true , 这样进入到 管理器中,将是 k10-admin 用户

helm install k10 k10-4.0.5.tgz --namespace kasten-io --set global.airgapped.repository=ccr.ccs.tencentyun.com/kasten-k10 \
  --set global.persistence.metering.size=20Gi \
  --set prometheus.server.persistentVolume.size=20Gi \
  --set global.persistence.catalog.size=20Gi \
  --set externalGateway.create=true \
  --set auth.basicAuth.enabled=true \
  --set auth.basicAuth.htpasswd='mars:$apr1$Cgu1sGVZ$w/8aLHZkVT73OqYZ06C0v.' \
  --set metering.mode=airgap \
  --set injectKanisterSidecar.enabled=true \
  --set-string injectKanisterSidecar.namespaceSelector.matchLabels.k10/injectKanisterSidecar=true \
  --set global.persistence.storageClass=cbs-csi

当然,对于已经安装好 K10 的环境是不用重装的, 我们用 helm upgrade 加相关参数即可。

# Upgrade 之前把目前的 parameters 都导入到 yaml 文件中
$ helm get values k10 --output yaml --namespace=kasten-io > k10_val.yaml

# 之后再 
$ helm upgrade k10 k10-<版本号>.tgz --namespace=kasten-io -f k10_val.yaml \ 
# 后面接入要加的参数即可
  --set auth.basicAuth.enabled=true \
  --set auth.basicAuth.htpasswd='mars:$apr1$Cgu1sGVZ$w/8aLHZkVT73OqYZ06C0v.' \

6. 准备工作 - kubeconfig 的定义

kubeconfig 是用于配置集群访问信息的文件,在开启了 TLS 的集群中,每次与集群交互时都需要身份认证,生产环境一般使用证书进行认证,其认证所需要的信息会放在 kubeconfig 中。此外,k8s 的组件都可以使用 kubeconfig 连接 apiserver,client-go 、operator、helm 等,其他组件也使用 kubeconfig 访问 apiserver。如下图,Mars的环境中有两个 K8s cluster。我将它们的两个文件分别放置在 cls1-config 与 cls2-config 中

20210727215730

# kubeconfig 列表
$ ls -l $HOME/.kube/ 
-rw-r--r--  1 zhangcong  staff  5545 Jul 27 19:54 cls1-config
-rw-r--r--  1 zhangcong  staff  5545 Jul 27 19:55 cls2-config

# 查看 cls-0gbjg2c9 即 k8s-cls1 的 kubeconfig 文件
kubectl config view --kubeconfig=$HOME/.kube/cls1-config  
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://cls-0gbjg2c9.ccs.tencent-cloud.com
  name: cls-0gbjg2c9
contexts:
- context:
    cluster: cls-0gbjg2c9
    user: "100006537440"
  name: cls-0gbjg2c9-100006537440-context-default
current-context: cls-0gbjg2c9-100006537440-context-default
kind: Config
preferences: {}
users:
- name: "100006537440"
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

# 查看 cls-dyz4mksf 即 k8s-cls2 的 kubeconfig 文件
kubectl config view --kubeconfig=$HOME/.kube/cls2-config
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://cls-dyz4mksf.ccs.tencent-cloud.com
  name: cls-dyz4mksf
contexts:
- context:
    cluster: cls-dyz4mksf
    user: "100006537440"
  name: cls-dyz4mksf-100006537440-context-default
current-context: cls-dyz4mksf-100006537440-context-default
kind: Config
preferences: {}
users:
- name: "100006537440"
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

7. 启用多集群管理

7.1 配置主实例

配置您需要做为主实例的集群,将 K8S Cluster 的 context 与 Name 做为参数。

k10multicluster setup-primary \
--kubeconfig=$HOME/.kube/cls1-config \
--context=cls-0gbjg2c9-100006537440-context-default \
--name=cls-0gbjg2c9

Bootstrapping Primary Cluster...
Getting Primary Cluster Config...
Verifying cluster parameters: cls-0gbjg2c9
Setting up primary multicluster configuration: cls-0gbjg2c9
Setting up Primary Cluster Complete!

7.2 绑定从属实例

绑定您需要做为从属实例的集群,将 K8S Cluster 的 context 与 Name 和 ingress 做为参数,注意将 tls 设置为 insecure 是在初始化是加大成功率的,在投入生产后需要恢复成安全设置。

$ k10multicluster bootstrap \  
  --primary-context=cls-0gbjg2c9-100006537440-context-default  \
  --primary-name=cls-0gbjg2c9 \
  --primary-kubeconfig=$HOME/.kube/cls1-config \
  --secondary-context=cls-dyz4mksf-100006537440-context-default \
  --secondary-name=cls-dyz4mksf \
  --secondary-kubeconfig=$HOME/.kube/cls2-config \
  --secondary-cluster-ingress=http://111.231.213.171/k10/#/ \
  --secondary-cluster-ingress-tls-insecure=true

Bootstrapping Clusters...
Getting Primary Cluster Config...
Verifying cluster parameters: cls-0gbjg2c9
Getting Secondary Cluster Config...
Verifying cluster parameters: cls-dyz4mksf
Setting up secondary multicluster configuration: cls-dyz4mksf
Updating Prometheus configuration: cls-0gbjg2c9
Bootstrapping Clusters Complete!

#查看已经被管理的多个K8S 集群
kubectl get clusters -n kasten-io-mc  
NAME           AGE
cls-0gbjg2c9   70m
cls-dyz4mksf   65m

此时我们可以 Web 界面中直接访问 Clusters 的图形界面,地址如,K10-ingress/10/#/Clusters, 这个界面会将所有被管理的 K8S Cluster 的信息集中展示。

20210727215935

7.3 删除从属实例(如果需要)

$ k10multicluster remove \  
 --primary-context=cls-0gbjg2c9-100006537440-context-default  \
 --primary-name=cls-0gbjg2c9 \
 --primary-kubeconfig=$HOME/.kube/cls1-config \
 --secondary-context=cls-dyz4mksf-100006537440-context-default \
 --secondary-name=cls-dyz4mksf \
  --secondary-kubeconfig=$HOME/.kube/cls2-config

Removing Secondary Cluster...
Getting Primary Cluster Config...
Verifying cluster parameters: cls-0gbjg2c9
Getting Secondary Cluster Config...
Verifying cluster parameters: cls-dyz4mksf
Cleaning up secondary multicluster configuration cls-dyz4mksf from primary cls-0gbjg2c9
Removing Clusters Complete!

8. 设置 RBAC Entries

为其它的 K8S Cluster 设置 RBCA Entries,注意,此时,主实例为基本认证方式,用户为k10-admin,而从属实例为 Token 认证方式,用户为k10-k10。 我们的目的是让从属实例可以被 k10-admin 所管理。

在主界面上,找到 RBCA Entries, 点击 New K10 Cluster Role Binding。
K10 Cluster Role 设置为: K10-multi-cluster-admin
Subjects: User 为 : k10-admin

20210727220626

9. Multi-Cluster 多集群管理操作

9.1 集群切换

您可以方便地在管理界面中切换,被 K10 所保护的 K8S 集群

20210727223407

9.2 创建 Global K10 Resources

通过集群的管理,我们可以统一建立 Global Resources,然后再将其分发,这样就可以节省我们在配置K10作业的时间。

  1. 建立存储库配置

20210727224201

  1. 建立统一的备份策略
    当多个集群中有相同的应用时,我们可以定义统一的备份策略。

20210727224752

  1. 分发备份策略
    分发备份策略的方式有两种:
    一是在如下策略上直接分发
    20210727224838

二是,建立分发策略进行分发
20210727225307

我们可以在建立分发策略时,指定多个 Cluster,如下图 status: synced a few seconds ago. 说明分发已经成功
20210727225345

我们到 Cluster1 上查看备份策略
20210727225500

我们再到 Cluster2 上查看备份策略
20210727225740

策略运行后的结果

20210727231513

10.总结

Kasten k10 的多实例管理功能,可使您可以在 K10 仪表板中快速轻松地定义策略、管理多个集群并查看整个 Kubernetes 部署队列中的关键参数状态,在不牺牲敏捷性、性能和安全性的情况下,轻松管理更大规模的数据。凭借增强的灵活性和可移植性,帮助 ITOps 和 CloudOps 团队保护和扩展 Kubernetes 部署。

参考文献

Kasten-io Multi-Cluster
https://docs.kasten.io/latest/multicluster/index.html

Kubernetes Multi-cluster and Multi-tenancy with Kasten K10 3.0
https://blog.kasten.io/kubernetes-multi-cluster-and-multi-tenancy-with-kasten-k10

kasten-external-tools
https://github.com/kastenhq/external-tools

附录

查看集群状态

$ kubectl get clusters -n kasten-io-mc -o yaml 
apiVersion: v1
items:
- apiVersion: dist.kio.kasten.io/v1alpha1
  kind: Cluster
  metadata:
    creationTimestamp: "2021-07-27T12:42:43Z"
    generation: 1
    labels:
      dist.kio.kasten.io/cluster-type: primary
    managedFields:
    - apiVersion: dist.kio.kasten.io/v1alpha1
      fieldsType: FieldsV1
      fieldsV1:
        f:status:
          .: {}
          f:id: {}
      manager: config-server
      operation: Update
      time: "2021-07-27T12:42:43Z"
    - apiVersion: dist.kio.kasten.io/v1alpha1
      fieldsType: FieldsV1
      fieldsV1:
        f:metadata:
          f:labels:
            .: {}
            f:dist.kio.kasten.io/cluster-type: {}
        f:spec:
          .: {}
          f:apiserver:
            .: {}
            f:url: {}
          f:k10:
            .: {}
            f:ingress:
              .: {}
              f:url: {}
            f:namespace: {}
            f:releaseName: {}
          f:primary: {}
      manager: k10multicluster
      operation: Update
      time: "2021-07-27T12:42:43Z"
    name: cls-0gbjg2c9
    namespace: kasten-io-mc
    resourceVersion: "6322587134"
    selfLink: /apis/dist.kio.kasten.io/v1alpha1/namespaces/kasten-io-mc/clusters/cls-0gbjg2c9
    uid: 9fde9f76-fcf5-4299-b750-9eb941876fb9
  spec:
    apiserver:
      url: https://cls-0gbjg2c9.ccs.tencent-cloud.com
    k10:
      ingress:
        url: ""
      namespace: kasten-io
      releaseName: k10
    primary: true
  status:
    id: 11b78bf0-39e3-4077-9f0c-9fc5bb035b15
- apiVersion: dist.kio.kasten.io/v1alpha1
  kind: Cluster
  metadata:
    creationTimestamp: "2021-07-27T15:52:03Z"
    generation: 2
    labels:
      dist.kio.kasten.io/cluster-type: secondary
    managedFields:
    - apiVersion: dist.kio.kasten.io/v1alpha1
      fieldsType: FieldsV1
      fieldsV1:
        f:status:
          .: {}
          f:id: {}
      manager: config-server
      operation: Update
      time: "2021-07-27T15:52:03Z"
    - apiVersion: dist.kio.kasten.io/v1alpha1
      fieldsType: FieldsV1
      fieldsV1:
        f:metadata:
          f:labels:
            .: {}
            f:dist.kio.kasten.io/cluster-type: {}
        f:spec:
          .: {}
          f:apiserver:
            .: {}
            f:url: {}
          f:k10:
            .: {}
            f:ingress:
              .: {}
              f:url: {}
            f:namespace: {}
            f:releaseName: {}
          f:secret: {}
      manager: k10multicluster
      operation: Update
      time: "2021-07-27T15:52:03Z"
    name: cls-dyz4mksf
    namespace: kasten-io-mc
    resourceVersion: "6325814295"
    selfLink: /apis/dist.kio.kasten.io/v1alpha1/namespaces/kasten-io-mc/clusters/cls-dyz4mksf
    uid: 672da008-2c93-4f4d-8d12-f0d7f517bf50
  spec:
    apiserver:
      url: https://cls-dyz4mksf.ccs.tencent-cloud.com
    k10:
      ingress:
        url: http://111.231.213.171/k10/#/
      namespace: kasten-io
      releaseName: k10
    secret: cls-dyz4mksf-45xrj
  status:
    id: 2b4aff74-811d-4b16-af76-72a5cdeaa7f7
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注