Kasten k10 多云适配系列 01 – 利用 Kasten K10 保护 Nutanix Karbon 云原生应用

1. 前言

我们不断看到企业客户利用 Karbon 快速配置和部署 Kubernetes 集群,这使得他们在企业的云原生之旅上又取得了进展。利用 Kasten K10 集成 Nutanix Objects 对于企业云平台的进行统一的应用保护和数据管理,可以十分轻松地保证 Karbon 上的云原生应用的保护和移动性。

文章目录

    1. 前言
    1. 验证步骤
    1. 配置 Karbon 的存储类与快照能力
      • 3.1 确认 CSI 版本
      • 3.2 配置 Nutanix CSI 快照资源
      • 3.3 建立 Volume Snapshot Class
    1. Kasten K10 安装
      • 4.1 运行 Pre-Flight 检查脚本
      • 4.2 通过 Helm Chart 安装 Kasten k10
    1. 保护云原生应用
      • 5.1 安装测试应用 Mysql
      • 5.2 云原生应用快照式保护
      • 5.3 云原生应用备份方法
      • 5.3.1. 使用 Nutanix Objects 创建外部对象存储
      • 5.3.2 在 Kasten K10 中配置备份存储库
      • 5.3.3 将策略更改为添加导出配置文件
      • 5.3.4 还原 Mysql 应用
    1. 总结

Nutanix AOS 的集成组件 Karbon 是 Kubernetes 的解决方案,它使 IT 运营商能够通过简单的按钮,交付和管理生产就绪的 Kubernetes 环境。值得强调的是,Karbon Kubernetes 集群都已经部署了 Nutanix 的全功能 CSI 驱动程序,该驱动程序与 Nutanix 的存储卷和文件原生集成,为有状态的容器化应用程序提供持久存储。

Nutanix Objects 是一种软件定义的对象存储解决方案,它可以在降低整体存储成本的同时不中断扩展。它设计了一个兼容 S3 的 REST API 接口来处理大量非结构化数据。鉴于 Nutanix Objects 提供了长期保留和归档以及跨区域复制,它提供的对象存储是 Kasten 备份集的理想目标。

20210802052917

Kasten by Veeam 数据管理软件平台是专为 Kubernetes 设计的, Kasten K10 以云原生应用程序的方式运行在 K8S 集群上,并可以使用多集群的管理方式保护企业的 K8S 平台。K10 提供了基于细粒度角色的 RBCA 与多租户访问控制。目前,Kasten K10 可以

  • 支持多种主流的 Kubernetes 产品和发行版本。
  • 与领先数据源的预审集成,包括关系型数据库 与 NoSQL数据服务。
  • 支持通过容器存储接口 CSI 方式以及直接存储集成,以提高数据操作效率

Kasten 现在是 Nutanix Ready 认证的合作伙伴。

2. 验证步骤

在 Karbon 上验证 Kasten k10 的备份与恢复,我们将采用如下步骤

  1. 配置与验证 Nutanix Karbon 的快照功能
  2. 执行 Kasten K10 安装前的环境检查
  3. 安装 Kasten K10 和一个示例应用程序 MySQL
  4. 以快照方式测试云原生应用的备份和恢复
  5. 利用 Nutanix Objects 建立外部存储库
  6. 配置 Kasten K10 使用 Nutanix Objects 作为备份存储库
  7. 将快照导出到此对象存储并再次测试恢复

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

20210802082140

选择 ‘Create Policy’:

20210802082119

点击 ‘run once’ 按钮

20210802082047

现在,我们到 Kasten 仪表盘,向下滚动到 “Actions” 下查看进度:

20210802082000

备份作业执行完成后,单击作业以打开详细信息窗格,并查看详细情况:

20210802081912

5.3 云原生应用备份方法

对云原生应用程序进行备份,意味着不仅是使用快照,并需要将快照导出到外部对象存储,以实现备份数据的长期保留。

5.3.1. 使用 Nutanix Objects 创建外部对象存储

我们将使用 Nutanix Objects 在远程集群上启用对象存储服务,以便用于 Kasten 备份集的存储。考虑到冗余性,我们假设对象存储已经部署在不同的 Nutanix 集群上,而不是部署了 Karbon Kubernetes集群的集群上。接下来,我们将使用 Prism Central 连接对象存储,创建一个新的 Bucket ,并添加一个用户。
在 Prism Central 控制台, 找到 Services -> Objects 点击 ‘Access Keys’.

20210802081312

20210802081303

接下来, 我们将添加新用户,点击 ‘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

编辑用户访问权限,赋予之前创建的用户读写权限:

20210802080746
20210802080737

现在我们已经完成了 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’.

20210802072332

5.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 作为备份存储库,用于云原生应用的备份和恢复,保证了企业所有云原生应用的弹性和可靠性。

发表回复

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