1. 前言
发展云原生生态圏是 Veeam 的又一重要战略,以 Kasten by Veeam 为圆心,这个战略又分为三个重要的组成部分,公有云厂商、K8S 分发版本和云原生存储厂商。大家都知道在云原生的领域中,公有云的 K8S分发版本是市场占有率最高的,Veeam China 在中国的云原生生态战略部局中也积极在与国内外多家公有云厂商合作。Amazon Elastic Kubernetes Service (Amazon EKS) 是一项托管容器服务,可以在云中和本地运行和扩展 Kubernetes 应用程序。借助云容器引擎,企业可以通过高效的计算资源预置和自动 Kubernetes 应用程序扩展降低成本,在云上轻松部署、管理和扩展容器化应用程序。今天我们要讲述的是如何在 AWS EKS kubernetes 引擎上保护云原生应用。
2. Kasten 与 AWS EKS
Kasten K10 是 Veeam 在 Kubernetes 平台的数据管理解决方案,通过部署 Kasten K10 企业可以安全地备份和还原、执行灾难恢复以及迁移云原生的应用。Kubernetes 集群资源和持久卷等存储资源。解决用户备份、灾难恢复、迁移过程中的数据管理问题,提高云原生环境数据管理的便捷性,帮助用户降低灾备成本,提高生产执行效率。
Amazon Elastic Kubernetes Service (Amazon EKS) 是一项托管容器服务,可以在云中和本地运行和扩展 Kubernetes 应用程序。借助云容器引擎,企业可以通过高效的计算资源预置和自动 Kubernetes 应用程序扩展降低成本,在云上轻松部署、管理和扩展容器化应用程序。今天我们要讲述的是如何在 AWS EKS kubernetes 引擎上保护云原生应用。
3.Kasten K10 部署规划
3.1 技术资源准备与要求
Kasten K10 部署在 AWS 云需要以下先决条件 :
- AWS EKS 1.18 ~ 1.21 EKS 云容器引擎是高性能的企业级 Kubernetes 集群,借助云容器引擎,企业可以在云上轻松部署、管理和扩展容器化应用程序。
- AWS S3 对象存储, 用于存放备份的数据集,在本实例中也用于存储部署 Kasten K10 的自动化检测脚本
- 技术人员要求 部署人员除了对云基础架构有一定了解以外,还应该具备 K8S 或 AWS EKS 运维的相关知识。
3.2 K8S 集群资源需求
对于Kasten K10 在 EKS 容器平台环境的部署,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. 部署 AWS EKS Kubernetes 环境
4.1 创建 AWS K8S 集群
- 选择创建集群
对于集群进行配置
配置集群联网信息
- 创建 EKS K8S 集群节点
集群节点创建完成
4.2 配置 AWS EKS 集群的访问路径
在本实例中,我们需要通过AWS CLI 访问 AWS EKS 集群
# 配置Cloud Shell 登录信息
$ aws configure
AWS Access Key ID [None]: <AWS Access Key>
AWS Secret Access Key [None]: <AWS Secret Access Key>
Default region name [None]: cn-north-1
Default output format [None]: json
# 获取 kubeconfig
$ aws eks --region cn-north-1 update-kubeconfig --name mars-k8s1
Updated context arn:aws-cn:eks:cn-north-1:535551854723:cluster/mars-k8s1 in /Users/zhangcong/.kube/config
#获取集群信息
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-10-20-0-228.cn-north-1.compute.internal Ready <none> 14h v1.21.5-eks-bc4871b
ip-10-20-2-75.cn-north-1.compute.internal Ready <none> 14h v1.21.5-eks-bc4871b
#获取集群硬件配置
$ kubectl describe nodes | grep -E 'Hostname|cpu|memory|ephemeral-storage'
MemoryPressure False Thu, 25 Nov 2021 11:35:34 +0800 Wed, 24 Nov 2021 21:04:21 +0800 KubeletHasSufficientMemory kubelet has sufficient memory available
Hostname: ip-10-20-0-228.cn-north-1.compute.internal
cpu: 2
ephemeral-storage: 83873772Ki
memory: 7934464Ki
Hostname: ip-10-20-2-75.cn-north-1.compute.internal
cpu: 2
ephemeral-storage: 83873772Ki
memory: 7934464Ki
4.3 部署 S3 对象存储
5. 安装 K10 到 AWS EKS 集群
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.5.X.tgz 包下载下来,如果不加任何参数,则会下载最新的版本
# 在Air Gapped 的环境中安装时,可以先行下载再使用。
$ helm fetch kasten/k10 --version=4.5.4
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
$ helm install k10 k10-4.5.4.tgz --namespace kasten-io --set global.airgapped.repository=ccr.ccs.tencentyun.com/kasten-k10 \
--set secrets.awsAccessKeyId="awsAccessKeyId" \
--set secrets.awsSecretAccessKey="awsSecretAccessKey" \
--set auth.tokenAuth.enabled=true \
--set metering.mode=airgap \
--set injectKanisterSidecar.enabled=true \
--set-string injectKanisterSidecar.namespaceSelector.matchLabels.k10/injectKanisterSidecar=true
目前在不同的 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-56f74fb955-67m9h 1/1 Running 0 68m
auth-svc-5867f5f6fc-pdnjc 1/1 Running 0 68m
catalog-svc-f45c85786-6mth7 2/2 Running 0 68m
config-svc-85dc88584b-6qg67 1/1 Running 0 68m
crypto-svc-5664f495d4-zcj4f 2/2 Running 0 68m
dashboardbff-svc-764c7894d7-l5lvj 1/1 Running 0 68m
executor-svc-574fbb5679-4pb9x 2/2 Running 0 68m
executor-svc-574fbb5679-8469h 2/2 Running 0 68m
executor-svc-574fbb5679-rtwpd 2/2 Running 0 68m
frontend-svc-85499467cf-92qs7 1/1 Running 0 68m
gateway-5d8944b688-zkmdf 1/1 Running 0 68m
jobs-svc-86d47744d7-nn2lf 1/1 Running 0 68m
k10-grafana-5d797d6c9f-xrvqd 1/1 Running 1 68m
kanister-svc-58c799f6c-vxrt8 1/1 Running 0 68m
logging-svc-6f969d85d6-q6q49 1/1 Running 0 68m
metering-svc-85dcbcf4dc-wvt7l 1/1 Running 0 68m
prometheus-server-6d9bd54f7c-vhfdr 2/2 Running 1 68m
state-svc-65c599c6b5-kccbv 1/1 Running 0 68m
6. 访问 K10 控制台
通过查看 K8S Service,我们可以看到 K10 的 ingress 配置, 暴露 gateway service 给 NodePort, 查看 访问 K10 的 IP 地址,访问 http://52.81.186.105:30111/k10/#/dashboard
# 暴露 gateway service 给 NodePort
$ kubectl expose service gateway -n kasten-io --type=NodePort --name=gateway-nodeport
service/gateway-nodeport exposed
# 查看 NodePort端口
$ kubectl get svc -n kasten-io gateway-nodeport
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
gateway-nodeport NodePort 172.20.60.69 <none> 8000:30111/TCP 14h
# 查看 Node IP 任意一个 Node IP 都有效
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
ip-10-20-0-228.cn-north-1.compute.internal Ready <none> 14h v1.21.5-eks-bc4871b 10.20.0.228 52.81.186.105 Amazon Linux 2 5.4.156-83.273.amzn2.x86_64 docker://20.10.7
ip-10-20-2-75.cn-north-1.compute.internal Ready <none> 14h v1.21.5-eks-bc4871b 10.20.2.75 52.80.108.165 Amazon Linux 2 5.4.156-83.273.amzn2.x86_64 docker://20.10.7
#浏览器访问如下地址
http://52.81.186.105:30111/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 管理界面已经完美的出现在浏览器中。
6. 配置 AWS S3 作为存储库
我们可以能过设置 S3 存储库的方式,将 AWS S3 设置成为备份存储库,满足 3-2-1-1-0 的备份黄金法则, S3 可以完美的支持不可变存储功能防止备份数据被篡改。选中 Enable Immutable Backups 即可实现该功能。
3-2-1-1-0 备份黄金法则
注:3-2-1-1-0 是指 3 份数据副本,2种以上不同的存储介质,1 份异地备份,1份不可变备份,保证 0 恢复错误。
https://community.veeam.com/blogs-and-podcasts-57/3-2-1-1-0-golden-backup-rule-569
点击 Settings -> Locations -> New Profile 新建云存储链接
7. 云原生应用的备份与还原
7.1 云原生应用的备份
点击 Create Policy, 让我们创建一个数据备份策略,在这个数据保护策略中 Kasten 不仅创建本地的快照对应用进行保护,还会将应用数据备份到云端的 S3 对象存储,以实现数据的长期保留
点击 Run Once 执行备份任务
观察 Dashboard 可以看到应用已经备份完成
观察 S3 存储桶,说明快照数据已经 Export 到存储桶了
7.2 云原生应用的还原
在 Dashboard 中找到 Applications 点击 Restore ,选择还原点
新建一个 Namespace 进行还原,这里我们命名为 mysql-restore
查看 EKS 集群信息,我们已经看到还原的应用在正常的运行了
$ kubectl get po -n mysql
NAME READY STATUS RESTARTS AGE
mysql-release-0 1/1 Running 1 12h
$ kubectl get po -n mysql-restore
NAME READY STATUS RESTARTS AGE
mysql-release-0 1/1 Running 0 52s
8. 总结
随着云原生生态的越发成熟,越来越多的企业将有状态的工作负载部署到 AWS EKS 集群里,Kasten K10 by Veeam 解决方案 ,利用 AWS 的 Kubernetes 生态环境中的多项目云服务,AWS ECR 镜像库, S3 对象存储,EBS 存储接口, 打造了基于AWS 的原生环境的数据管理平台,可助力企业达成云原生应用灾备、迁移和 DevOps 等目标,从而保证了企业云原生应用的弹性和可靠性。
9. 参考链接
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开始使用 Amazon EKS
https://aws.amazon.com/cn/eks/getting-started/使用 Amazon Elastic Container Service for Kubernetes
https://aws.amazon.com/cn/getting-started/hands-on/deploy-kubernetes-app-amazon-eks/