在本文中,将介绍如何备份OpenShift etcd并将数据推送到AWS S3存储桶。
前言 etcd是OpenShift容器平台的键值存储,可持久存储所有资源对象的状态。在任何OpenShift群集管理中,建议您定期备份群集的etcd数据并将其存储在安全的位置,这是一个好的建议。 数据存储的理想位置是在OpenShift Container Platform环境之外,这可以是NFS服务器共享,也可以是基础架构中或云环境中的辅助服务器。 另一个建议是在非高峰使用时间内进行etcd备份,因为该操作本质上是阻塞的。确保在任何OpenShift群集升级后执行etcd备份操作,这样做的重要性在于,在群集还原期间,必须使用从相同z-stream版本获取etcd备份。例如OpenShift Container Platform 4.6.3群集必须使用从4.6.3中获取etcd备份。 参考:在RHEL/CentOS 8上安装和配置etcd 3.3.12的方法。
步骤1:登录到群集中的一个主节点 etcd群集备份必须在主控主机上一次备份脚本的调用上执行。不要为每个主主机进行备份。 通过SSH或调试会话登录到一个主节点: # SSH Access $ ssh core@<master_node_ip_or_dns_name> # Debug session $ oc debug node/<node_name> 对于调试会话,您需要将根目录更改为主机: sh-4.6# chroot /host 如果启用了群集范围的代理,请确保已导出NO_PROXY、HTTP_PROXY和HTTPS_PROXY环境变量。
步骤2:在OpenShift 4.x上执行etcd备份 需要以具有cluster-admin角色的用户身份进行OpenShift集群访问,才能执行此操作。 在继续进行之前,请检查以确认是否启用了代理: $ oc get proxy cluster -o yaml 如果启用了代理,则httpProxy、httpsProxy和noProxy字段将设置值。 运行cluster-backup.sh脚本以启动etcd备份过程。您应该通过保存备份的路径: $ mkdir /home/core/etcd_backups $ sudo /usr/local/bin/cluster-backup.sh /home/core/etcd_backups 这是我的命令执行输出: 3e53f83f3c02b43dfa8d282265c1b0f9789bcda827c4e13110a9b6f6612d447c etcdctl version: 3.3.18 API version: 3.3 found latest kube-apiserver-pod: /etc/kubernetes/static-pod-resources/kube-apiserver-pod-115 found latest kube-controller-manager-pod: /etc/kubernetes/static-pod-resources/kube-controller-manager-pod-24 found latest kube-scheduler-pod: /etc/kubernetes/static-pod-resources/kube-scheduler-pod-26 found latest etcd-pod: /etc/kubernetes/static-pod-resources/etcd-pod-11 Snapshot saved at /home/core/etcd_backups/snapshot_2021-03-16_134036.db snapshot db and kube resources are successfully saved to /home/core/etcd_backups 列出备份目录中的文件: $ ls -1 /home/core/etcd_backups/ snapshot_2021-03-16_134036.db static_kuberesources_2021-03-16_134036.tar.gz $ du -sh /home/core/etcd_backups/* 1.5G /home/core/etcd_backups/snapshot_2021-03-16_134036.db 76K /home/core/etcd_backups/static_kuberesources_2021-03-16_134036.tar.gz 备份中将有两个文件: 1、snapshot_<datetimestamp>.db:此文件是etcd快照。 2、static_kuberesources_<datetimestamp>.tar.gz:该文件包含静态容器的资源。如果启用了etcd加密,则它还将包含etcd快照的加密密钥。
步骤3:将备份推送到AWS S3(从Bastion Server) 从Bastion Server登录并复制备份文件: scp -r core@serverip:/home/core/etcd_backups ~/ 安装AWS CLI工具: curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" 安装unzip工具: sudo yum -y install unzip 解压缩下载的文件: unzip awscli-exe-linux-x86_64.zip 安装AWS CLI: $ sudo ./aws/install You can now run: /usr/local/bin/aws --version 通过检查版本来确认安装: $ aws --version aws-cli/2.1.30 Python/3.8.8 Linux/3.10.0-957.el7.x86_64 exe/x86_64.rhel.7 prompt/off 创建OpenShift Backups存储桶: $ aws s3 mb s3://openshiftbackups make_bucket: openshiftbackups 创建一个IAM用户: $ aws iam create-user --user-name backupsonly 创建用于备份的AWS策略用户,该用户只能写入S3: cat >aws-s3-uploads-policy.json<<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*", "s3:Put*" ], "Resource": "*" } ] } EOF 应用政策: aws iam create-policy --policy-name upload-only-policy --policy-document file://aws-s3-uploads-policy.json 将AWS策略分配给IAM用户: aws iam attach-user-policy --policy-arn arn:aws:iam::<accountid>:policy/upload-only-policy --user-name backupsonly 现在,您可以为IAM用户创建访问密钥以进行测试: $ aws iam create-access-key --user-name backupsonly { "AccessKey": { "UserName": "backupsonly", "AccessKeyId": "AKIATWFKCYAHF74SCFEP", "Status": "Active", "SecretAccessKey": "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", "CreateDate": "2021-03-16T12:14:39+00:00" } } 记下访问和密钥ID并在配置中使用它: $ aws configure # On OCP Bastion server 提供: AWS访问密钥ID、AWS秘密访问密钥、默认区域。 尝试将文件上传到S3存储桶: $ aws s3 cp etcd_backups/ s3://openshiftbackups/etcd --recursive upload: etcd_backups/static_kuberesources_2021-03-16_134036.tar.gz to s3://openshiftbackups/etcd/static_kuberesources_2021-03-16_134036.tar.gz upload: etcd_backups/snapshot_2021-03-16_134036.db to s3://openshiftbackups/etcd/snapshot_2021-03-16_134036.db 确认: $ aws s3 ls s3://openshiftbackups/etcd/ 2021-03-16 16:00:59 1549340704 snapshot_2021-03-16_134036.db 2021-03-16 16:00:59 77300 static_kuberesources_2021-03-16_134036.tar.gz
步骤4:自动备份到AWS S3(从Bastion Server) 我们可以执行一个脚本,该脚本将执行以下操作: 1、从堡垒登录到主节点。 2、启动etcd的备份。 3、将备份数据从主节点复制到堡垒服务器。 4、删除主节点上的备份数据。 5、将备份数据复制到S3存储桶。 6、成功上传到S3后删除本地数据。 在堡垒服务器上创建脚本文件: $ vim backup_etcd_s3.sh 这是可以针对更高级用例进行进一步修改的脚本: #!/bin/bash MASTER_NAME="master01.example.net" USERNAME="core" BACKUPS_DIR=~/etcd_backups S3_BUCKET="openshiftbackups/etcd" RESULT="$?" # Create backups directory if doesn't exist [ -d ${BACKUPS_DIR} ] && echo "Directory Exists" || mkdir ${BACKUPS_DIR} # Login and run backup ssh ${USERNAME}@${MASTER_NAME} 'mkdir /home/core/etcd_backups' 2>/dev/null ssh ${USERNAME}@${MASTER_NAME} 'sudo /usr/local/bin/cluster-backup.sh /home/core/etcd_backups' scp -r ${USERNAME}@${MASTER_NAME}:/home/core/etcd_backups/* ${BACKUPS_DIR}/ # clean etcd backups directory on the master node if [ $RESULT -eq 0 ]; then ssh ${USERNAME}@${MASTER_NAME} 'rm -rf /home/core/etcd_backups/*' fi # Backup to aws s3 aws s3 cp ${BACKUPS_DIR}/ s3://${S3_BUCKET} --recursive # List bucket contents aws s3 ls s3://${S3_BUCKET}/ # Clean backups older than 1 day #find ${BACKUPS_DIR}/ -mtime +1 -exec rm {} \; find ${BACKUPS_DIR}/ -type f -mtime +1 -delete 使用凌晨3点运行的Cron Job: $ crontab -e 0 3 * * * /path/to/backup_etcd_s3.sh 至此,备份OpenShift etcd并将数据推送到S3存储桶的操作全部完成。
相关主题 |