Skip to main content

Centos8.3部署kubernetes及使用Veeam Kasten K10备份恢复指南-update (下)


Richard Wu
Forum|alt.badge.img

本文详述了在Centos 8.3上安装k8s,安装helm, 创建nfs storageclass,采用Air-Gapped方式安装Veeam Kasten k10, 部署minio并创建S3 bucket作为Veeam kasten k10备份存储库,手工部署mysql并应用kanister blueprint,使用Veeam kasten k10实现针对mysql无代理应用感知备份恢复的详细步骤及截图。

本文使用的测试环境是Centos8.3(4 core CPU/10GB内存/50GB硬盘),k8s版本是1.21.3,  Veeam Kasten K10版本是4.5.12.

 

4. 安装配置helm

下载helm 3.1.2:

[root@centos8-k8s ~]# pwd

/root

[root@centos8-k8s ~]# wget https://get.helm.sh/helm-v3.1.2-linux-amd64.tar.gz

[root@centos8-k8s ~]# tar zxvf helm-v3.1.2-linux-amd64.tar.gz linux-amd64/

[root@centos8-k8s ~]# cp -a linux-amd64/helm /usr/local/bin/

[root@centos8-k8s ~]# helm version

version.BuildInfo{Version:"v3.1.2", GitCommit:"d878d4d45863e42fd5cff6743294a11d28a9abce", GitTreeState:"clean", GoVersion:"go1.13.8"}

[root@centos8-k8s ~]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

[root@centos8-k8s ~]# helm repo update

[root@centos8-k8s ~]# vi /etc/profile

添加一行:

export KUBECONFIG=/root/.kube/config

 

v2-21cf4292592e0e43dc6a5fb321911a6e_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

[root@centos8-k8s ~]# . /etc/profile

 

 

5.安装nfs服务

[root@centos8-k8s ~]# yum -y install nfs-utils rpcbind

[root@centos8-k8s ~]# mkdir /nfsdata

[root@centos8-k8s ~]# vi /etc/exports

添加以下内容:

/nfsdata *(rw,sync,no_root_squash)

[root@centos8-k8s ~]# exportfs -rv

exporting *:/nfsdata

[root@centos8-k8s ~]# systemctl start rpcbind

A dependency job for rpcbind.service failed. See 'journalctl -xe' for details.

[root@centos8-k8s ~]# vi /etc/sysctl.conf

添加2行:

net.ipv6.conf.all.disable_ipv6 = 0

net.ipv6.conf.default.disable_ipv6 = 0

 

v2-03844a124844b603a58800f4f49d1c97_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

[root@centos8-k8s ~]# systemctl restart rpcbind.service

[root@centos8-k8s ~]# systemctl start nfs-server

[root@centos8-k8s ~]# systemctl enable nfs-server

[root@centos8-k8s ~]# systemctl status nfs-server

 

v2-ea98ea65261fc5b0d0fd76631fde6f7c_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

[root@centos8-k8s ~]# rpcinfo -p

[root@centos8-k8s ~]# showmount -e

Export list for Centos8.3-k8s:

/nfsdata *

[root@centos8-k8s ~]# mount -t nfs 192.168.17.131:/nfsdata /mnt/

[root@Centos8 mnt]# df -h

 

v2-887e403015ec6b6ae11c93a9a5190a74_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

6. 创建配置StorageClass

[root@centos8-k8s external-storage]# git clone https://github.com/helm/charts.git

 

v2-f0a9e520396ecc7d62b42e3045b168f4_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

[root@centos8-k8s external-storage]# cd charts

[root@centos8-k8s charts]# helm install nfs-client-provisioner stable/nfs-client-provisioner --set nfs.server=192.168.17.131 --set nfs.path=/nfsdata

 

v2-504e4b290bede38070f886f8749c5b1c_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

[root@centos8-k8s nfs-client-provisioner]# kubectl get sc

 

v2-7f995f2cae4bb51c4e08c192ff5e9b29_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

设置为default storage class.

[root@centos8-k8s nfs-client-provisioner]# kubectl patch storageclass nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

storageclass.storage.k8s.io/nfs-client patched

 

v2-a6c80033290bcd481f4ad13c2e3024ff_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

[root@centos8-k8s nfsdata]# kubectl get sc

 

v2-26946f2e81b80cf1e8d2428e2e307411_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

[root@centos8-k8s charts]# chmod 777 /nfsdata

[root@Cen8]# vi /etc/kubernetes/manifests/kube-apiserver.yaml

添加一行:

- --feature-gates=RemoveSelfLink=false

 

v2-e304ff1b7e19cf0962a30621552d634d_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

[root@Cen8]# kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml

[root@Cen8-131 charts]# kubectl get node

NAME STATUS ROLES AGE VERSION

localhost.localdomain Ready control-plane,master 3h42m v1.21.3

通过以下测试验证storageclass是否创建配置成功。

[root@centos8-k8s charts]# vi test-claim.yaml

添加如下内容:

# vim test-claim.yaml

kind: PersistentVolumeClaim

apiVersion: v1

metadata:

name: test-claim

spec:

accessModes:

- ReadWriteMany

resources:

requests:

storage: 1Mi

[root@centos8-k8s charts]# kubectl apply -f test-claim.yaml

persistentvolumeclaim/test-claim created

[root@centos8-k8s charts]# kubectl get pv

[root@Cen8-131 charts]# kubectl get pods

[root@Cen8-131 charts]# kubectl get pvc

 

v2-098dcce027d0b55fa1a26fde5e77166b_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

看到以上结果,表明nfs storageclass创建成功。

 

7. 安装Veeam Kasten K10

[root@centos8-k8s ~]# helm repo add kasten https://charts.kasten.io/

"kasten" has been added to your repositories

[root@centos8-k8s ~]# helm fetch kasten/k10 --version=4.5.12

[root@centos8-k8s ~]# helm repo update

Hang tight while we grab the latest from your chart repositories...

...Successfully got an update from the "aliyun" chart repository

...Successfully got an update from the "kasten" chart repository

Update Complete. ⎈ Happy Helming!⎈

[root@centos8-k8s ~]# kubectl create namespace kasten-io

namespace/kasten-io created

[root@centos8-k8s ~]# pwd

/root

[root@centos8-k8s ~]# touch config.json

 

v2-9de9f7310720cf6648b7c56cadf005b3_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

下面k10的安装命令中:

--set global.airgapped.repository=ccr.ccs.tencentyun.com/kasten 表示使用的air-gapped镜像库是 ccr.ccs.tencentyun.com/kasten

--set injectKanisterSidecar.enabled=true 表示Enable Kanister sidecar injection 对于pods。

--set metering.mode=airgap 表示采用air-gapping方式添加metering mode

--set secrets.dockerConfig=$(base64 -w 0 </root/config.json)

--set prometheus.imagePullSecrets[0].name="k10-ecr" 以上两个set表示采用loal private repositoy后, repository密钥的提供方式。

--set prometheus.server.persistentVolume.enabled=false 表示Alertmanager不会创建/使用PVC,而是使用emptyDir。

[root@centos8-k8s ~]# helm install k10 k10-4.5.12.tgz --namespace kasten-io --set global.airgapped.repository=ccr.ccs.tencentyun.com/kasten --set injectKanisterSidecar.enabled=true --set metering.mode=airgap --set secrets.dockerConfig=$(base64 -w 0 </root/config.json) --set prometheus.imagePullSecrets[0].name="k10-ecr" --set prometheus.server.persistentVolume.enabled=false

 

 

v2-76f888ca7125bf071518bb1b85be2442_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

[root@centos8-k8s ~]# kubectl get pod -n kasten-io -w

 

v2-d2427429f2dd8bf4337c822c2e5f5ca0_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

使用NodePort方式暴露kasten K10的web管理页面,可以在其它的能访问该node IP的浏览器访问Kasten k10 Dashboard:

[root@Cen8-131 ~]# kubectl expose -n kasten-io deployment gateway --type=NodePort --name=gateway-nodeport-svc --port=8000

service/gateway-nodeport-svc exposed

[root@Cen8-131 ~]#

通过以下命令查看通过NodePort方式访问时的Port, 记下8000: 后面跟的端口号:

[root@Cen8-131 ~]# kubectl get svc -n kasten-io gateway-nodeport-svc

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

gateway-nodeport-svc NodePort 10.10.129.215 <none> 8000:30685/TCP 20s

[root@centos8-k8s ~]# kubectl --namespace kasten-io port-forward service/gateway 8080:8000

Forwarding from 127.0.0.1:8080 -> 8000

Forwarding from [::1]:8080 -> 8000

……

在192.168.17.131上的浏览器输入下列网址:

http://127.0.0.1:8080/k10/#/

或者其它的能访问该node IP的浏览器输入下列网址:

http://192.168.17.131:30685/k10/#/

输入公司和邮箱,点击accept按钮,

 

v2-2c238e0f0d83364732f8c94c891b6336_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

v2-87a58263d13884721f650a607fb6301c_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

 

8. 手工部署mysql并对其应用kanister blueprint应用感知

[root@k8s-131 ~]# helm repo add bitnami https://charts.bitnami.com/bitnami

[root@k8s-131 ~]# helm repo update

[root@k8s-131 ~]# kubectl create namespace mysql-bp

[root@k8s-131 ~]# helm install mysql-release bitnami/mysql --namespace mysql-bp \--set auth.rootPassword='password'

 

v2-c92d4edc83140f4b1937fe1ddb52b404_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

[root@k8s-131 ~]# vi mysql-blueprint.yaml

拷贝以下网址的代码内容,粘贴,然后保存退出。

https://github.com/kanisterio/kanister/blob/master/examples/mysql/blueprint-v2/mysql-blueprint.yaml

[root@k8s-131 ~]# kubectl --namespace kasten-io apply -f mysql-blueprint.yaml

 

v2-93ccadd39b7163841b196f4f6a75d8dc_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

[root@k8s-131 ~]# kubectl --namespace mysql-bp annotate statefulset/mysql-release kanister.kasten.io/blueprint=mysql-blueprint

[root@k8s-131 ~]# kubectl get pod -n mysql-bp

 

v2-9f2214ca01435b3cf42ce4638d945db5_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

9. 部署minio并创建S3 bucket作为Veeam Kasten K10备份存储库

[root@k8s-131 ~]# wget https://dl.min.io/server/minio/release/linux-amd64/minio

[root@k8s-131 ~]# chmod +x minio

[root@k8s-131 ~]# ./minio server /data

 

v2-dc7fd4f3188334c23359d6263cd452dc_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

使用浏览器访问:http://192.168.17.131:9000, 输入缺省账号/密码:minioadmin/minioadmin

并创建用来作为备份存储库的bucket

 

v2-cbc3bcbfc4d762c8ccf0d8855d2d566a_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

v2-0b90dc5219f9cfbc40c745000a86044b_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

在 Veeam Kasten K10中创建location profile:

 

v2-69b5bbc4c984dade27ced576bdc23bb7_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

Profile name: minio

Cloud Storage Provider: S3 Compatible

S3 Access Key: minioadmin

S3 Secret: minioadmin

Endpoint: http://192.168.17.131:9000

Skip certification and hostname verification选项打勾

Bucket Name: richardwu

 

 

v2-75b6fc45298185cf5d1fb44be3b4248e_720w.jpg?source=d1c2d5a6

编辑

添加图片注释,不超过 140 字(可选)

 

 

v2-fdb56b6714b5e1bc8a28e2fcda6aec0c_720w.jpg?source=d1c2d5a6

编辑

添加图片注释,不超过 140 字(可选)

 

 

v2-c97ee996dc08cdbeccbf24320640c487_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

10. 使用Veeam Kasten k10备份mysql

创建backup policy:

在K10 Dashboard页面,点击Policies下的create new policy按钮

 

v2-bf039c294064d16364c067af2549441a_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

在action里选择snapshot, 选择daily和 snapshot retention, ,激活Enable Backup via. Snapshot exports,即除了对应用做快照外,还会把快照时间点对应的数据块写到备份存储库,在Export location profile出选择之前创建的location profile :之后,选择Retention of exports, 即备份数据的保留周期,

在Select Application里选择by name, 然后在下拉框里选择应用, 在Advanced snapshot settings里,确认Location profile for Kanister actions里选择的是刚创建的location profile , 点击create policy按钮,保存policy.

 

 

v2-d56cffa84b0adccea228b85a0cf11844_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

 

v2-744d6f65e36d2fc97cdcc9fdb42b7660_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

v2-b298455a6a3c74d508740c30710ae999_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

v2-f626eeda7f7e430946c3e4f12e49ae48_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

在刚创建的备份策略mysql-bp-backup 里,点击位于policy右侧的run once按钮,

 

 

