1. 前言
发展云原生生态圏是 Veeam 的又一重要战略,以 Kasten by Veeam 为圆心,这个战略又分为三个重要的组成部分,公有云厂商、K8S 分发版本和云原生存储厂商。大家都知道在云原生的领域中,公有云的K8S分发版本是市场占有率最高的,Veeam China 在中国的云原生生态战略部局中也积极在与国内多家公有云厂商合作。华为云容器引擎是高性能的企业级 Kubernetes 集群,借助云容器引擎,企业可以在华为云上轻松部署、管理和扩展容器化应用程序。今天我们要讲述的是如何在华为云 CCE kubernetes 引擎上保护云原生应用。
2. Kasten 与 华为云 CCE
Kasten K10 是 Veeam 在 Kubernetes 平台的数据管理解决方案,通过部署 Kasten K10 企业可以安全地备份和还原、执行灾难恢复以及迁移云原生的应用。Kubernetes 集群资源和持久卷等存储资源。解决用户备份、灾难恢复、迁移过程中的数据管理问题,提高云原生环境数据管理的便捷性,帮助用户降低灾备成本,提高生产执行效率。
华为云容器引擎(Cloud Container Engine) 提供高可靠高性能的企业级容器应用管理服务,支持 Kubernetes 社区原生应用和工具,简化云上自动化容器运行环境搭建,面向云原生 2.0 打造 CCE Turbo 容器集群,计算、网络、调度全面加速,IDC 报告显示华为云容器软件中国市场份额排名第一,Forrester 报告显示华为云容器服务再获满分。
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 集群
- 选择集群服务类型
-
创建 CCE K8S 集群节点
-
安装存储与网络插件,everest 是 云原生存储的 csi driver,在这里是必选项目
- 确认集群定义的配置
- 提示集群创建成功
4.2 配置华为云 CCE K8S 集群的访问路径
在本实例中,我们需要通过公网访问华为的 CCE 集群,这样就需要给集群访问配置 EIP
#获取集群信息
❯ 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 对象存储
- 创建存储桶
- 获取存储桶的信息
4.3 配置 SWR 镜像库
确保 SWR 已经配置完善, SWR 镜像库的搭建十分重要,详细情况请查看 Mars 之前的博客。
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 存储桶中,如下图。
您自己也可以自己按照自身的环境定义您这个脚本,注意以下的修改项目
$ 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
输入您的公司名和邮件地址
之后可以看到,Kasten K10 管理界面已经完美的出现在浏览器中。
5. 配置华为云 OBS 作为存储库
我们可以能过设置 S3 Compatible 存储库的方式,将 华为云 OBS 设置成为备份存储库,满足 3-2-1-1-0 的备份黄金法则。
点击 Settings -> Locations -> New Profile 新建云存储链接
存储库连接建立好,如下图
6. 云原生应用的备份与还原
6.1 云原生应用的备份
点击 Create Policy, 让我们创建一个数据备份策略,在这个数据保护策略中 Kasten 不仅创建本地的快照对应用进行保护,还会将应用数据备份到云端的 OBS 对象存储,以实现数据的长期保留
点击 Run Once 执行备份任务
观察 Dashboard 可以看到应用已经备份完成
观察 Huawei CCE 的存储快照, k10-csi-snap 开头的就是 Kasten 生成的快照
观察 OBS 存储桶,说明快照数据已经 Export 到存储桶了
6.2 云原生应用的还原
在 Dashboard 中找到 Applications 点击 Restore
选择还原的时间点
新建一个 Namespace 进行还原,这里我们命名为 mysql-restore
在 Huawei CCE Dashboard 中我们已经看到还原的应用在正常的运行了
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