このページの本文へ

FIXER cloud.config Tech Blog

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

2022年04月29日 11時00分更新

文● 多田 祐一朗/FIXER

  • この記事をはてなブックマークに追加
  • 本文印刷

 本記事はFIXERが提供する「cloud.config Tech Blog」に掲載された「Velero を使った AzureKubernetesService(AKS) の Backup/Restore」を再編集したものです。

 今季もシティリーグに参加できなかった多田です。自主大会出るなりまったりポケカすることにします。・・・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 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.6/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を使ったインストールなども記事にしてみたいですね。

多田 祐一朗/FIXER

名古屋事業所所属のエンジニア。基盤インフラ経験が少しある。

[転載元]
 Velero を使った AzureKubernetesService(AKS) の Backup/Restore

カテゴリートップへ