Kasten k10 多云适配系列 02 – 利用 Kasten K10 保护 Huawei CCE 云原生应用

1. 前言

发展云原生生态圏是 Veeam 的又一重要战略,以 Kasten by Veeam 为圆心,这个战略又分为三个重要的组成部分,公有云厂商、K8S 分发版本和云原生存储厂商。大家都知道在云原生的领域中,公有云的K8S分发版本是市场占有率最高的,Veeam China 在中国的云原生生态战略部局中也积极在与国内多家公有云厂商合作。华为云容器引擎是高性能的企业级 Kubernetes 集群,借助云容器引擎,企业可以在华为云上轻松部署、管理和扩展容器化应用程序。今天我们要讲述的是如何在华为云 CCE kubernetes 引擎上保护云原生应用。

2. Kasten 与 华为云 CCE

Kasten K10 是 Veeam 在 Kubernetes 平台的数据管理解决方案,通过部署 Kasten K10 企业可以安全地备份和还原、执行灾难恢复以及迁移云原生的应用。Kubernetes 集群资源和持久卷等存储资源。解决用户备份、灾难恢复、迁移过程中的数据管理问题,提高云原生环境数据管理的便捷性,帮助用户降低灾备成本,提高生产执行效率。

20210821143120

华为云容器引擎(Cloud Container Engine) 提供高可靠高性能的企业级容器应用管理服务,支持 Kubernetes 社区原生应用和工具,简化云上自动化容器运行环境搭建,面向云原生 2.0 打造 CCE Turbo 容器集群,计算、网络、调度全面加速,IDC 报告显示华为云容器软件中国市场份额排名第一,Forrester 报告显示华为云容器服务再获满分。

20210913205423

3.Kasten K10 部署规划

3.1 技术资源准备与要求

Kasten K10 部署在华为云需要以下先决条件 :

  • CCE Huawei Cloud Container Engine 1.19.10 华为云容器引擎是高性能的企业级 Kubernetes 集群,借助云容器引擎,企业可以在华为云上轻松部署、管理和扩展容器化应用程序。
  • SWR Huawei SoftWare Repository for Container 容器镜像服务, 为您提供安全独享、高性能的容器镜像托管分发服务。
  • Everest-CSI 组件 Everest-CSI 组件 支持 CCE 集群通过控制台快捷选择存储类型,并创建对应块存储云硬盘类型的 PV 和 PVC。
  • Huawei OBS 对象存储, 用于存放备份的数据集,在本实例中也用于存储部署 Kasten K10 的自动化检测脚本
  • 技术人员要求 部署人员除了对腾讯云有一定了解以外,还应该具备 K8S 或 CCE 运维的相关知识。

3.2 K8S 集群资源需求

对于Kasten K10 在 CCE 容器平台环境的部署,Kasten K10 将需要以下资源,鉴于 K10 所保护的应用数量不同,对应的数值也做相应的调整。

资源需求
K10 的资源需求总是与 Kubernetes 集群中的应用程序数量和正在执行的数据管理任务类型有关(例如,快照与备份)。一些资源需求是静态的,我们称之为基本资源需求,而其他资源的占用仅在完成某些数据管理工作时才被需要,因此我们称之为动态资源需求。K10 的自动扩展特性确保了在不执行任何工作时,动态需求资源的消耗缩减为零。虽然以下资源需求与限制的建议适用于大多数 K8S 集群,但需注意的是,最终需求将取决于您的集群和应用程序规模、数据总量、文件大小、分布和数据变化率。比较科学的方式是通过 Prometheus 或 Kubernetes Vertical Pod Autoscaling (VPA) 来检查您的资源需求。

需求类型

我们将需求分为三种类型,即基本工作需求,备份工作需求和灾难恢复需求,并做以下陈述:

  • 基本工作需求:这些是 K10 的内部调度和清理服务所需的资源,主要由监控和目录规模需求驱动。这些基本要求的资源占用通常是静态的,通常不会随着受保护的 Kubernetes 资源数量或受保护应用程序数量的增长而显着增长。

  • 备份工作需求:当数据从卷快照传输到对象存储或 NFS 文件存储时,需要调用备份工作所需的资源。虽然备份需求取决于您的数据量、变化率和文件系统布局,但这些需求并非没有限制,很容易适应相对廋供给的资源范围。当然在提供额外资源时,K10 还可以加快备份操作的完成。为了在保护大量工作负载时防止无限并行,K10 限制了同时备份作业的数量(默认为 9 个任务并行)。备份资源占用是动态的,在不执行备份时会缩减为零。

  • 灾难恢复需求:这些需求是在执行 K10 安装的灾难恢复所需的资源,主要用于压缩、重复数据删除、加密以及将 K10 目录传输到对象存储。提供额外资源还可以加快 DR 操作。DR 资源占用是动态的,并且在不执行 DR 时会缩减为零。

