适用于:在 Windows Server 上运行的 AKS
本文介绍如何在 Windows Server 上的 AKS 中使用 Azure Blob 存储或 MinIO 存储安装和使用 Velero 备份和还原工作负荷和目标群集。
Velero 是一种开源社区标准工具,用于备份和还原 Kubernetes 群集对象和永久性卷。 它支持各种 存储提供程序 来存储其备份。 如果 AKS Arc 目标 Kubernetes 群集崩溃且无法恢复,则可以使用 Velero 备份将其内容和内部 API 对象还原到新群集。
如果不想将备份存储在Azure Blob 存储中,可以将 MinIO 与 Velero 配合使用。 本文介绍如何安装和配置 Velero 以使用Azure Blob 存储或安装和配置 Velero 以使用 MinIO 存储。
注意
Velero 不支持Microsoft Windows。 在测试中,Velero 团队只能备份无状态 Windows 应用程序。 Restic
集成以及有状态应用程序或持久卷的备份不受支持。
先决条件
在开始之前,请确保满足以下先决条件:
- 安装 Azure CLI。
- 安装
Chocolatey
。 您可以使用Chocolatey
在 Windows 计算机上安装包括 Velero CLI 的 Velero 客户端。
使用 Azure Blob 存储 安装 Velero
本节中的过程介绍如何安装 Velero 并使用Azure Blob 存储进行备份。 如果不想将备份存储在 Azure 中,请参阅 使用 MiniO 存储安装 Velero。
以管理员身份打开 PowerShell。
使用 Azure CLI 登录到 Azure:
az login --use-device-code
运行以下命令安装 Velero CLI :
注意
Velero 版本 1.10 及更高版本不支持该
--use-restic
标志。 该标志仅在版本 1.9.x 上受支持。choco install velero
如果需要,请更改为用于备份的 Azure 订阅。
默认情况下,Velero 将备份存储在 VM 和磁盘所在的同一 Azure 订阅中,不允许将备份还原到其他订阅中的资源组。 若要跨订阅启用备份和还原操作,请指定要用于备份的订阅。 如果你已经进行了要用于备份的订阅,则可以跳过此步骤。
请切换到您想用于备份的订阅:
使用订阅名称查找订阅 ID:
$AZURE_BACKUP_SUBSCRIPTION_NAME="<NAME_OF_TARGET_SUBSCRIPTION>" $AZURE_BACKUP_SUBSCRIPTION_ID=$(az account list --query="[?name=='$AZURE_BACKUP_SUBSCRIPTION_NAME'].id | [0]" -o tsv)
然后,更改订阅:
az account set -s $AZURE_BACKUP_SUBSCRIPTION_ID
创建 Azure 存储帐户和 Blob 容器。
使用Azure Blob 存储进行备份时,Velero 需要存储帐户和 Blob 容器来存储备份。 以下示例演示在新 Velero_Backups 资源组中创建的存储帐户。
必须使用可在 DNS 中使用的全局唯一 ID 创建存储帐户。 示例脚本使用
uuidgen
应用随机生成唯一名称。 只要名称遵循存储帐户的 Azure 命名规则,就可以使用任何方法。存储帐户是使用静态加密功能(使用Microsoft托管密钥)创建的,并且配置为仅允许通过 HTTPS 连接进行访问。
若要创建存储帐户和 Blob 容器,请执行以下步骤:
为备份存储帐户创建资源组。 根据需要将目录更改为首选位置,并运行以下命令:
$AZURE_BACKUP_RESOURCE_GROUP="Velero_Backups" az group create -n $AZURE_BACKUP_RESOURCE_GROUP --location WestUS
创建存储帐户:
$AZURE_STORAGE_ACCOUNT_ID="<NAME_OF_ACCOUNT_TO_ASSIGN>" az storage account create --name $AZURE_STORAGE_ACCOUNT_ID --resource-group $AZURE_BACKUP_RESOURCE_GROUP --sku Standard_GRS --encryption-services blob --https-only true --kind BlobStorage --access-tier Hot
创建 Blob 容器:
$BLOB_CONTAINER="velero" az storage container create -n $BLOB_CONTAINER --public-access off --account-name $AZURE_STORAGE_ACCOUNT_ID
该示例使用名为
velero
的 Blob 容器。 可以使用其他名称,最好是单个 Kubernetes 群集的唯一名称。
创建服务主体:
获取 Azure 帐户的订阅 ID 和租户 ID:
$AZURE_SUBSCRIPTION_ID=(az account list --query '[?isDefault].id' -o tsv) $AZURE_TENANT_ID=(az account list --query '[?isDefault].tenantId' -o tsv)
创建具有参与者权限的服务主体。
可以使用 参与者 角色创建服务主体,或使用自定义角色:
- 参与者角色: 参与者角色授予订阅范围的访问权限,因此,如果分配该角色,请务必保护此凭据。
- 自定义角色: 如果需要更严格的角色,请使用自定义角色。
分配参与者角色:
如果使用 Velero 备份具有多个 Blob 容器的多个群集,则可能需要为每个群集创建唯一用户名,而不是使用名称
velero
。若要创建具有参与者角色的服务主体,请运行以下命令。 替换为你自己的订阅 ID 以及(可选)你自己的服务主体名称。 Microsoft Entra ID 会为你生成机密:
$AZURE_CLIENT_SECRET=(az ad sp create-for-rbac --name "velero" --role "Contributor" --query 'password' -o tsv --scopes /subscriptions/$AZURE_SUBSCRIPTION_ID)
根据需要对命令进行以下调整:
如果计划对工作负荷群集和 Velero 备份文件使用不同的订阅,请提供两个订阅 ID,如以下示例所示:
$AZURE_CLIENT_SECRET=(az ad sp create-for-rbac --name "velero" --role "Contributor" --query 'password' -o tsv --scopes /subscriptions/$AZURE_SUBSCRIPTION_ID /subscriptions/$AZURE_BACKUP_SUBSCRIPTION_ID)
如果不想用作
velero
服务主体名称,请确保--name
所选的值在 Microsoft Entra ID 中是唯一的,并且不会与其他服务主体或应用注册冲突。
重要
仅当创建服务主体时,此步骤才会显示机密。 请务必记下机密,以便在后续步骤中使用。
如果要启用最低资源提供程序操作,请创建自定义角色,并将该角色分配给服务主体。
创建包含以下内容的名为 azure-role.json 的文件。 替换自己的自定义角色名称和订阅 ID:
{ "Name": <CUSTOM_ROLE_NAME>, "Id": null, "IsCustom": true, "Description": "Velero related permissions to perform backups, restores and deletions", "Actions": [ "Microsoft.Compute/disks/read", "Microsoft.Compute/disks/write", "Microsoft.Compute/disks/endGetAccess/action", "Microsoft.Compute/disks/beginGetAccess/action", "Microsoft.Compute/snapshots/read", "Microsoft.Compute/snapshots/write", "Microsoft.Compute/snapshots/delete", "Microsoft.Storage/storageAccounts/listkeys/action", "Microsoft.Storage/storageAccounts/regeneratekey/action", "Microsoft.Storage/storageAccounts/read" ], "NotActions": [], "AssignableScopes": [ "<SUBSCRIPTION_ID>" ] }
创建自定义角色和服务主体:
az role definition create --role-definition azure-role.json $AZURE_CLIENT_SECRET=(az ad sp create-for-rbac --name "velero" --role "<CUSTOM_ROLE>" --query 'password' -o tsv --scopes /subscriptions/$AZURE_SUBSCRIPTION_ID)
有关创建自定义角色的详细信息,请参阅 设置 Velero 的权限。
获取服务主体名称,并将该名称 分配给AZURE_CLIENT_ID 变量:
$AZURE_CLIENT_ID=(az ad sp list --display-name "velero" --query '[0].appId' -o tsv)
注意
服务主体过期。 若要了解新服务主体何时过期,请运行以下命令:
az ad sp show --id $AZURE_CLIENT_ID
创建包含 Velero 安装所需的变量的文件。 该命令类似于以下命令:
AZURE_SUBSCRIPTION_ID=${AZURE_SUBSCRIPTION_ID} AZURE_TENANT_ID=${AZURE_TENANT_ID} AZURE_CLIENT_ID=${AZURE_CLIENT_ID} AZURE_CLIENT_SECRET=${AZURE_CLIENT_SECRET} AZURE_RESOURCE_GROUP=${AZURE_BACKUP_RESOURCE_GROUP} AZURE_CLOUD_NAME=AzurePublicCloud" | Out-File -FilePath ./credentials-velero.txt
重要
安装 Velero 后删除此文件。 客户端密码采用纯文本形式,可能会带来安全风险。
在继续之前,请验证文件的格式是否正确。 文件扩展名无关紧要。
- 删除任何额外的空格或选项卡。
- 确保变量名称正确。
在群集上安装 Velero,然后启动部署。 此过程将创建一个名为
velero
的命名空间,并将一个名为velero
的部署添加到该命名空间。使用以下命令安装 Velero。 请确保将示例命令中的占位符替换为你自己的值:
velero install --provider azure --plugins velero/velero-plugin-for-microsoft-azure:v1.5.0 --bucket $BLOB_CONTAINER --secret-file ./credentials-velero.txt --backup-location-config resourceGroup=$AZURE_BACKUP_RESOURCE_GROUP,storageAccount=$AZURE_STORAGE_ACCOUNT_ID,subscriptionId=$AZURE_BACKUP_SUBSCRIPTION_ID --use-restic
根据需要设置以下变量:
该命令将安装 Microsoft Azure 插件,该插件必须与所使用的 Velero CLI 版本兼容。 示例命令使用 Microsoft Azure 插件版本 1.5.0,它与最新的 Velero CLI 版本 1.9.0 兼容。 若要了解使用 Valero CLI 版本安装的 Microsoft Azure 插件的版本,请参阅 兼容性矩阵。
请务必包含
--use-restic
参数,以便使用Restic
在文件系统级别启用 Kubernetes 卷备份。Restic
可用于备份任何类型的 Kubernetes 卷。 默认情况下,Velero 支持为 Amazon EBS 卷、Azure 托管磁盘和 Google 永久性磁盘拍摄永久性卷的快照。 在 AKS Arc 中,Kubernetes 卷使用群集共享卷(CSV)来存储数据。 因此,启用持久卷快照需要Restic
。 AKS Arc 当前不支持卷快照。subscriptionId=$AZURE_BACKUP_SUBSCRIPTION_ID
是可选项。 仅当 Velero 和工作负荷群集具有不同的订阅 ID 时,才需要包含它。 如果它们使用相同的 Azure 订阅,则可以删除subscriptionId
参数, credentials-velero.txt 文件提供该信息。
Velero 服务在安装时自动启动。
检查 Velero 服务是否正常运行:
kubectl -n velero get pods kubectl logs deployment/velero -n velero
该
get pods
命令应显示 Velero Pod 正在运行。
使用 MinIO 存储安装 Velero
本节中的过程介绍如何安装 Velero 并使用 MinIO 存储进行备份。 如果您希望使用 Azure Blob 存储进行备份,请前往 使用 Azure Blob 存储安装 Velero。
如果不想将备份存储在 MinIO 中,请转到“设置 Velero”以使用Azure Blob 存储。
运行以下命令安装 Velero CLI。 安装
Chocolately
如果尚未:choco install velero
安装 MinIO:
创建永久性卷来存储 MinIO 备份。 本示例在 AKS Arc 的默认存储类中创建永久性卷,该卷已存在。
创建名为 minio-pvc-storage.yaml 的 YAML 文件,内容如下:
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: minio-pv-claim spec: storageClassName: default accessModes: - ReadWriteOnce resources: requests: storage: 100Gi
通过运行以下命令创建永久性卷:
kubectl create -f minio-pvc-storage.yaml
创建用于启动 MinIO 的部署文件 minio-deployment.yaml。 包括以下内容。 部署将使用你创建的永久性卷。
apiVersion: apps/v1 kind: Deployment metadata: name: minio-deployment spec: selector: matchLabels: app: minio strategy: type: Recreate template: metadata: labels: app: minio spec: volumes: - name: storage persistentVolumeClaim: claimName: minio-pv-claim containers: - name: minio image: minio/minio:latest args: - server - /storage env: - name: MINIO_ACCESS_KEY value: "<you can define this>" - name: MINIO_SECRET_KEY value: "<you can define this>" ports: - containerPort: 9000 hostPort: 9000 volumeMounts: - name: storage mountPath: "/storage"
然后创建部署:
kubectl create -f minio-deployment.yaml
创建名为 minio-service.yaml 的 Kubernetes 服务。 此服务将向 MinIO Pod 提供外部 IP 地址。
使用以下设置创建 YAML 文件以配置服务:
apiVersion: v1 kind: Service metadata: name: minio-service spec: type: LoadBalancer ports: - port: 9000 targetPort: 9000 protocol: TCP selector: app: minio
然后,创建服务:
kubectl create -f mino-service.yaml
运行以下命令获取 MinIO Pod 的外部 IP 地址。 使用该地址安装 Velero:
kubectl get svc
若要检查 MinIO 是否已启动并运行,请在浏览器中登录到 IP 地址,或使用 MinIO 客户端,如本节中所述。 安装 MinIO 客户端,并浏览 MinIO 文件。
下载 MinIO 客户端:
Invoke-WebRequest -Uri "https://dl.minio.io/client/mc/release/windows-amd64/mc.exe" -OutFile "C:\mc.exe
接下来,设置别名:
mc alias set minio http://10.10.77.6:9000 "minio_access_key" "minio_secret_key" --api s3v4
最后,浏览 MinIO 安装:
mc ls minio
创建用于存储 Velero 文件的存储桶。 此存储桶将在 Velero 安装中使用。
mc mb minio/velero-backup
创建包含以下内容的 MinIO 凭据文件 minio.credentials :
[default] aws_access_key_id=<minio_access_key> aws_secret_access_key=<minio_secret_key>
安装 Velero:
velero install --provider aws --bucket velero-backup --secret-file .\minio.credentials --backup-location-config region=minio,s3ForcePathStyle=true,s3Url=http://10.10.77.6:9000 --plugins velero/velero-plugin-for-aws:v1.1.0 --use-restic
运行此命令之前,请检查存储桶名称、MinIO 凭据和 MinIO 外部 IP 地址。
检查 Velero 服务是否正常运行:
kubectl -n velero get pods kubectl logs deployment/velero -n Velero
该
get pods
命令应显示 Velero Pod 正在运行。
备份群集
可以备份或还原群集中的所有对象,也可以按类型、命名空间和/或标签筛选对象。
创建备份
使用 Velero backup create
命令创建到所选存储的备份。 以下示例使用创建永久性卷快照的 --default-volumes-to-restic
标志。 有关其他备份选项,请参阅 Velero 备份参考。
群集中所有命名空间的按需备份:
velero backup create <BACKUP-NAME> --default-volumes-to-restic
群集中单个命名空间的按需备份:
velero backup create <BACKUP-NAME> --include-namespaces <NAMESPACE1> --default-volumes-to-restic
群集中多个所选命名空间的按需备份:
velero backup create <BACKUP-NAME> --include-namespaces <NAMESPACE-1>, <NAMESPACE-2> --default-volumes-to-restic
检查备份进度
若要检查备份的进度,请运行以下命令:
velero backup describe <BACKUP-NAME>
如果你将 Azure Blob Storage 用于备份,可以在你创建的 blob/容器 中,于 Azure 存储帐户查看你的备份。
恢复集群
若要还原一个群集,您必须创建一个新的群集以将旧的群集还原到该新的群集上。 无法将群集备份还原到现有群集。
该 restore
命令允许从以前创建的备份中还原所有对象和持久卷。 还可以仅还原已筛选的对象子集和持久卷。 有关更多备份选项,请参阅 资源筛选。
在要还原备份的群集上( 目标群集):
使用上述说明部署 Velero。 请使用与源群集相同的 Azure 凭证。
运行以下命令,确保已创建 Velero 备份对象。 Velero 资源与云存储中的备份文件同步。
velero backup describe <BACKUP-NAME>
确认存在正确的备份(
BACKUP-NAME
)后,还原备份中的所有对象:velero restore create --from-backup <BACKUP-NAME>
获取有关 Velero 命令的帮助
若要查看与特定 Velero 命令关联的所有选项,请使用带有该命令的 --help
标志。 例如,velero restore create --help
显示与 velero restore create
命令关联的所有选项。
例如,若要列出velero restore
的所有选项,请运行velero restore --help
,这将返回以下信息:
velero restore [command]
Available Commands:
create Create a restore
delete Delete restores
describe Describe restores
get Get restores
logs Get restore logs
卸载 Velero
若要从群集中卸载 Velero,并删除 Velero 安装创建的所有资源,请运行以下命令:
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero