APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Azure Kubernetes ServiceのBlob CSI driverがGAしました

はじめに

こんにちは、ACS事業部の吉川です。
本記事はQiitaのAzure Advent Calendar 2022の6日目の記事です。(既に日付が回って7日になっている事実から目を背けつつ…)

qiita.com

タイトルに記載のとおり、先日 Azure Kubernetes Service(AKS)のBlob CSI driverがGAしました。

azure.microsoft.com

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を活用した内製化のご支援をしております。ご相談等ありましたらぜひご連絡ください。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
切磋琢磨しながらスキルを向上できる、エンジニアには良い環境だと思います。ご興味を持っていただけたら嬉しく思います。

www.ap-com.co.jp

本記事の投稿者: 吉川 俊甫
AKS/ACAをメインにインフラ系のご支援を担当しています。 Shunsuke Yoshikawa - Credly