Kasten k10 多云平台适配系列 10 – 利用 Kasten K10 保护 联通云 CSK 云原生应用

Kasten k10 多云平台适配系列 10 - 利用 Kasten K10 保护 联通云 CSK 云原生应用

[TOC]

1. 前言

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

2. Kasten 与 联通云 CSK 3.0

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

20220719233613

联通云容器引擎(Container Service for Kubernetes) 联通云容器服务CSK(Container Service for Kubernetes)是中国联通自助研发的、基于Kubernetes的高性能高可靠的容器服务产品。为容器化应用提供高效部署、资源调度、服务发现、动态伸缩等全生命周期管理功能。容器服务CSK支持控制台一键创建集群,免去用户搭建、维护容器集群的工作,帮助用户降低成本、提高效率,更专注于业务创新。

3.Kasten K10 部署规划

3.1 技术资源准备与要求

Kasten K10 部署在联通云需要以下先决条件 :

  • CSK 联通云 Container Service for Kubernetes v1.18.8 联通云容器引擎是高性能的企业级 Kubernetes 集群,借助云容器引擎,企业可以在联通云上轻松部署、管理和扩展容器化应用程序。
  • ECR 联通云容器镜像服务 (Elastic Container Registry)容器镜像服务 为用户提供容器应用镜像的托管服务,支持镜像安全扫描、权限管理等功能,可联合容器服务等云产品、自建K8S集群使用,打造容器化应用全生命周期管理的一体化方案。
  • BSS-CSI 组件 BSS-CSI 组件 支持 CSK 集群通过控制台快捷选择存储类型,并创建对应块存储云硬盘类型的 PV 和 PVC。
  • 联通云 OSS 对象存储, 用于存放备份的数据集,在本实例中也用于存储部署 Kasten K10 的自动化检测脚本
  • 技术人员要求 部署人员除了对联通云 CSK 有一定了解以外,还应该具备 K8S 或 CSK 运维的相关知识。

3.2 K8S 集群资源需求

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

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

需求类型

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

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

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

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

需求配置指南
下表列出了 K10 基础的资源要求。需要注意的是,DR 作业也包含在最大并行度限制中,因此您只能 N 同时拥有备份作业 或 N-1 备份作业 + 1 个 DR 作业同时进行。

类型 需求 CPU (Cores) 上限 CPU (Cores) 需求 Memory (GB) 上限 Memory (GB)
静态资源 1 2 1 4
备份作业 (每任务) 1 1 0.4 0.4
容灾作业(每任务) 1 1 0.3 0.3

4. 部署联通云 Kubernetes 环境

4.1 部署联通云 CSK 3.0 K8S 集群

4.1.1 登录联通云控制台

进入CSK实例列表页面,单击创建,进入创建流程,如下图。CSK集群创建流程包括:集群配置、Master配置、Worker配置、系统及组件配置、确认配置等环节。

20220719235733

4.1.2 集群配置
包括基本信息配置、网络配置等,如下图
20220720000301

4.1.3 Master 节点配置
配置集群 Master 节点,包括规格、数量、访问方式等。
20220720000411

4.1.4 Worker 节点配置
配置集群Worker节点,包括规格、数量等
20220720000519

4.1.5 系统及组件配置

20220720000614

4.1.6 确认配置
查看集群配置信息,阅读并勾选服务协议,单击立即购买完成容器集群的创建。

20220720000730

4.2 CSK 集群实例管理

容器服务CSK产品控制台提供实例列表,可查看已经创建的CSK集群相关信息。列表中包括集群名称/ID、集群规格、云区域/专区、状态、到期时间以及操作,实例列表如下图

20220720001100

4.3 CSK 集群网络参数配置

在这里配置 EIP Ingress 和 EIP API Server 的公网 IP

20220720001223

注意安全规则的配置,方便进行应用访问

20220720001455

4.4 CSK 集群 CSI 插件配置

点击 CSI 更新认证信息

20220720001627

4.5 查看集群访问信息

查看集群访问信息,把公网访问信息复制到 $HOME/.kube/config
20220720002537

$HOME/.kube/config 配置文件如下