v2-0013e5849906669809177d171429bb95_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

点击Run policy按钮,

 

 

v2-d0955fd68429f88e517da7adbaa89acd_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

v2-c9c3ca41ef446f3543a720a0d8c46a3b_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

v2-871298f143b1eb7c644c230b5e014546_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

可以看到Actions栏该backup和export行前面是有打勾,且上面直方图是黑色的,表示“Completed”, 即针对mysql的备份成功。双击Action栏该backup或export行,可以查看Action detail,

双击backup行,可以查看详细信息,可以看到Actifacts后面有kanister的路径描述,表示本次备份过程中kanister blueprint得到成功应用。

 

 

 

11. 使用Veeam Kasten K10恢复mysql

在之前创建的mysql 容器里,运行use mysql; 然后创建MyClass表,并插入3条记录。

进入指定MySQL Pod的命令提示符界面, 在K8s master节点执行指令格式如下:

kubectl exec -it <pod-name> -n <namespace> /bin/bash

[root@centos8-k8s ~]# kubectl exec -it mysql-release-0 -n mysql-bp /bin/bash

kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.

Defaulting container name to mysql.

Use 'kubectl describe pod/mysql-release-0 -n mysql-bp' to see all of the containers in this pod.

I have no name!@mysql-release-0:/$ mysql -uroot -p

Enter password:

创建MyClass表,并插入3条记录。

mysql> use mysql;

mysql> show tables;

mysql> create table MyClass( id int(4) not null primary key auto_increment, name char(20) not null, sex int(4) not null default '0', degree double(16,2));

mysql> insert into MyClass values(1,'Tom',0,96.45),(2,'Joan',0,82.99),(3,'Wang',1,96.59);

mysql> select * from MyClass;

 

v2-2b31c244c1a46ff831ab2f9d913b1635_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

在K10 Dashboard点击Application:,找到上面备份的mysql-bp应用,点击restore按钮。

 

v2-1bfc7fe407cb946427a701a38339eefd_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

选择restore point进行恢复,在这里选择插入MyClass表之前的备份时间点,

 

v2-7acab4aeba39ae161f389e4366820cb3_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

v2-1328343e3ce7e7da1ea1f290817c93bb_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

v2-34c303f451d696495f82f7bbe71dedbb_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

v2-f01d39b9b8c57d44652a4fc46582ae90_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

 

使用缺省属性设置,直接点击restore按钮。

 

v2-8e93cbbbdc7155f38439c5d1b9d98399_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

 

确认点击restore按钮。

 

v2-656416d24a270f6f2032b9a061b25594_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

可以看到Actions栏该restore行前面是有打勾,且上面直方图是黑色的,表示“Completed”, 即针对mysql的恢复成功。

 

 

v2-b7ba4a163ea8ed3dd004f6269c5ca31b_720w.jpg?source=d1c2d5a6

编辑

添加图片注释,不超过 140 字(可选)

 

 

 

v2-b67851241b898a957e6ecc7febba104b_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

进入mysql数据库,通过show tables命令查看,发现之前创建的MyClass表已经不在了,表明k10针对mysql的恢复确实成功了。

 

 

12. 重启OS之后的操作

如果重启OS之后,需要运行下列命令确保Veeam Kasten K10的正常运行:

输入以下命令重启k8s服务:

[root@k8s-131 ~]# systemctl restart docker.service

[root@k8s-131 ~]# systemctl restart kubelet.service

 

v2-88fa9b54d1812eed7d693c444a07d648_720w.jpg?source=d1c2d5a6

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 

在minio的下载路径,输入以下命令重启minio服务:

[root@k8s-131 ~]# ./minio server /data

输入以下命令暴露Veeam Kasten K10 Dashboard管理界面:

[root@centos8-k8s ~]# kubectl --namespace kasten-io port-forward service/gateway 8080:8000

 

 

13. 卸载Veeam Kasten K10

运行以下命令,自动卸载:

[root@centos8-k8s ~]# helm uninstall k10 -n kasten-io

1 comment

  • Not a newbie anymore
  • 2 comments
  • July 13, 2022

pository=ccr.ccs.tencentyun.com/kasten --set    

安装 k10   air-GAP的方式这个 仓库能用吗?为啥我安装的时候总是 pullimageerror 呢?