介绍
官网地址:https://www.kasten.io/
官方文档地址:https://docs.kasten.io/latest/index.html
K10不仅仅是一个Kubernetes备份产品,而是一个数据管理平台。
K10遵循期望状态(desired-state)模型,为我们提供声明式控制,并支持所有主要的Kubernetes发行版。
它带有一个直观的、基于GUI仪表板的管理工具,支持命令行。
它可以自动发现应用程序,包括那些跨卷或数据库的应用程序,简化了备份过程。
它还包括许多安全功能,通过企业级加密、IAM角色、RBAC、OpenID连接提供全面的端到端安全。
它还有多集群管理仪表板,在单一平台上处理多集群。
它还支持PostgreSQL、MongoDB、MySQL、Cassandra和AWS关系型数据库服务等数据服务。此外,它还支持众多厂商和云提供商的存储,包括NetApp、微软等。
安装
前提条件
- 安装helm
- 添加k10 repo
- 有storageclass
helm repo add kasten https://charts.kasten.io/
- 创建namespace
# 默认的是kasten-io kubectl create namespace k10
安装k10
helm install k10 kasten/k10 --namespace=k10
这里pod会起不来,拉取不到镜像。下面是所需的镜像仓库地址。
docker.io/grafana
docker.io/jimmidyson
gcr.io/kasten-images
ghcr.io/kanisterio
quay.io/prometheus
registry.access.redhat.com/ubi8
使用docker playground下载镜像
登录docker playground,https://labs.play-with-docker.com/
添加实例
查看所需镜像
docker run --rm -it gcr.io/kasten-images/k10offline:5.5.2 list-images
拉取所需镜像
# 命令只能手动输入,不能复制粘贴
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock \
gcr.io/kasten-images/k10offline:5.5.2 pull images
登录docker hub
docker login
添加tag并推送
docker run --rm -ti -v /var/run/docker.sock:/var/run/docker.sock \
-v ${HOME}/.docker:/root/.docker \
gcr.io/kasten-images/k10offline:5.5.2 pull images --newrepo repo.example.com
重新安装
helm pull kasten/k10
helm install k10 k10-5.5.2.tgz --namespace k10 --set global.airgapped.repository=wgh9626
修改gateway svc为nodePort
k edit svc gateway -n k10
ports:
- name: http
nodePort: 30800
port: 8000
protocol: TCP
targetPort: 8000
type: NodePort
访问dashboard
ip:30800/k10/#/
输入邮箱和公司名,进入dashboard
可以看到Applications,有14个unmanaged,这个代表这些namespace中的应用没有备份策略,没有被k10管理。
备份
先看后面的备份报错解决,除非你想踩一遍我踩过的坑qaq
创建备份策略配置文件
选择设置,locations,new profile,可以指定s3,azure storage,google cloud storage,nfs,veeam repository。
这里选择s3 compatible,因为我的环境里已经有一个minio了。profile name为k10。
创建测试应用
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:stable-alpine
volumeMounts:
- mountPath: /etc/test
name: test
volumes:
- name: test
persistentVolumeClaim:
claimName: nginx-test
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-test
spec:
accessModes:
- ReadWriteOnce
# 替换成你的sc
storageClassName: longhorn
resources:
requests:
storage: 2Gi
---
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
name: http
nodePort: 32356
selector:
app: nginx
创建测试页面
查看html目录位置
创建测试页面
cat test.html
<html>
This is test html
</html>
创建备份策略
设置备份时间,选择namespace,开启集群资源备份。
可以看到test namespace已经在Compliant中了。
查看策略运行情况
点击可以查看详情
运行完成后
查看备份
minio上的备份:
longhorn上也会有个backup:
开启Reports
开启后会自动创建一个策略:
查看备份数据使用:
grafana查看
恢复
删除test namespace
k delete -f nginx.yaml -n test
k edit pvc nginx-test -n test
# 删除下面的finalizers
finalizers:
- snapshot.storage.kubernetes.io/pvc-as-source-protection
k edit volumesnapshots k10-csi-snap-5dwdgbkzkb4t62dl -n test
# 删除下面的finalizers
finalizers:
- snapshot.storage.kubernetes.io/volumesnapshot-bound-protection
k delete volumesnapshots k10-csi-snap-5dwdgbkzkb4t62dl -n test
k delete ns test
test namespace已删除。
选择restore
查看详情
可以选择恢复到新的namespace,需要点create
可以选择恢复的内容
点击restore,确认恢复
已恢复
查看恢复情况
备份报错解决
添加storageClass annotation
kubectl get volumesnapshotclass longhorn
kubectl annotate volumesnapshotclass longhorn k10.kasten.io/is-snapshot-class=true
kubectl get volumesnapshotclass longhorn -o yaml
如果不加annotation,备份策略就会报错:
Failed to find VolumeSnapshotClass with k10.kasten.io/is-snapshot-class=true annotation in the cluster
添加后仍然报错:
Failed to check and update snapshot content: failed to take snapshot of the volume, pvc-150c08c4-92e4-4975-a59c-afa09a4b3964: "timestamp: nil Timestamp"
搜索相关文档,是longhorn存储的问题:
https://github.com/longhorn/longhorn/issues/4748
VolumeSnapshotClass添加annotation:type: snap
parameters.type: snap
apiVersion: snapshot.storage.k8s.io/v1
deletionPolicy: Delete
driver: driver.longhorn.io
kind: VolumeSnapshotClass
metadata:
annotations:
k10.kasten.io/is-snapshot-class: "true"
type: snap
parameters.type: snap
name: longhorn
longhorn添加backup target,具体步骤参考这里
使用local-path storageclass报错不支持:
Volume Snapshots are not supported for this storage provider.Try K10's Generic Storage Backup method
升级k10
helm upgrade k10 k10-5.5.2.tgz --set injectKanisterSidecar.enabled=true --set-string injectKanisterSidecar.namespaceSelector.matchLabels.k10/injectKanisterSidecar=true --set global.airgapped.repository=wgh9626 -n k10
到docker playground中拉取推送ghcr.io/kanisterio/kanister-tools:0.85.0
到dockerhub,可以直接使用我的镜像
docker pull wgh9626/kanister-tools:0.85.0
重新创建测试应用,我直接使用的rancher应用商店中的mysql
k create ns mysql
k label ns mysql k10/injectKanisterSidecar=true
查看pod内容器已自动注入了sidecar。
mysql的deployment也自动加了annotations:k10.kasten.io/forcegenericbackup: "true"
创建测试数据
k get secret mysql -n mysql -o jsonpath="{.data.mysql-root-password}" | base64 -d
mysql -u root -p
create database test;
use test;
CREATE TABLE Persons (Id_P int,LastName varchar(255),FirstName varchar(255),Address varchar(255),City varchar(255));
show tables;
INSERT INTO Persons VALUES ('1', 'qq', 'aa', 'hz', 'zj');
INSERT INTO Persons VALUES ('2', 'ww', 'ss', 'hz', 'zj');
INSERT INTO Persons VALUES ('3', 'ee', 'dd', 'hz', 'zj');
select * from Persons;
创建备份
仍然报错:"Failed to backup data","function":"kasten.io/k10/kio/kanister/function.(*backupDataFunc).Exec","linenumber":120,"file":"kasten.io/k10/kio/kanister/function/backup_data.go:120","cause":{"message":"Failed to create and upload backup","function":"kasten.io/k10/kio/kanister/function.backupData","linenumber":200,"file":"kasten.io/k10/kio/kanister/function/backup_data.go:200","cause":{"message":"Failed to exec command in pod: command terminated with exit code 1"
可以通过查看kanister-svc pod的日志来查看备份失败更详细的原因
报错原因是minio存储空间不足无法备份了。删除minio的一些数据,重新备份,备份成功。
登录数据库删除person表。
登录k10恢复
可以看到k10创建了2个pod来恢复:affinity-pvc-group,restore-data
登录mysql,查看数据已恢复。