Veleroを使ったAzure Kubernetes Service(AKS) の バックアップ/リストア

4/29 一部のコマンドについて記載されてなかったので修正

今季もシティリーグに参加できなかった多田です。自主大会出るなりまったりポケカすることにします。・・・5月以降もエクバはあるんでしょうか。

はじめに

簡単なバックアップとリストアがこの記事のゴールです。
スケジュール設定やPersistentVolumeのバックアップなんかもVeleroはできるのですが、今回はそこまでしません。

Azure Login, Set Variable

テナントIDとサブスクリプションIDを指定してログインします。この時点で環境変数もできる箇所は設定しておきます。

# Azure Login
$AZURE_TENANT_ID="{テナントID}"
az login -t "${AZURE_TENANT_ID}"
$AZURE_SUBSCRIPTION_ID="{サブスクリプションID}"
az account set -s $AZURE_SUBSCRIPTION_ID

# Set Variable
$AKS_RESOURCE_GROUP='velero-rg'
$AKS_NAME='velero'
$STORAGE_ACCOUNT_RESOURCE_GROUP="velero-backup-rg"
$STORAGE_ACCOUNT_NAME=$(openssl rand -hex 12)
$BLOB_CONTAINER_NAME="velerobackup"

Create Resouce

AKSとバックアップ先となるストレージアカウントを作成します。
AKS_VMSS_RESOURCE_GROUP変数には、AKSを作成した際に自動作成されるリソースグループ名を指定しています。

# Create Resource Group
az group create --name "${AKS_RESOURCE_GROUP}" --location japaneast
az group create --name "${STORAGE_ACCOUNT_RESOURCE_GROUP}" --location japaneast

# Create AKS Cluster
az aks create `
	--name "${AKS_NAME}" `
	--resource-group "${AKS_RESOURCE_GROUP}" `
	--enable-cluster-autoscaler `
	--min-count 1 `
	--max-count 3 `
	--no-ssh-key `
	--network-plugin azure `
	--network-policy azure `
	--location japaneast

# Connect to Cluster
az aks get-credentials `
	--name "${AKS_NAME}" `
	--resource-group "${AKS_RESOURCE_GROUP}" `
	--admin `
	--overwrite-existing

kubectl config current-context

# Check Pod Status
kubectl get pod -A

# Get AKS Node Name
$AKS_VMSS_RESOURCE_GROUP=$(az aks show --name "${AKS_NAME}" --resource-group "${AKS_RESOURCE_GROUP}" -o json | jq -r '.nodeResourceGroup')

# Create Storage Account
az storage account create `
	--name "${STORAGE_ACCOUNT_NAME}" `
	--resource-group "${STORAGE_ACCOUNT_RESOURCE_GROUP}" `
	--sku Standard_LRS `
	--encryption-services blob `
	--https-only true `
	--kind BlobStorage `
	--access-tier Hot `
	--location japaneast

# Create Container
az storage container create `
	--account-name "${STORAGE_ACCOUNT_NAME}" `
	--name "${BLOB_CONTAINER_NAME}" `
	--public-access off `
	-o json

# Get Container Name
$AZURE_STORAGE_ACCOUNT_ACCESS_KEY=az storage account keys list --account-name "${STORAGE_ACCOUNT_NAME}" --query '[0].value' -o tsv
$AZURE_STORAGE_BLOB_CONTAINER_NAME=az storage container show --account-key "${AZURE_STORAGE_ACCOUNT_ACCESS_KEY}" --name "${BLOB_CONTAINER_NAME}" --account-name "${STORAGE_ACCOUNT_NAME}" --query "name" -o tsv

Create Service Principal

サービスプリンシパルを作成します。VeleroがAzureと認証するために必要です。
ストレージアカウントのアクセスキーでも代替は可能なのですが、 PersistentVolumeのバックアップができない仕様があります。(というかそもそもアクセスキーのやり方はVeleroのインストール時にエラー出てうまくできなかったんですよねー)

$AZURE_CLIENT_SECRET=az ad sp create-for-rbac -n "velero_test" --role Contributor --scopes /subscriptions/$AZURE_SUBSCRIPTION_ID --query 'password' -o tsv
$AZURE_CLIENT_ID=az ad sp list --display-name "velero_test" --query '[0].appId' -o tsv

Install VeleroCLI

以下リンクからインストールします。
Windows端末を使用している場合はChocolateyのインストールも必要です。

https://velero.io/docs/v1.8/basic-install/

Set Credentials

認証情報をファイルに記載します。

echo @"
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=${AKS_VMSS_RESOURCE_GROUP}
AZURE_CLOUD_NAME=AzurePublicCloud
"@ > credentials-velero

Install Velero

AKSにVeleroをセットアップします。プラグインのバージョンは使用したいものにしてください。1.4.0は2022/04/21時点で最新のものです。
VelroCLIではなくHelmを利用してAKSにVeleroを入れることも可能です。

velero install `
	--provider azure `
	--plugins velero/velero-plugin-for-microsoft-azure:v1.4.0 `
	--bucket $AZURE_STORAGE_BLOB_CONTAINER_NAME `
	--secret-file .\credentials-velero `
	--backup-location-config resourceGroup=$STORAGE_ACCOUNT_RESOURCE_GROUP,storageAccount=$STORAGE_ACCOUNT_NAME,subscriptionId=$AZURE_SUBSCRIPTION_ID `
	--use-volume-snapshots=false

インストールした後podのログを見て何もエラーが出てなかったら問題ありません。エラーがあるようでしたら接続情報等が間違っているのでやり直しです。

AKSからVeleroを消し去りたい時は以下のコマンドを実行します。

kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero

Apply Nginx

検証用となるnginxを下記ファイルとコマンドを使用してapplyします。

apiVersion: v1
kind: Namespace
metadata:
  name: nginx
  labels:
    app: nginx

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: nginx
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
kubectl apply -f nginx.yaml

Backup, Restore

nginxをバックアップします。

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

バックアップの状態を見ます。PhaseがCompleteになっていればバックアップが完了しています。

velero backup describe nginx-backup

namespaceを削除してpodの状態を見ます。 namespaceとpodの状態を見て存在しないことを確認します。

kubectl delete ns nginx

kubectl get ns -A
kubectl get pod -A

リストアします。namespaceとpodの状態見てnginxが存在していれば成功です。

velero restore create --from-backup nginx-backup

kubectl get ns -A
kubectl get pod -A

Cleaning

az group delete -n "${AKS_RESOURCE_GROUP}"
az group delete -n "${STORAGE_ACCOUNT_RESOURCE_GROUP}"
az role assignment delete --assignee $AZURE_CLIENT_ID --scope /subscriptions/$AZURE_SUBSCRIPTION_ID
az ad sp delete --id $AZURE_CLIENT_ID

最後に

時間があればスケジューリング、PersistentVolumeのバックアップ、Helmを使ったインストールなども記事にしてみたいですね。