需求配置指南
下表列出了保护 100 个云原生应用程序或命名空间的 K10 安装的资源要求。需要注意的是,DR 作业也包含在最大并行度限制中,因此您只能 N 同时拥有备份作业 或 N-1 备份作业 + 1 个 DR 作业同时进行。

Type Requested CPU (Cores) Limit CPU (Cores) Requested Memory (GB) Limit Memory (GB)
Base 1 2 1 4
Dynamic (per parallel job) 1 1 0.4 0.4
DR 1 1 0.3 0.3
Total 3 4 1.8 4.8

4. 部署华为云 Kubernetes 环境

4.1 部署华为云 CCE K8S 集群

  1. 选择集群服务类型

20210808131837

  1. 创建 CCE K8S 集群节点
    20210808132117

  2. 安装存储与网络插件,everest 是 云原生存储的 csi driver,在这里是必选项目

20210808132144

  1. 确认集群定义的配置

20210808132312

  1. 提示集群创建成功

20210808133831

4.2 配置华为云 CCE K8S 集群的访问路径

在本实例中,我们需要通过公网访问华为的 CCE 集群,这样就需要给集群访问配置 EIP
20210808135116

#获取集群信息
❯ kubectl get nodes
NAME            STATUS   ROLES    AGE   VERSION
192.168.0.143   Ready    <none>   27m   v1.17.17-r0-CCE21.6.1.B004-17.37.5

#获取集群硬件配置
❯ kubectl describe node | grep -E 'cpu|memory'
  MemoryPressure   False   Sun, 08 Aug 2021 13:56:20 +0800   Sun, 08 Aug 2021 13:30:19 +0800   KubeletHasSufficientMemory   kubelet has sufficient memory available
  cpu:                4
  memory:             8008272Ki
  cpu:                3920m
  memory:             6279760Ki
  cpu                850m (21%)    850m (21%)
  memory             1412Mi (23%)  1412Mi (23%)

4.3 部署 OBS 对象存储

  1. 创建存储桶

20210808145117

  1. 获取存储桶的信息
    20210913213507

4.3 配置 SWR 镜像库

确保 SWR 已经配置完善, SWR 镜像库的搭建十分重要,详细情况请查看 Mars 之前的博客

20210808152625

4.4. 启用 Everest CSI 插件

华为云的 Everest CSI 是比较有特色的,一个 CSI 可以涵盖 块、文件、对象多种类型的存储操作。这是非常需要注意的,华为云的 CSI PROVISIONER 与 Driver 是不一致的。对于 csi-disk 这个存储类,我们也需要进行改造,具体见下方的 yaml 文件。

❯ kubectl get sc
NAME                PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
csi-disk            everest-csi-provisioner         Delete          Immediate              true                   28m
csi-disk-topology   everest-csi-provisioner         Delete          WaitForFirstConsumer   true                   28m
csi-nas             everest-csi-provisioner         Delete          Immediate              true                   28m
csi-obs             everest-csi-provisioner         Delete          Immediate              false                  28m
<truncated>...

❯ kubectl get sc csi-disk -oyaml
allowVolumeExpansion: true
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    everest.io/disk-volume-type: SSD
    k10.kasten.io/volume-snapshot-class: csi-disk-snapclass
    storageclass.beta.kubernetes.io/is-default-class: "true"
  name: csi-disk
parameters:
  csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io
  csi.storage.k8s.io/fstype: ext4
  everest.io/disk-volume-type: SSD
  everest.io/passthrough: "true"
provisioner: everest-csi-provisioner
reclaimPolicy: Delete
volumeBindingMode: Immediate

❯ kubectl create -f csi-disk.yaml 
storageclass.storage.k8s.io/csi-disk created

❯ kubectl get sc                                                                                                                     
NAME                 PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
csi-disk (default)   everest-csi-provisioner         Delete          Immediate              true                   37m
csi-disk-topology    everest-csi-provisioner         Delete          WaitForFirstConsumer   true                   37m
<truncated>...

关于 everest csi 请参考如下文档:https://support.huaweicloud.com/usermanual-cce/cce_01_0255.html

4.5 配置 Everest CSI VolumeSnapshotClass

配置 Everest CSI VolumeSnapshotClass 插件, 使之可以被 Kasten 调用

kubectl annotate csi-disk-snapclass csi-hostpath-snapclass \
k10.kasten.io/is-snapshot-class=true
❯ kubectl get volumesnapshotclass csi-disk-snapclass -oyaml 

apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshotClass
metadata:
  annotations:
    k10.kasten.io/is-snapshot-class: "true"
  name: csi-disk-snapclass
driver: disk.csi.everest.io
deletionPolicy: Delete

4.4.Pre-Flight Checks

通过 Pre-Flight Checks 脚本,我们可以验证部署的前提条件是否满足,在国内区域我们可以将脚本部署在 OBS 存储桶中,如下图。

20210913221434

您自己也可以自己按照自身的环境定义您这个脚本,注意以下的修改项目

$ curl -O https://docs.kasten.io/tools/k10_primer.sh | bash

$ vim k10_primer.sh  
~~~
    if version_gt_eq ${k10ver} ${MIN_K10_VERSION}; then
      image=gcr.io/kasten-images/k10tools:${k10ver}     # 把这一行改成 swr.cn-north-1.myhuaweicloud.com/kasten-k10/k10tools
    else
~~~

执行 Pre-Flight Checks,查看结果,让我们分析一下。


❯ curl https://kasten.obs.cn-north-1.myhuaweicloud.com/k10_primer.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6035  100  6035    0     0  35922      0 --:--:-- --:--:-- --:--:-- 35710
Namespace option not provided, using default namespace
# 检查所需要的工具 kubectl 和 helm
Checking for tools
 --> Found kubectl
 --> Found helm
Checking if the Kasten Helm repo is present
# 检查所需要的工具 kubectl 和 helm
 --> The Kasten Helm repo was found
Checking for required Helm version (>= v3.0.0)

 --> No Tiller needed with Helm v3.6.1
 # K10Primer image 已经重新定向
K10Primer image
 --> Using Image (swr.cn-north-1.myhuaweicloud.com/kasten-k10/k10tools:4.0.9) to run test
 # 检查 kubeconfig
Checking access to the Kubernetes context external
 --> Able to access the default Kubernetes namespace
# 创建 k10Primer pod 运行检查程序 

Running K10Primer Job in cluster with command- 
     ./k10tools primer 
serviceaccount/k10-primer created
clusterrolebinding.rbac.authorization.k8s.io/k10-primer created
job.batch/k10primer created
Waiting for pod k10primer-r2xpz to be ready - ContainerCreating
Waiting for pod k10primer-r2xpz to be ready - ContainerCreating
Waiting for pod k10primer-r2xpz to be ready - ContainerCreating
Waiting for pod k10primer-r2xpz to be ready - ContainerCreating
Pod Ready!
# 版本支持
Kubernetes Version Check:
  Valid kubernetes version (v1.19.10-r1.0.0-source-16-g361f5645404573)  -  OK
# 访问权限检查 
RBAC Check:
  Kubernetes RBAC is enabled  -  OK
# Aggregated Layer
Aggregated Layer Check:
  The Kubernetes Aggregated Layer is enabled  -  OK
# CSI存储集成检查
CSI Capabilities Check:
  Using CSI GroupVersion snapshot.storage.k8s.io/v1beta1  -  OK

Validating Provisioners: 
everest-csi-provisioner:
  Is a CSI Provisioner  -  OK
  Missing/Failed to Fetch CSIDriver Object
  CSI Provisioner doesn't have VolumeSnapshotClass  -  Error
  Storage Classes:
    csi-disk
      Valid Storage Class  -  OK
    csi-disk-topology
      Valid Storage Class  -  OK
    csi-nas
      Valid Storage Class  -  OK
    csi-obs
      Valid Storage Class  -  OK
    csi-sfsturbo
      Valid Storage Class  -  OK

flexvolume-huawei.com/fuxiefs:
  Storage Classes:
    efs-performance
      Supported via K10 Generic Volume Backup. See https://docs.kasten.io/latest/install/generic.html.
    efs-standard
      Supported via K10 Generic Volume Backup. See https://docs.kasten.io/latest/install/generic.html.

