【云计算摩尔狮】Kubernetes 免费容器存储 + 容灾全攻略:本地盘管理与 Velero 备份实战

106 阅读6分钟

8f8fac6c-4e47-48c2-b5cf-d56b211ea342_1748573249123975713_origin~tplv-a9rns2rl98-image-qvalue.jpeg

背景

云原生时代,对于有存储应用的容器化上云,一般的解决思路是 “计算存储分离”,计算层通过容器技术实现弹性伸缩,而相应的存储层也需要配合进行 “动态挂载”,要实现动态挂载能力,使用基于网络的存储系统可能是最佳选择。然而,“网络” 存储的磁盘 IO 性能差、自带高可用能力的中间件系统不需要存储层的 “动态挂载” 等种种原因,业界对本地存储还是 “青睐有加”。因此类似 rabbitmq、kafka 这样的中间件系统,优先使用本地盘,然后通过 k8s 增强自动化运维能力,解决原来磁盘手动管理问题,实现动态分配、扩容、隔离。

有没有更适合 k8s 的备份恢复方案?传统的数据备份方案,一种是利用存储数据的服务端实现定期快照的备份,另一种是在每台目标服务器上部署专有备份 agent 并指定备份数据目录,定期把数据远程复制到外部存储上。这两种方式均存在 “备份机制固化”、“数据恢复慢” 等问题,无法适应容器化后的弹性、池化部署场景。我们需要更贴合 k8s 容器场景的备份恢复能力,实现一键备份、快速恢复。

实践环境准备

  1. k8s 集群:准备一个 k8s 集群,master 节点不跑 workload,最好能有 2 个 worker 节点。
  1. 本地裸盘准备:为每个 worker 挂载一块裸盘,建议至少 20G,carina 默认会占用 10G 磁盘空间,作为存储管理元数据。由于我自己使用了谷歌云,可以通过如下步骤实现:第一个是 ssd,第二个是 hdd。
gcloud apply ssd
gcloud apply hdd

3. 修改 carina 扫描策略:确认 carina 组件能够搜索并读取到新挂载的裸盘,需要通过修改 carina 默认扫描本地盘的策略:

# 根据google cloud磁盘的命名规则作了更改,匹配以sd开头的磁盘
# 这里也能看到预留了10G空间不可使用,因为200G新盘刚加入只有189G(考虑到有磁盘单位换算带来的误差)可用。
# 这些信息很重要,当pv创建时会从该node信息中获取当前节点磁盘容量,然后根据pv调度策略进行调度
# carina - node服务启动时会自动将节点上磁盘按照SSD和HDD进行分组并组建成vg卷组
# 支持文件存储及块设备存储,其中文件存储支持xfs和ext4格式

部署 Carina 云原生本地容器存储方案

1. 创建 StorageClass

想要 carina 具备自动创建 PV 能力,需要先声明并创建 storageclass。

> kubectl get sc csi - carina - sc - o json | jq.metadata.annotations
{
"kubectl.kubernetes.io/last - applied - configuration":{
"allowVolumeExpansion":true,
"apiVersion":"storage.k8s.io/v1",
"kind":"StorageClass",
"metadata":{
"annotations":{},
"name":"csi - carina - sc"
},
"mountOptions":(
"rw"
),
"parameters":{
"csi.storage.k8s.io/fstype":"ext4"
},
"provisioner":"carina.storage.io",
"reclaimPolicy":"Delete",
"volumeBindingMode":"WaitForFirstConsumer"
}
}

2. 部署带存储的测试应用

测试场景比较简单,使用简单 nginx 服务,挂载数据盘,存放自定义 html 页面。

# pvc for nginx html
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi - carina - pvc - big
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
# 指定carina的storageclass名称
storageClassName: csi - carina - sc
volumeMode: Filesystem
# nginx deployment yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: carina - deployment - big
namespace: default
labels:
app: web - server - big
spec:
replicas: 1
selector:
matchLabels:
app: web - server - big
template:
metadata:
labels:
app: web - server - big
spec:
containers:
- name: web - server
image: nginx:latest
imagePullPolicy:"IfNotPresent"
volumeMounts:
- name: mypvc - big
mountPath:/usr/share/nginx/html # nginx默认将页面内容存放在这个文件夹
volumes:
- name: mypvc - big
persistentVolumeClaim:
claimName: csi - carina - pvc - big
readOnly: false

