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を使ったインストールなども記事にしてみたいですね。