❯ cat $HOME/.kube/config
apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: https://106.74.26.168:6443
  name: csk-cluster
contexts:
- context:
    cluster: csk-cluster
    user: admin
  name: csk-context
current-context: csk-context
kind: Config
preferences: {}
users:
- name: admin
  user:
    token: 50992844b15972b8f10dce734af8b3e1

发现 CSK Node 的信息

❯ kubectl get nodes -o wide
NAME            STATUS   ROLES    AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION           CONTAINER-RUNTIME
192.168.0.222   Ready    <none>   15d   v1.18.8   192.168.0.222   <none>        CentOS Linux 7 (Core)   3.10.0-1062.el7.x86_64   containerd://1.4.4
192.168.0.245   Ready    <none>   15d   v1.18.8   192.168.0.245   <none>        CentOS Linux 7 (Core)   3.10.0-1062.el7.x86_64   containerd://1.4.4
192.168.0.96    Ready    <none>   15d   v1.18.8   192.168.0.96    <none>        CentOS Linux 7 (Core)   3.10.0-1062.el7.x86_64   containerd://1.4.4

5. Kasten K10 部署前的准备

5.1 配置联通云 ECR 镜像库

确保联通云 ECR 镜像库 已经配置完善, ECR 镜像库的支持内网与外网访问,详细情况请查看 Mars Zhang 之前的博客

20210808152625

5.2 部署 MinIO 对象存储

5.2.1 创建 MinIO Namespace

$ kubectl create ns minio
$ kubens minio

5.2.2 MinIO 配置文件

apiVersion: v1
kind: Service
metadata:
  name: minio
spec:
  ports:
  - port: 9000
    targetPort: 9000
  selector:
    app: minio
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: minio-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: minio
spec:
  serviceName: "minio"
  replicas: 1
  selector:
    matchLabels:
      app: minio
  template:
    metadata:
      labels:
        app: minio
    spec:
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: minio-pvc
      containers:
      - name: minio
        volumeMounts:
        - name: data 
          mountPath: "/data"
        image: minio/minio:RELEASE.2020-12-10T01-54-29Z
        args:
        - server
        - /data
        env:
        - name: MINIO_ACCESS_KEY
          value: "minio"
        - name: MINIO_SECRET_KEY
          value: "minio123"
        ports:
        - containerPort: 9000
          hostPort: 9000

5.2.3 部署 MinIO 并查看配置

❯ kubectl apply -f minio.yaml

❯ kubectl get all -n minio
NAME          READY   STATUS    RESTARTS   AGE
pod/minio-0   1/1     Running   0          1m

NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/minio   ClusterIP   172.16.70.110   <none>        9000/TCP   15h

NAME                     READY   AGE
statefulset.apps/minio   1/1     1m

$ kubectl port-forward -n minio svc/minio 9000:9000 &

5.2.4 部署 MinIO 并创建存储桶

20220720055228

5.3 启用 BSS CSI 插件

利用联通云的 BSS CSI,我们可以快速的得到要备份的数据,具体见下方的 yaml 文件。

5.3.1 存储类及快照类配置文件

❯ kubectl get sc
NAME             PROVISIONER                 RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
bssc (default)   bssplugin.csi.cucloud.com   Delete          Immediate           true                   8d

❯ kubectl get volumesnapshotclass
NAME        DRIVER                      DELETIONPOLICY   AGE
snapclass   bssplugin.csi.cucloud.com   Delete           6d8h

5.3.2 存储类及快照类配置文件

#1.BSS-StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: bssc
provisioner: bssplugin.csi.cucloud.com
allowVolumeExpansion: true
# reclaimPolicy: Retain  默认为Delete
# reclaimPolicy为delete时, 删除pvc后会自动将对应pv一起删除,并将云硬盘进行退订(数据销毁)
# reclaimPolicy为Retain时, 删除pvc后会,对应pv不会被一起删除, 云硬盘会保留
parameters:
  purchaseNumber: "1"    # 购买时长, 单位/月, 或年
  purchaseUnit: "3"    # 计费类型, 3表示包月, 5表示包年
  storage-type: "rbd"  # 磁盘类型, 如果区域支持ssd, 可以填 rbd-ssd
  fsType: "ext4"   # 文件系统格式,默认为ext4