3. 查看测试应用运行情况

# pvc
> kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
csi - carina - pvc - big Bound pvc - 74e683f9 - d2a4 - 40a0 - 95db - 85d1504fd961 10Gi RWO csi - carina - sc 109s
# pv
> kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc - 74e683f9 - d2a4 - 40a0 - 95db - 85d1504fd961 10Gi RWO Delete Bound default/csi - carina - pvc - big csi - carina - sc 109s
# nginx pod
> kubectl get po - l app = web - server - big - o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
carina - deployment - big - 6b78

通过以上步骤,我们验证了 carina 云原生本地容器存储方案的本地盘自动化管理能力,可以实现 PV 的自动创建、应用对存储的挂载使用等。

部署 Velero 云原生备份方案

1. 安装 Velero

首先,我们需要安装 Velero。可以通过官方提供的安装脚本进行安装,这里假设我们使用的是 minio 作为对象存储来存储备份数据(minio 也是免费且常用的方案)。

# 下载Velero安装脚本
curl -LO https://github.com/vmware-tanzu/velero/releases/download/v1.10.1/velero-v1.10.1-linux-amd64.tar.gz
# 解压
tar -xvf velero - v1.10.1 - linux - amd64.tar.gz
# 移动velero可执行文件到PATH路径
mv velero - v1.10.1 - linux - amd64/velero /usr/local/bin/
# 创建minio的secret,假设minio的用户名是minioadmin,密码是minioadmin
kubectl create secret generic cloud - credentials - n velero -- from - literal = cloud = $'[default]\naws_access_key_id = minioadmin\naws_secret_access_key = minioadmin'
# 创建Velero的安装配置文件velero - install.yaml
cat <<EOF >velero - install.yaml
apiVersion: operator.velero.io/v1
kind: Velero
metadata:
name: velero
namespace: velero
spec:
backupStorageLocation:
name: default
provider: aws
bucket: velero - bucket
config:
region: minio
s3ForcePathStyle:"true"
s3Url: http://minio.minio - ns:9000
credentialsSecret:
name: cloud - credentials
volumeSnapshotLocation: []
EOF
# 安装Velero
kubectl apply - f velero - install.yaml

2. 创建备份

假设我们要备份上面部署的 nginx 应用所在的命名空间 default。

velero create backup nginx - backup -- include - namespaces default

3. 恢复测试

模拟数据丢失场景,删除 nginx 应用的 PVC 和 Deployment 等资源。

kubectl delete pvc csi - carina - pvc - big
kubectl delete deployment carina - deployment - big

然后进行恢复操作。

velero restore create -- from - backup nginx - backup

查看恢复后的资源状态。

# 查看pvc恢复情况
kubectl get pvc
# 查看deployment恢复情况
kubectl get deployment

通过以上操作,我们验证了 Velero 在 k8s 容器场景下的数据备份和恢复能力,能够实现对应用及相关存储资源的快速备份和恢复。

总结

通过部署 carina 云原生本地容器存储方案,我们实现了本地盘的自动化管理,为容器化应用提供了高效的本地存储支持,解决了网络存储性能差等问题。而通过部署 Velero 云原生备份方案,我们实现了贴合 k8s 容器场景的一键备份、快速恢复功能,弥补了传统备份方案的不足。在实际生产环境中,可以根据业务需求和资源情况,进一步优化和扩展这些方案,例如使用更可靠的对象存储服务、配置更复杂的备份策略等,以保障容器化应用数据的安全和业务的连续性。

云计算培训摩尔狮的独特优势助力解决问题 摩尔狮的课程不仅有理论知识和实践方法,还有强大的师资团队和教学服务。当遇到云计算运维相关问题时,不要慌张。借助在摩尔狮学到的知识和技能,从理论分析到实践排查,多维度入手,就能精准定位并解决问题。