1. 前言
我们不断看到企业客户利用 Karbon 快速配置和部署 Kubernetes 集群,这使得他们在企业的云原生之旅上又取得了进展。利用 Kasten K10 集成 Nutanix Objects 对于企业云平台的进行统一的应用保护和数据管理,可以十分轻松地保证 Karbon 上的云原生应用的保护和移动性。
文章目录
- 前言
- 验证步骤
-
- 配置 Karbon 的存储类与快照能力
- 3.1 确认 CSI 版本
- 3.2 配置 Nutanix CSI 快照资源
- 3.3 建立 Volume Snapshot Class
-
- Kasten K10 安装
- 4.1 运行 Pre-Flight 检查脚本
- 4.2 通过 Helm Chart 安装 Kasten k10
-
- 保护云原生应用
- 5.1 安装测试应用 Mysql
- 5.2 云原生应用快照式保护
- 5.3 云原生应用备份方法
- 5.3.1. 使用 Nutanix Objects 创建外部对象存储
- 5.3.2 在 Kasten K10 中配置备份存储库
- 5.3.3 将策略更改为添加导出配置文件
- 5.3.4 还原 Mysql 应用
- 总结
Nutanix AOS 的集成组件 Karbon 是 Kubernetes 的解决方案,它使 IT 运营商能够通过简单的按钮,交付和管理生产就绪的 Kubernetes 环境。值得强调的是,Karbon Kubernetes 集群都已经部署了 Nutanix 的全功能 CSI 驱动程序,该驱动程序与 Nutanix 的存储卷和文件原生集成,为有状态的容器化应用程序提供持久存储。
Nutanix Objects 是一种软件定义的对象存储解决方案,它可以在降低整体存储成本的同时不中断扩展。它设计了一个兼容 S3 的 REST API 接口来处理大量非结构化数据。鉴于 Nutanix Objects 提供了长期保留和归档以及跨区域复制,它提供的对象存储是 Kasten 备份集的理想目标。
20210802052917Kasten by Veeam 数据管理软件平台是专为 Kubernetes 设计的, Kasten K10 以云原生应用程序的方式运行在 K8S 集群上,并可以使用多集群的管理方式保护企业的 K8S 平台。K10 提供了基于细粒度角色的 RBCA 与多租户访问控制。目前,Kasten K10 可以
- 支持多种主流的 Kubernetes 产品和发行版本。
- 与领先数据源的预审集成,包括关系型数据库 与 NoSQL数据服务。
- 支持通过容器存储接口 CSI 方式以及直接存储集成,以提高数据操作效率
Kasten 现在是 Nutanix Ready 认证的合作伙伴。
2. 验证步骤
在 Karbon 上验证 Kasten k10 的备份与恢复,我们将采用如下步骤
- 配置与验证 Nutanix Karbon 的快照功能
- 执行 Kasten K10 安装前的环境检查
- 安装 Kasten K10 和一个示例应用程序 MySQL
- 以快照方式测试云原生应用的备份和恢复
- 利用 Nutanix Objects 建立外部存储库
- 配置 Kasten K10 使用 Nutanix Objects 作为备份存储库
- 将快照导出到此对象存储并再次测试恢复
3. 配置 Karbon 的存储类与快照能力
在安装Kasten K10之前,我们将向 Karbon 添加快照功能,因为:Kasten 支持存储层的快照,这为云原生应用的数据保护提供了一种非常有效的方法, 这使得恢复和应用程序更快.在这里我们将启用 Nutanix CSI 的快照特性。
3.1 确认 CSI 版本
首先,找出在您的集群中使用的CSI版本:
kubectl -n ntnx-system get statefulset csi-provisioner-ntnx-plugin -o jsonpath='{.spec.template.spec.containers[?(@.name=="ntnx-csi-plugin")].image}'
# 输出将类似于,注意在冒号后面的字符串是 当前 CSI 版本 ,在本例中为 version 2.3.1
quay.io/karbon/ntnx-csi:v2.3.1
3.2 配置 Nutanix CSI 快照资源
如果您在 Karbon 2.2.2 和 Kubernetes 1.19 之后安装或升级现有的 Kubernetes 集群,则不再需要此步骤。下载并安装相应的Nutanix CSI快照资源文件:
v2.2.0
kubectl apply -f https://github.com/nutanix/csi-plugin/releases/download/v2.2.0/snapshot-crd-2.2.0.yaml
kubectl apply -f https://github.com/nutanix/csi-plugin/releases/download/v2.2.0/karbon-fix-snapshot-2.2.0.yaml
v2.3.1
kubectl apply -f https://github.com/nutanix/csi-plugin/releases/download/v2.3.1/snapshot-crd-2.3.1.yaml
kubectl apply -f https://github.com/nutanix/csi-plugin/releases/download/v2.3.1/karbon-fix-snapshot-2.3.1.yaml
如果您的 Kubernetes 集群使用的是的旧版本的 Nutanix Karbon,请联系支持人员,因为 CSI 驱动程序需要更改。
3.3 建立 Volume Snapshot Class
获取默认存储类的 CSI 的 secret 名称,以创建默认快照类:
#!/usr/bin/bash
SECRET=$(kubectl get sc -o=jsonpath='{.items[?(@.metadata.annotations.storageclass\.kubernetes\.io\/is-default-class=="true")].parameters.csi\.storage\.k8s\.io\/provisioner-secret-name}')
DRIVER=$(kubectl get sc -o=jsonpath='{.items[?(@.metadata.annotations.storageclass\.kubernetes\.io\/is-default-class=="true")].provisioner}')
cat << EOF | kubectl apply -f -
apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshotClass
metadata:
name: default-snapshotclass
driver: $DRIVER
parameters:
storageType: NutanixVolumes
csi.storage.k8s.io/snapshotter-secret-name: $SECRET
csi.storage.k8s.io/snapshotter-secret-namespace: kube-system
deletionPolicy: Delete
EOF
4. Kasten K10 安装
4.1 运行 Pre-Flight 检查脚本
为了验证一切正常,运行以下脚本来进行检查:
helm repo add kasten https://charts.kasten.io --force-update && helm repo update
kubectl create ns kasten-io
kubectl annotate volumesnapshotclass default-snapshotclass \
k10.kasten.io/is-snapshot-class=true
curl -s https://docs.kasten.io/tools/k10_primer.sh | bash
Namespace option not provided, using default namespace
Checking for tools
--> Found kubectl
--> Found helm
Checking if the Kasten Helm repo is present
--> The Kasten Helm repo was found
Checking for required Helm Tiller version (>= v2.16.0)
--> No Tiller needed with Helm v3.5.2
K10Primer image
--> Using Image (gcr.io/kasten-images/k10tools:3.0.10) to run test
Checking access to the Kubernetes context karbon-context
--> Able to access the default Kubernetes namespace
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-ph8wk to be ready - ContainerCreating
Waiting for pod k10primer-ph8wk to be ready -
Pod Ready!
Kubernetes Version Check:
Valid kubernetes version (v1.18.15) - OK
RBAC Check:
Kubernetes RBAC is enabled - OK
Aggregated Layer Check:
The Kubernetes Aggregated Layer is enabled - OK
CSI Capabilities Check:
Using CSI GroupVersion snapshot.storage.k8s.io/v1beta1 - OK
Validating Provisioners:
csi.nutanix.com:
Is a CSI Provisioner - OK
Storage Classes:
default-storageclass
Valid Storage Class - OK
Volume Snapshot Classes:
default-snapshotclass
Has k10.kasten.io/is-snapshot-class annotation set to true - OK
Has deletionPolicy 'Delete' - OK
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.2 通过 Helm Chart 安装 Kasten k10
我们将用简单的选项安装 Kasten K10 ,在本文中,我们主要关注于创建保护 namespace 的策略。
helm install k10 kasten/k10 --namespace=kasten-io
NAME: k10
LAST DEPLOYED: Thu Feb 18 02:06:30 2021
NAMESPACE: kasten-io
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thank you for installing Kasten’s K10 Data Management Platform!
Documentation can be found at https://docs.kasten.io/.
How to access the K10 Dashboard:
The K10 dashboard is not exposed externally. To establish a connection to it use the following `kubectl` command:
`kubectl --namespace kasten-io port-forward service/gateway 8080:8000`
The Kasten dashboard will be available at: `http://127.0.0.1:8080/k10/#/`
接下来,检查所有在 kasten-io namespace 下的 Pod 均已经启动并运行:
kubectl get pods -n kasten-io
NAME READY STATUS RESTARTS AGE
aggregatedapis-svc-7f756b8699-mgv6n 1/1 Running 0 23h
auth-svc-85ddb9b698-snxx6 1/1 Running 0 23h
catalog-svc-765dbf56d5-dqkg8 2/2 Running 0 23h
config-svc-598ff54d6d-kbxc7 1/1 Running 0 23h
crypto-svc-6994ddf946-qxjb4 1/1 Running 0 23h
dashboardbff-svc-6ccbc7c44d-ll6kv 1/1 Running 1 23h
executor-svc-5f7996dbfd-jjq2g 2/2 Running 0 23h
executor-svc-5f7996dbfd-mxdbp 2/2 Running 0 23h
executor-svc-5f7996dbfd-t8md4 2/2 Running 0 23h
frontend-svc-544b546fd4-lvvtd 1/1 Running 0 23h
gateway-6574867bf5-n9kqk 1/1 Running 0 23h
jobs-svc-6d5fb9b7d4-tz6sh 1/1 Running 0 23h
kanister-svc-6df4fc7656-67sln 1/1 Running 0 23h
logging-svc-56d6f69487-wk958 1/1 Running 0 23h
metering-svc-cbd4c89c6-5l5vn 1/1 Running 0 23h
prometheus-server-d5d545569-xrxn2 2/2 Running 0 23h
state-svc-796fd5c664-gzhsc 1/1 Running 0 23h
5. 保护云原生应用
5.1 安装测试应用 Mysql
在这里,我们在 Karbon 集群上的 建立一个 mysql 的应用程序以测试 Kasten 的备份和恢复能力:
kubectl create namespace mysql
cat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
namespace: mysql
spec:
selector:
matchLabels:
app: mysql
serviceName: mysql
replicas: 1
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
value: ultrasecurepassword
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 5Gi
EOF
当 mysql pod 准备好时,我们将用一些数据填充数据库:
kubectl exec -ti mysql-0 -n mysql -- bash
mysql --user=root --password=ultrasecurepassword
CREATE DATABASE test;
USE test;
CREATE TABLE pets (name VARCHAR(20), owner VARCHAR(20), species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
INSERT INTO pets VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
SELECT * FROM pets;
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+-------+---------+------+------------+-------+
1 row in set (0.00 sec)
5.2 云原生应用快照式保护
为了方便读者体验,我们将 Kasten 的大部分操作在仪表板上执行,这时我们需要通过配置端口转发使我们可以访问控制台:
kubectl --namespace kasten-io port-forward service/gateway 8080:8000
这时在浏览器中访问如下地址,即可进入控制台: http://127.0.0.1:8080/k10/#/
接受最终用户许可协议。
20210703034500在生产环境中,仪表板将通过配置了正确的身份验证子系统的Ingress Controller公开。
现在我们将建立应用程序快照级保护,Kasten 会自动捕获应用程序的完整状态,我们暂时不将其导出到外部存储库。
界面浏览 Applications --> MySQL --> Create a Policy 建立备份策略
20210802082334我们按照下图对备份作业进行设置,其它均为默认值
Name: mysql-backup
Action: Snapshot
Action Frequency: Daily
选择 ‘Create Policy’:
20210802082119点击 ‘run once’ 按钮
20210802082047现在,我们到 Kasten 仪表盘,向下滚动到 “Actions” 下查看进度:
20210802082000备份作业执行完成后,单击作业以打开详细信息窗格,并查看详细情况:
202108020819125.3 云原生应用备份方法
对云原生应用程序进行备份,意味着不仅是使用快照,并需要将快照导出到外部对象存储,以实现备份数据的长期保留。
5.3.1. 使用 Nutanix Objects 创建外部对象存储
我们将使用 Nutanix Objects 在远程集群上启用对象存储服务,以便用于 Kasten 备份集的存储。考虑到冗余性,我们假设对象存储已经部署在不同的 Nutanix 集群上,而不是部署了 Karbon Kubernetes集群的集群上。接下来,我们将使用 Prism Central 连接对象存储,创建一个新的 Bucket ,并添加一个用户。
在 Prism Central 控制台, 找到 Services -> Objects 点击 ‘Access Keys’.
接下来, 我们将添加新用户,点击 ‘Add People’:
20210802081210选择“Add people not in a directory service”,并填写“Email”和“name”字段。然后单击“Next”。
20210802081123生成密钥并下载:
20210802081100 20210802081050这个过程下载一个包含访问权限和密钥的文本文件,如下所示:
20210802081018接下来,返回到“对象存储”,并单击之前创建的S3对象存储:
20210802080920现在建立一个新的 Bucket
20210802080854 20210802080845选择你刚刚创建的桶,然后进入“User Access”:
20210802080814编辑用户访问权限,赋予之前创建的用户读写权限:
2021080208074620210802080737
现在我们已经完成了 Nutanix Objects 对象存储的配置。
5.3.2 在 Kasten K10 中配置备份存储库
在 Kasten 图形界面中, 点击 Settings -> Location Profile -> New Profile -> S3 compatible 配置备份存储库
20210802080428将配置文件命名为“object-storage”,然后填写所要求的信息。S3 Access Key 和 S3 Secret 将从上一步下载的密钥文件中获取。注意,‘Endpoint’ 对应于Nutanix UI 中对象存储的 URL。
20210802080254‘Bucket Name’ 应该对应于您先前创建的桶的名称。
20210802072358现在, 点击 ‘Save Profile’.
202108020723325.3.3 将策略更改为添加导出配置文件
在仪表盘找到已经定义的备份策略,选择 Dashboard --> Policies, ‘Edit’ 进行策略编辑。
20210802072143接下来,选择 ‘Enable Backups via Snapshot Exports’,并在下拉菜单中选择适当的存储库,我们这里是 『nutanix-kasten-backup』:
20210802072001点击 ‘Edit Policy’ 然后点击 ‘Run Once'.
Now, navigate to the main dashboard and scroll down under ‘Actions’ in order to view progress:
现在,我们到 Kasten K10 仪表板,向下滚动到 “Actions” ,以查看进度:
20210802071812导出将在备份过程完成后执行。
在作业执行完成时,单击作业以打开一个“详细信息”窗格,以查看K8S 应用的备份情况。
5.3.4 还原 Mysql 应用
如果你回到还原点视图,则可以看到我们现在有两个还原点:一个本地还原点和一个导出还原点。
20210802071526即使删除了 namespace,或者即使删除了 k8s 集群本身,我们也可以使用 Kasten K10 导出的还原点进行数据恢复,同时我们还可以将还原点恢复到任何一个安装了 Kasten 的集群。
现在让我们来删除 mysql 的 namespace。
kubectl delete ns mysql
使用导出的还原点,点击“还原”,一切参数设定为默认。
20210802071211现在让我们检查一下我们的数据是否回来了:
kubectl exec -ti mysql-0 -n mysql -- bash
mysql --user=root --password=ultrasecurepassword
USE test;
SELECT * FROM pets;
mysql> SELECT * FROM pets;
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+-------+---------+------+------------+-------+
1 row in set (0.00 sec)
Bash
正如预期的那样,所有数据都是完整的,恢复成功!
6. 总结
随着 K8S 平台的应用越发成熟,越来越多的企业将有状态的工作负载部署到 Nutanix Karbon 集群里,Kasten K10 by Veeam 解决方案 + Nutanix Objects 作为备份存储库,用于云原生应用的备份和恢复,保证了企业所有云原生应用的弹性和可靠性。
网友评论