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/)。
希望这篇文章能够帮助您更好的在小规模Kubernetes生产系统里管理有状态应用!