flexvolume-huawei.com/fuxinfs:
  Storage Classes:
    nfs-rw
      Supported via K10 Generic Volume Backup. See https://docs.kasten.io/latest/install/generic.html.

flexvolume-huawei.com/fuxiobs:
  Storage Classes:
    obs-standard
      Supported via K10 Generic Volume Backup. See https://docs.kasten.io/latest/install/generic.html.
    obs-standard-ia
      Supported via K10 Generic Volume Backup. See https://docs.kasten.io/latest/install/generic.html.

flexvolume-huawei.com/fuxivol:
  Storage Classes:
    sas
      Supported via K10 Generic Volume Backup. See https://docs.kasten.io/latest/install/generic.html.
    sata
      Supported via K10 Generic Volume Backup. See https://docs.kasten.io/latest/install/generic.html.
    ssd
      Supported via K10 Generic Volume Backup. See https://docs.kasten.io/latest/install/generic.html.
# 检查通用卷影快照
Validate Generic Volume Snapshot:
  Pod Created successfully  -  OK
  GVS Backup command executed successfully  -  OK
  Pod deleted successfully  -  OK
# 清场。。。
serviceaccount "k10-primer" deleted
clusterrolebinding.rbac.authorization.k8s.io "k10-primer" deleted
job.batch "k10primer" deleted

4.5 安装 K10 到 K8S 集群

1. 获取 Helm Chart 供本地使用

添加 Kasten Helm charts 存储库
$ helm repo add kasten https://charts.kasten.io/

$ helm repo list   
NAME            URL   ls
kasten          https://charts.kasten.io/         

$ helm repo update
# 以下这条命令会把 k10-4.0.x.tgz 包下载下来,如果不加任何参数,则会下载最新的版本
# 在Air Gapped 的环境中安装时,可以先行下载再使用。
$ helm fetch kasten/k10 --version=4.0.9
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "kasten" chart repository
Update Complete. ⎈Happy Helming!⎈

2.建立名空间

$ kubectl create namespace kasten-io
namespace/kasten-io created

3. 安装 Kasten K10

在选华为云 everest-csi 的云硬盘时,有个最小为 10GB 的限制,对于 Kasten 来说,有些 PVC 的要求仅为 1GB ,所以我们将其更改为 10G 以上为华为云部署作适配, 同时配置的参数还有为扩展 gateway 的 LB 用于外网访问 Kasten 图形界面,与安全性相关的 Token 登录认证的设置。

helm install k10 k10-4.0.9.tgz --namespace kasten-io --set global.airgapped.repository=swr.cn-north-1.myhuaweicloud.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.tokenAuth.enabled=true \
  --set metering.mode=airgap \
  --set injectKanisterSidecar.enabled=true \
  --set-string injectKanisterSidecar.namespaceSelector.matchLabels.k10/injectKanisterSidecar=true \
  --set global.persistence.storageClass=csi-disk

目前在不同的 K8S 环境下部署 K10 有很多参数需要设置,此时我们需要查阅部署参数。

查看 Kasten Helm 部署的参数
Complete List of K10 Helm Options
https://docs.kasten.io/latest/install/advanced.html

4. 确认 Kasten K10 Pod 的部署情况

❯ kubectl get pods -n kasten-io 
NAME                                 READY   STATUS    RESTARTS   AGE
aggregatedapis-svc-bd8bf7bbb-nknjk   1/1     Running   0          8h
auth-svc-845967ccbf-9zb42            1/1     Running   0          8h
catalog-svc-57b86845d-7wbqs          2/2     Running   0          8h
config-svc-587598bf77-k4lq6          1/1     Running   0          8h
crypto-svc-7487fb8868-nv7xq          2/2     Running   0          8h
dashboardbff-svc-5499c87d47-l86fc    1/1     Running   0          8h
executor-svc-59486fc844-c96f6        2/2     Running   0          8h
executor-svc-59486fc844-t856b        2/2     Running   0          8h
executor-svc-59486fc844-xxsq6        2/2     Running   0          8h
frontend-svc-555db46555-zrl22        1/1     Running   0          8h
gateway-6b95cd8885-cvppg             1/1     Running   0          8h
jobs-svc-597ff57454-8qpqn            1/1     Running   0          8h
kanister-svc-58776c9dbc-cmmdt        1/1     Running   0          8h
logging-svc-5dd45d9b74-cq8rp         1/1     Running   0          8h
metering-svc-7c5444d5f8-5r67r        1/1     Running   0          8h
prometheus-server-7cd4cb58f5-zlss7   2/2     Running   0          8h
state-svc-7d9867494f-7c4fb           1/1     Running   0          8h