#2.BSS-SnapshotClass
apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshotClass
metadata:
  name: snapclass
driver: bssplugin.csi.cucloud.com
deletionPolicy: Delete

# 不支持将现有PVC恢复到快照所表示的早期状态(只支持从快照中创建新卷)

5.3.3 配置存储类及快照类配置文件

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

❯ kubectl annotate storageclass bssc \
    k10.kasten.io/volume-snapshot-class=snapclass
storageclass.storage.k8s.io/bssc annotated

❯ kubectl get sc bssc -oyaml
allowVolumeExpansion: true
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    k10.kasten.io/volume-snapshot-class: snapclass
    kubectl.kubernetes.io/last-applied-configuration: |
      {"allowVolumeExpansion":true,"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"bssc"},"parameters":{"fsType":"ext4","purchaseNumber":"1","purchaseUnit":"3","storage-type":"rbd"},"provisioner":"bssplugin.csi.cucloud.com","reclaimPolicy":"Delete"}
    storageclass.beta.kubernetes.io/is-default-class: "true"
  creationTimestamp: "2022-07-11T06:05:03Z"
  name: bssc
  resourceVersion: "3742674"
  selfLink: /apis/storage.k8s.io/v1/storageclasses/bssc
  uid: 1cacd390-f28e-495c-8a54-c0492d486148
parameters:
  fsType: ext4
  purchaseNumber: "1"
  purchaseUnit: "3"
  storage-type: rbd
provisioner: bssplugin.csi.cucloud.com
reclaimPolicy: Delete
volumeBindingMode: Immediate

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

kubectl annotate volumesnapshotclass snapclass \
k10.kasten.io/is-snapshot-class=true
❯ kubectl get volumesnapshotclass snapclass -oyaml
apiVersion: snapshot.storage.k8s.io/v1
deletionPolicy: Delete
driver: bssplugin.csi.cucloud.com
kind: VolumeSnapshotClass
metadata:
  annotations:
    k10.kasten.io/is-snapshot-class: "true"
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"snapshot.storage.k8s.io/v1beta1","deletionPolicy":"Delete","driver":"bssplugin.csi.cucloud.com","kind":"VolumeSnapshotClass","metadata":{"annotations":{},"name":"snapclass"}}
  creationTimestamp: "2022-07-13T08:05:15Z"
  generation: 1
  name: snapclass
  resourceVersion: "2129852"
  selfLink: /apis/snapshot.storage.k8s.io/v1/volumesnapshotclasses/snapclass
  uid: d5c39fe0-7c34-44cf-84c1-ad9dde1c21dd

5.5. 安装前的检查 Pre-Flight Checks

通过 Pre-Flight Checks 脚本,我们可以验证部署的前提条件是否满足。

#原有命令
$ curl -O https://docs.kasten.io/tools/k10_primer.sh | bash

#中国本地使用
$ curl https://blog.backupnext.cloud/k10_primer.sh | bash

#中国本地存储检查使用
$ curl -s https://blog.backupnext.cloud/k10_primer.sh  | bash /dev/stdin -s ${STORAGE_CLASS}

#中国本地存储检查使用 --runAsUser=1000
$ curl -s https://docs.kasten.io/tools/k10_primer.sh | bash /dev/stdin -c "storage csi-checker -s ibmc-vpc-block-10iops-tier --runAsUser=1000"

4.5 安装 K10 到 联通云 CSK 3.0 集群

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.9
Hang tight while we grab the latest from your chart repositories...
...SuCSKssfully 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

在选联通云 BSS CSI 的云硬盘时,有个最小为 10GB 的限制,对于 Kasten 来说,有些 PVC 的要求仅为 1GB ,所以我们将其更改为 10G 以上为联通云部署作适配, 同时配置的参数还有为扩展 gateway 的 LB 用于外网访问 Kasten 图形界面。

