Portworx Essentials + Velero:备份Kubernetes应用

Portworx近期发布了免费的Essentials版本。(https://portworx.com/announcing-portworx-essentials/)。Essentias)。

Essentials版本支持小规模Kubernetes生产系统运行所需的必要功能:也许是CICD的pipeline,或是处于开发早期的面向用户的APP。不论是那种应用,都需要更快的存储、高可用、加密、快照等等必要功能。PortworxEssentials提供了这些必要功能。

备份和恢复Kubernetes集群和所有应用,或仅备份和恢复一个独立的Kubernetes应用,包括数据、应用配置和Kubernetes对象(如CRDs、Secrets、服务账户等),具体应该怎么做呢?

Portworx Enterprise版本的客户可以使用PX-Backup,来完成一个端到端的备份和恢复解决方案。但如果用户正在使用Portworx Essentials,则需要用户把Portworx快照与开源Kubernetes备份方案Velero配合来使用。Velero可以备份Kubernetes状态比如应用配置、和存储在etcd的对象。这个方案很适初始小型规模的Kubernetes环境。当用户的Kubernetes环境规模扩大以后,可以转向使用Portworx Enterprise和PX-Backup。

接下来我们会介绍如何使用Portworx Essentials和Velero,通过Portworx快照来完成备份和恢复功能。

安装Portworx Essentials

你可以登录Portworx网站来获取免费的Portworx Essentials(https://ask.portworx.com/essentials/?utm_medium=website&utm_source=pricing%20page&utm_campaign=Essentials)。

Portworx微信公众号上一期的文章,专门介绍了如何安装和使用Portworx Essentials,可供您参考。

在AWS上使用S3来安装Velero Server组件

为了配合使用Velero和Portworx,用户必须安装服务组件以及对象存储。在下面的操作中,我们使用的是Amazon的S3,建立S3的操作步骤可以参考这里(https://github.com/vmware-tanzu/velero-plugin-for-aws#create-s3-bucket)。

注意:我们在本文中使用S3作为我们备份中需要的对象存储。也可以使用其他的对象存储,比如Minio、微软Azure、GCP,等,只要能够正确的配置即可。

一旦配置完成了Amazon S3,你可以通过下面的命令来安装Velero,首先安装Velero,安装完成后我们会增加Portworx的插件。

$ velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.0.1 \
--bucket $BUCKET \
--backup-location-config region=$REGION \
--snapshot-location-config region=$REGION \
--secret-file ./credentials-velero

接下来,因为我们需要使用Portworx来完成云中的PV的快照,我们可以使用下面的命令来添加Portworx插件。

$ velero plugin add portworx/velero-plugin:1.0.0

一旦以上的步骤都顺利完成,就可以继续进行下面的配置了。

增加Portworx云身份验证

Portworx会创建基于云中块存储的快照(https://docs.portworx.com/reference/cli/cloud-snaps/)来备份用户的数据。因此,我们需要为Portworx配置对象存储的云身份验证。我们使用Pxctl – Portworx的CLI工具,来进行操作。首先,通过一个Portworx Pod创建PX-POD环境。

PX_POD=$(kubectl get pods -l name=portworx -n kube-system -o jsonpath='{.items[0].metadata.name}')

接下来,我们要确保我们的云快照是被加密的,这样我们可以创建一个Secret,并用这个Secret作为我们的加密密文,传递给Portworx。一个简单的方式是使用64位的哈希字符串。

echo "mysupersecret" | base64
bXlzdXBlcnNlY3JldAo=

接下来,我们通过pxctl,并基于Amazon的密钥和加密密文来创建我们的身份验证。

$kubectl exec $PX_POD -n kube-system -- /opt/pwx/bin/pxctl credentials create --s3-access-key  --s3-secret-key  --s3-region us-east-1 --encryption-passphrase bXlzdXBlcnNlY3JldAo= --s3-endpoint s3.amazonaws.com --provider s3 awss3
Credentials created successfully, UUID:f8d2cf6d-ab50-4e42-90b6-9930336ad898

为Portworx创建快照的位置

Velero可以为持久卷的数据和应用元数据使用SnapshotLocation(https://velero.io/docs/master/api-types/volumesnapshotlocation/)和BackupLocation(https://velero.io/docs/master/locations/)。可以使用下面的命令。

注意:你将会需要使用credId,它是一个从上文的你的pxctl 验证身份创建命令里产生的UUID。

$ velero snapshot-location create portworx-cloud --provider portworx.io/portworx --config type=cloud,credId=f8d2cf6d-ab50-4e42-90b6-9930336ad898
Snapshot volume location "portworx-cloud" configured successfully.

你可以通过使用Kubectl命令,来检查卷快照的位置,

$ kubectl get volumesnapshotlocation -n velero
NAME AGE
default 17m
portworx-cloud 30s

创建一个应用(比如WordPress)

现在我们来使用PortworxEssentials和Velero。我们需要一个应用,填入一些数据,然后做备份操作。你可以使用WordPress+MySQL应用,部署到一个名为WordPress的命名空间里。(https://github.com/wallnerryan/pwx-app-catalog/tree/master/apps/Blog/Wordpress)

注意:可以通过上面的链接,查看如何部署WordPress和Mysql的操作。

$ kubectl get po -n wordpress
NAME READY STATUS RESTARTS AGE
pod/wordpress-79c6db4c56-4sjjs 1/1 Running 0 72m
pod/wordpress-79c6db4c56-697rt 1/1 Running 0 72m
pod/wordpress-79c6db4c56-92whn 1/1 Running 0 72m
pod/wordpress-mysql-d8f757c9d-sknz8 1/1 Running 0 76m

你可以看见两个Portworx卷,分别备份了WordPress和MySQL。其中一个卷是由多个WordPress Pods共享的RWX,另一个是为单独MySQL数据库后端独享的RWO。

$ kubectl get pvc -n wordpress
NAME STATUS VOLUME STORAGECLASS AGE
mysql-pvc-1 Bound pvc-45837d2c... portworx-sc-repl3 72m
wp-pv-claim Bound pvc-cb520f93... portworx-sc-repl3-shared 72m

通过访问WordPress的服务端点,并且按照提示来创建第一篇文章作为应用的数据。可以通过kubectl get svc -n wordpress 命令来获取端点的信息。默认状态下,这个应用可以被NodePort访问。(https://kubernetes.io/docs/concepts/services-networking/service/#nodeport)

使用Portworx和Velero来完成MySQL+Wordpress的备份

现在我们在应用中已经创建了一些数据,让我们接着来备份一下应用和持久卷。

注意:–wait是可选的。

$ velero backup create wordpress-backup --include-namespaces=wordpress --snapshot-volumes --volume-snapshot-locations portworx-cloud --wait
Backup request "wordpress-backup" submitted successfully.
Waiting for backup to complete. You may safely press ctrl-c to stop waiting - your backup will continue in the background.
...............................................
Backup completed with status: Completed. You may check for more information using the commands `velero backup describe wordpress-backup` and `velero backup logs wordpress-backup`.

赞!我们已经使用Portworx和Velero成功创建了应用和数据的备份。

注意:Portworx Essentials的功能和限制(https://docs.portworx.com/concepts/portworx-essentials/),只允许每天每个卷备份一个云快照。同一天创建第二个备份会失败。我们可以等到第二天再创建备份,或者如果我们需要更频繁的备份的话,可以使用PX-Backup(https://portworx.com/cloud-native-application-backups-using-px-backup/)。

从备份中恢复MySQL和WordPress

为了模拟系统错误的出现,我们可以删除整个WordPress命名空间。

$ kubectl delete namespace wordpres

这样我们的WordPress和MySQL的部署就完全消失了,以及我们的PVs和PVCs也消失了。不用担心,我们从备份中来恢复。

$ velero restore create --from-backup wordpress-backup
Restore request "wordpress-backup-20200422153128" submitted successfully.
Run `velero restore describe wordpress-backup-20200422153128` or `velero restore logs wordpress-backup-20200422153128` for more details.

恢复操作完成后,你就可以重新访问你的NodePort端点了,你所有的数据也都恢复了。

注意:恢复操作中还有其他的选项,比如恢复一个新的命名空间。可以参考这里的文档。(https://velero.io/docs/master/restore-reference/)。