5. 访问 K10 控制台

通过查看 K8S Service,我们可以看到 K10 的 ingress 配置,其中的 Gateway-ext ,查看 访问 K10 的 IP 地址
如果设置不成功,需要手动设置 external gateway,如下图 mars 就手动配置了一个关于 gateway的服务叫做 gateway-mars。

❯ kubectl get svc -n kasten-io |grep gateway
gateway                 ClusterIP      10.247.136.132   <none>                     8000/TCP                       8h
gateway-admin           ClusterIP      10.247.78.107    <none>                     8877/TCP                       8h
gateway-ext             LoadBalancer   10.247.153.43    <pending>                  80:30853/TCP                   8h
gateway-mars            LoadBalancer   10.247.45.248    172.16.0.235,49.4.31.149   80:32466/TCP                   7h51m

#浏览器访问如下地址
http://49.4.31.149/k10/#/

在终端输入如下命令获取 Token

$ sa_secret=$(kubectl get serviceaccount k10-k10 -o jsonpath="{.secrets[0].name}" --namespace kasten-io) && \
  kubectl get secret $sa_secret --namespace kasten-io -ojsonpath="{.data.token}{'\n'}" | base64 --decode

输入您的公司名和邮件地址

20210703034500

之后可以看到,Kasten K10 管理界面已经完美的出现在浏览器中。

20210913224048

5. 配置华为云 OBS 作为存储库

我们可以能过设置 S3 Compatible 存储库的方式,将 华为云 OBS 设置成为备份存储库,满足 3-2-1-1-0 的备份黄金法则。

点击 Settings -> Locations -> New Profile 新建云存储链接

20210913224253

存储库连接建立好,如下图

20210913224326

6. 云原生应用的备份与还原

6.1 云原生应用的备份

点击 Create Policy, 让我们创建一个数据备份策略,在这个数据保护策略中 Kasten 不仅创建本地的快照对应用进行保护,还会将应用数据备份到云端的 OBS 对象存储,以实现数据的长期保留

20210913225202

点击 Run Once 执行备份任务

20210913225258

观察 Dashboard 可以看到应用已经备份完成

20210913225436

观察 Huawei CCE 的存储快照, k10-csi-snap 开头的就是 Kasten 生成的快照

20210913225528

观察 OBS 存储桶,说明快照数据已经 Export 到存储桶了

20210913225702

6.2 云原生应用的还原

在 Dashboard 中找到 Applications 点击 Restore

20210913230021

选择还原的时间点

20210913230106

新建一个 Namespace 进行还原,这里我们命名为 mysql-restore

20210913230210

在 Huawei CCE Dashboard 中我们已经看到还原的应用在正常的运行了

20210913230336

7. 总结

随着云原生生态的越发成熟,越来越多的企业将有状态的工作负载部署到 Huawei CCE 集群里,Kasten K10 by Veeam 解决方案 ,利用华为云的 Kubernetes 生态环境中的多项目云服务,SWR 镜像库, OBS 对象存储,Everest CSI 容器存储接口, 打造了基于华为云的原生环境的数据管理平台,可助力企业达成云原生应用灾备、迁移和DevOps等目标,从而保证了企业云原生应用的弹性和可靠性。

8. 参考链接

Complete List of K10 Helm Options
https://docs.kasten.io/latest/install/advanced.html
Kasten k10 实战系列 03 CSI 存储快照适配
http://www.data2clouds.com/index.php/archives/33/
Kasten K10 实战系列 02 - 利用腾讯 TCR 搭建镜像库
http://www.data2clouds.com/index.php/archives/32/
参考 Helm3 部署安装
https://cloud.tencent.com/developer/article/1705549
Helm3 releases
https://github.com/helm/helm/releases
Kasten K10 系统需求
https://docs.kasten.io/latest/operating/footprint.html

华为云容器引擎(Cloud Container Engine
https://support.huaweicloud.com/cce/index.html

关于 everest csi 请参考如下文档
https://support.huaweicloud.com/usermanual-cce/cce_01_0255.html

发表回复

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