はじめに
こんにちは、ACS事業部の吉川です。
本記事はQiitaのAzure Advent Calendar 2022の6日目の記事です。(既に日付が回って7日になっている事実から目を背けつつ…)
タイトルに記載のとおり、先日 Azure Kubernetes Service(AKS)のBlob CSI driverがGAしました。
AKS上のPodにBlobストレージをマウントし、通常のファイルシステムのようにファイルの読み書きを可能とするものです。
さっと試してみましたので、使い方を紹介します。
Azureリソースの作成
AKSとストレージアカウントおよびBlobコンテナーを作成します。
まずはAKSから。AKSクラスター作成時に --enable-blob-driver
のオプションを付ける必要があります。
# リソース名/リージョンの定義 export RG_NAME="rg-sample" export AKS_NAME="aks-sample" export LOCATION="japaneast" # リソースグループ作成 az group create --location $LOCATION --name $RG_NAME # AKSクラスター作成 az aks create -g $RG_NAME -n $AKS_NAME -l $LOCATION \ --enable-blob-driver \ --node-count 1 # kubectlのインストール sudo az aks install-cli # AKSの認証情報取得 az aks get-credentials -g $RG_NAME -n $AKS_NAME
続いてストレージ側の作成です。
# リソース名の定義 STORAGE_ACCOUNT=samplestorage CONTAINER_NAME=sample-container # ストレージアカウント作成 az storage account create \ --name $STORAGE_ACCOUNT \ --resource-group $RG_NAME \ --location $LOCATION # Blobコンテナー作成 az storage container create \ --name $CONTAINER_NAME \ --account-name $STORAGE_ACCOUNT
以上でAzure側のリソース作成は完了です。
Kubernetesリソースの作成
続いてはKubernetes上のリソースを作成していきます。
--enable-blob-driver
オプションを付けて作成したAKSクラスターでは2種類のBlob CSI driverが有効化されています。
kubectl get storageclass | grep blob
azureblob-fuse-premium blob.csi.azure.com Delete Immediate true 28m azureblob-nfs-premium blob.csi.azure.com Delete Immediate true 28m
アクセスする際の機構として、fuseblob か NFS のどちらを使うかによって使い分けるようです。今回はfuseblobを使ってみましょう。
まずはストレージアカウントへの認証情報を、KubernetesのSecretとして作成します。
# ストレージアカウントのシークレットキーを取得 STORAGE_KEYS=$(az storage account keys list --account-name $STORAGE_ACCOUNT --query [0].value -o tsv) # Secretオブジェクトを作成 kubectl create secret generic azure-secret \ --from-literal azurestorageaccountname=$STORAGE_ACCOUNT \ --from-literal azurestorageaccountkey=$STORAGE_KEYS --type=Opaque
続いてPersistentVolumeと、
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: PersistentVolume metadata: name: pv-blob spec: capacity: storage: 10Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: azureblob-fuse-premium mountOptions: - -o allow_other - --file-cache-timeout-in-seconds=120 csi: driver: blob.csi.azure.com readOnly: false volumeHandle: unique-volumeid volumeAttributes: containerName: "${CONTAINER_NAME}" nodeStageSecretRef: name: azure-secret namespace: default EOF
PersistentVolumeClaimを作成します。
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-blob spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi volumeName: pv-blob storageClassName: azureblob-fuse-premium EOF
最後にストレージをマウントするPodを作成して完了です。
cat <<EOF | kubectl apply -f - kind: Pod apiVersion: v1 metadata: name: nginx-blob spec: containers: - image: nginx:latest name: nginx-blob volumeMounts: - name: blob01 mountPath: "/mnt/blob" volumes: - name: blob01 persistentVolumeClaim: claimName: pvc-blob EOF
動作確認する
Podが作成できたら、Bashを起動して状態を見てみましょう。
kubectl exec -it nginx-blob -- /bin/bash
df コマンドで見てみると、/mnt/blob
にマウントされていることがわかります。
df -h
Filesystem Size Used Avail Use% Mounted on overlay 124G 25G 100G 20% / tmpfs 64M 0 64M 0% /dev tmpfs 3.4G 0 3.4G 0% /sys/fs/cgroup blobfuse 14G 36K 13G 1% /mnt/blob /dev/sda1 124G 25G 100G 20% /etc/hosts shm 64M 0 64M 0% /dev/shm tmpfs 4.5G 12K 4.5G 1% /run/secrets/kubernetes.io/serviceaccount tmpfs 3.4G 0 3.4G 0% /proc/acpi tmpfs 3.4G 0 3.4G 0% /proc/scsi tmpfs 3.4G 0 3.4G 0% /sys/firmware
以下のように test
というファイルを作ってみると、
echo "blobfuse test" > /mnt/blob/test
ポータルからもBlobが作成されていることが確認できます。
逆にポータルからBlobをアップロードすると、
Pod側からもアップロードされたBlobが見えています。
ls -l /mnt/blob
total 0 -rwxrwxrwx 1 root root 14 Dec 6 14:57 test -rwxrwxrwx 1 root root 0 Dec 6 15:07 upload-test
おわりに
使い方の手順だけをさっと確認してみました。
利用シーンとしては
- AKS上のアプリで処理したデータをBlobに書き込みEventGrid経由でFunctionsに渡す
- 他のサービスがBlobにアップロードしたデータをAKS上のアプリで処理する
といったものが考えられます。
従来からAzure Filesをマウントすることはできましたが、Blobを直接利用できるようになったことで他サービスとの連携がやりやすくなるのでは、と思います。
AKSの利用の幅が広がるアップデートということで嬉しい限りですね!
私達ACS事業部はAzure・AKSを活用した内製化のご支援をしております。ご相談等ありましたらぜひご連絡ください。
また、一緒に働いていただける仲間も募集中です!
切磋琢磨しながらスキルを向上できる、エンジニアには良い環境だと思います。ご興味を持っていただけたら嬉しく思います。