helm install k10 k10-4.5.9.tgz --namespace kasten-io --set global.airgapped.repository=ccr.ccs.tencentyun.com/kasten \
  --set global.persistence.metering.size=10Gi \
  --set prometheus.server.persistentVolume.size=10Gi \
  --set global.persistence.catalog.size=10Gi \
  --set externalGateway.create=true \
  --set auth.basicAuth.enabled=true \
  --set auth.basicAuth.htpasswd='mars:$apr1$Cgu1sGVZ$w/8aLHZkVT73OqYZ06C0v.' \
  --set metering.mode=airgap \
  --set global.persistence.storageClass=bssc

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

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

如果安装时有问题可以用 Helm Template来查看

helm template k10 k10-4.5.9.tgz --namespace kasten-io --debug --output-dir . --set global.airgapped.repository=ccr.ccs.tencentyun.com/kasten \
  --set global.persistence.metering.size=10Gi \
  --set prometheus.server.persistentVolume.size=10Gi \
  --set global.persistence.catalog.size=10Gi \
  --set externalGateway.create=true \
  --set auth.basicAuth.enabled=true \
  --set auth.basicAuth.htpasswd='mars:$apr1$Cgu1sGVZ$w/8aLHZkVT73OqYZ06C0v.' \
  --set metering.mode=airgap \
  --set global.persistence.storageClass=bssc

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      172.16.30.156    <none>          8000/TCP                       28h
gateway-admin           ClusterIP      172.16.22.11     <none>          8877/TCP                       28h
gateway-ext             LoadBalancer   172.16.23.54     <pending>       80:34127/TCP                   28h

~
❯ kubectl get svc -n kasten-io |grep kasten 
kasten                  LoadBalancer   172.16.49.209    192.168.0.106   8000:33115/TCP                 28h

浏览器访问如下地址

20220720152206

http://106.74.26.48:8000/k10/#

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

20210703034500

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

20220720152318

5. 在 K10 中配置 MinIO 作为备份存储库

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

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

20220720152421

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

6.1 云原生应用的备份

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

20220720152526

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

20220720152622

观察 联通云 CSK 的存储快照, k10-csi-snap 开头的就是 Kasten 生成的快照

❯ kubectl get volumesnapshotcontent |grep k10
k10-csi-snap-j4xcwsb6s4857n29-content-e6df0e11-7052-4e5b-83e7-004e206476f2   false                      Retain           bssplugin.csi.cucloud.com   k10-clone-snapclass   k10-csi-snap-j4xcwsb6s4857n29     mysql4                    95m
k10-csi-snap-m45fp7k97n9vms8n-content-8e584b1e-8907-4e6b-ba2b-682deae0297f   false                      Retain           bssplugin.csi.cucloud.com   k10-clone-snapclass   k10-csi-snap-m45fp7k97n9vms8n     mysql4                    92m
k10-csi-snap-mxxrb6v74wr5tfms-content-49f15995-8ee3-47e5-a2ca-d9f68dc9b7a2   false                      Retain           bssplugin.csi.cucloud.com   k10-clone-snapclass   k10-csi-snap-mxxrb6v74wr5tfms     mysql4                    93m
k10-csi-snap-nhvhfqpd4zqpbwkz-content-ac514463-f575-4b19-a615-16469b61c8d6   false                      Retain           bssplugin.csi.cucloud.com   k10-clone-snapclass   k10-csi-snap-nhvhfqpd4zqpbwkz     mysql4                    95m

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

20220720152821

6.2 云原生应用的还原

在 K10 界面找到 Applications 点击 Restore 选择还原的时间点, 新建一个 Namespace 进行还原,这里我们命名为 mysql2
20220720153856

在 联通云 CSK Dashboard 中我们已经看到还原的应用在正常的运行了

20220720154235

7. 总结

随着云原生生态的越发成熟,越来越多的企业将有状态的工作负载部署到 联通云 CSK 集群里,Kasten K10 by Veeam 解决方案 ,利用联通云的 CSK、 ECR 镜像库, 对象存储,BSS 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
联通云容器引擎 CSK 3.0
https://www.cucloud.cn/product/csk.html

发表回复

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