AKS で Service Connector を試してみた
Azure には Service Connector という仕組みがあり、App Service や AKS などのコンピューティングサービスから、Blob Storage や Key Vault などのバックエンドサービスに対するアクセスの構成を簡単に行うことができます。
先日、AKS における Service Connector の利用がプレビュー提供されまして。気になったので触ってみました!
こちらの AKS チームのブログでも紹介されているように、以前は下記のプロセスを実行する必要がありましたが、このうちの 2. から 5. を自動で行ってくれるそうです。
- Managed ID の作成
- OIDC Issuer URL の取得
- Kubernetes サービスアカウントの作成
- フェデレーション ID 資格情報の作成
- Azure サービスへアクセスするための権限付与
- アプリケーションのデプロイ
AKS クラスターの作成
まず、新しい AKS クラスターを作成します。aks-preview 拡張機能をアップデートし、Workload Identity と OIDC Issuer を有効にしてあります。
az extension update --name aks-preview
$CLNAME = "<クラスター名>"
$RGNAME = "<リソースグループ名>"
az group create --name $RGNAME --location japaneast
az aks create `
--resource-group $RGNAME `
--name $CLNAME `
--enable-oidc-issuer --enable-workload-identity --generate-ssh-keys
ストレージアカウントの作成
接続先のストレージアカウントを作成しておきます。
az storage account create --name <ストレージアカウント名> `
--resource-group $RGNAME --location japaneast `
--sku Standard_LRS --encryption-services blob
Service Connector の構成
下記の手順に沿って、AKS からストレージアカウントへの Service Connector を作成します。今回は認証方式に "Workload Identity" を使用しました。
クイック スタート - Azure portal から Azure Kubernetes Service (AKS) でサービス接続を作成する | Microsoft Learn
作成されたコンポーネントの確認
AKS クラスター上の構成を確認してみます。
まずは Secret の確認。
> kubectl get secret -A
NAMESPACE NAME TYPE DATA AGE
default sc-storageblob89b9a-secret Opaque 2 4m27s
...
kube-system protected-ext-parameters-sc-extension Opaque 4 4m46s
...
sc-system serviceconnector-secret Opaque 5 4m39s
sc-system sh.helm.release.v1.sc-extension.v1 helm.sh/release.v1 1 4m39s
一番上のシークレット以外にも、sc-system
という名前空間が新しく作成され、いくつかのシークレットが作成されていました。
そして Service Account の確認。
> kubectl get serviceaccount -A
NAMESPACE NAME SECRETS AGE
...
default sc-account-d689a10b-9c8e-4259-9c05-a3f1d203aaa2 0 5m7s
...
sc-system default 0 5m26s
sc-system serviceconnector-serviceaccount 0 5m19s
こちらも、一番上のシークレット以外に sc-system
という名前空間にサービスアカウントが作成されました。
Azure Portal 上での状態検証
Azure Portal の「サービスコネクタ」にて、作成した Service Connector を確認することができます。対象の Service Connector を選択し、「検証」をクリックすると、状態検証を行うことができます。
上図のように、いくつかの観点で検証が行われていることが分かります。
サンプルアプリケーションの準備
幸い、こちらもサンプルが提供されています。下記の手順を参考に、ACR へのアップロードおよびデプロイを実行します。
アプリの実装について
こちらの GitHub リポジトリにアプリケーションのコードも含まれています。
import os
from azure.storage.blob import BlobServiceClient
from azure.identity import DefaultAzureCredential
def connect_to_storage_with_identity():
try:
# the envs are from the secret reference defined in pod.yaml. And the secret is created by Service Connector
# when creating the connection between the AKS cluster and the Azure OpenAI service
client_identity = BlobServiceClient(
account_url=os.environ.get("AZURE_STORAGEBLOB_RESOURCEENDPOINT"),
credential=DefaultAzureCredential()
)
containers = client_identity.list_containers()
print("Connect to Azure Storage succeeded. Find {} containers".format(len(list(containers))))
except Exception as e:
print("Connect to Azure Storage failed: {}".format(e))
if __name__ == "__main__":
connect_to_storage_with_identity()
Pod 側で Workload Identity の構成が行われていれば、Python 的には azure.identity.DefaultAzureCredential()
で連携されるクレデンシャルで十分ということですね。便利。
アクセスのテスト
下記のコマンドでアクセスできたかどうか、確認できます。
> kubectl get pod/sc-demo-storage-identity
NAME READY STATUS RESTARTS AGE
sc-demo-storage-identity 0/1 Completed 0 99s
> kubectl logs pod/sc-demo-storage-identity
Connect to Azure Storage succeeded. Find 0 containers
Pod が Completed
になっていることと、ログにも "succeeded" と出ていますね!
"Find 0 containers" が少し寂しかったので、新しく Blob コンテナを作ってから再度試してみます。
> kubectl delete -f pod.yaml
pod "sc-demo-storage-identity" deleted
> kubectl apply -f pod.yaml
pod/sc-demo-storage-identity created
> kubectl logs pod/sc-demo-storage-identity
Connect to Azure Storage succeeded. Find 1 containers
ちゃんと更新されていますね!
注意
公式ドキュメントに下記の記載がありました。
サービス接続を削除しても、関連付けられている Kubernetes リソースは削除されません。 必要に応じて、kubectl delete コマンドなどを使用して、リソースを手動で削除してください。
削除の際は Azure Portal から削除しただけではダメで、Kubernetes 的に手動で削除する必要があるとのこと。ここは注意事項ですね。
おわりに
上述の通り、Service Connector を利用することで Workload Identity 等の設定を簡単に行うことができるようになっています。とても嬉しい機能でした🤗
Discussion