Azure Kubernetes Service (AKS) で OpenAI を使うアプリケーションをデプロイする
この記事では、AKS で Azure OpenAI または OpenAI を使うアプリケーションをデプロイする方法について学習します。 OpenAI を使うと、特定のタスクに合わせて、コンテンツ生成、概要、セマンティック検索、自然言語などのさまざまな AI モデルをコード生成に適応させることができます。 まず、Azure サブスクリプションに AKS クラスターをデプロイします。 その後、OpenAI サービスとサンプル アプリケーションをデプロイします。
サンプル クラウド ネイティブ アプリケーションは、実際の実装を代表しています。 マルチコンテナー アプリケーションは、次のような複数の言語とフレームワークで記述されたアプリケーションで構成されています。
- Golang と Gin
- Rust と Actix-Web
- JavaScript と Vue.js および Fastify
- Python と FastAPI
これらのアプリケーションには、顧客とストア管理者向けのフロント エンド、RabbitMQ メッセージ キューと MongoDB データベースにデータを送信するための REST API、トラフィックをシミュレートするコンソール アプリが用意されています。
注意
MongoDB や Rabbit MQ などのステートフル コンテナーを運用環境の永続ストレージなしで実行することはお勧めしません。 わかりやすくするためにここではこれらを使用しますが、Azure CosmosDB や Azure Service Bus などのマネージド サービスを使うことをお勧めします。
サンプル アプリケーションの GitHub コードベースにアクセスする場合は、「AKS Store Demo」を参照してください。
開始する前に
- アクティブなサブスクリプションを含む Azure アカウントが必要です。 お持ちでない場合は、無料のアカウントを作成してください。
- このデモでは、Azure OpenAI サービスまたは OpenAI サービスを使用できます。
- Azure OpenAI サービスを使う予定の場合は、[Azure OpenAI Service へのアクセスを要求する] フォームを使用して、Azure サブスクリプションで有効にするためのアクセスを要求する必要があります。
- OpenAI を使う予定の場合は、OpenAI Web サイトでサインアップします。
前提条件
Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。
CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。
ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。
初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。
az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。
リソース グループを作成する
Azure リソース グループは、Azure リソースをデプロイおよび管理する論理グループです。 リソース グループを作成する際は、場所の指定を求めるプロンプトが表示されます。 この場所は、リソース グループのメタデータが格納される場所です。また、リソースの作成時に別のリージョンを指定しない場合は、Azure でリソースが実行される場所でもあります。
次の例では、myResourceGroup という名前のリソース グループを eastus に作成します。
az group create
コマンドを使用して、リソース グループを作成します。az group create --name myResourceGroup --location eastus
リソース グループが正常に作成された場合の出力例を以下に示します。
{ "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup", "location": "eastus", "managedBy": null, "name": "myResourceGroup", "properties": { "provisioningState": "Succeeded" }, "tags": null, "type": "Microsoft.Resources/resourceGroups" }
AKS クラスターを作成する
次の例では、myResourceGroup に myAKSCluster という名前のクラスターを作成します。
az aks create
コマンドを使用して、AKS クラスターを作成します。az aks create --resource-group myResourceGroup --name myAKSCluster --generate-ssh-keys
数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。
クラスターに接続する
Kubernetes クラスターを管理するには、Kubernetes のコマンドライン クライアントである kubectl を使用します。 Azure Cloud Shell を使用している場合、kubectl
は既にインストールされています。
az aks install-cli
コマンドを使用してkubectl
をローカルにインストールします。az aks install-cli
Note
Linux ベースのシステムで管理者特権のアクセス許可が必要な場合は、
sudo az aks install-cli
コマンドを使用できます。az aks get-credentials
コマンドを使用して、Kubernetes クラスターに接続するようにkubectl
を構成します。このコマンドは、次の操作を実行します。
- 資格情報をダウンロードし、それを使用するように Kubernetes CLI を構成します。
~/.kube/config
(Kubernetes 構成ファイルの既定の場所) を使用します。 Kubernetes 構成ファイルに対して別の場所を指定するには、--file 引数を使用します。
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
kubectl get
コマンドを使用して、ご利用のクラスターへの接続を確認します。 このコマンドでは、クラスター ノードの一覧が返されます。kubectl get nodes
次の出力例は、前の手順で作成したノードを示しています。 ノードの状態が [Ready] であることを確認してください。
NAME STATUS ROLES AGE VERSION aks-nodepool1-31469198-vmss000000 Ready agent 3h29m v1.25.6 aks-nodepool1-31469198-vmss000001 Ready agent 3h29m v1.25.6 aks-nodepool1-31469198-vmss000002 Ready agent 3h29m v1.25.6
Note
プライベート クラスターの場合、パブリック IP アドレスを介してノードに接続しようとすると、ノードに到達できない可能性があります。 これを修正するには、接続元のクラスターと同じ VNET 内にエンドポイントを作成する必要があります。 手順に従って、プライベート AKS クラスターを作成し、接続します。
アプリケーションの配置
AKS Store アプリケーションの場合、マニフェストには次の Kubernetes デプロイとサービスが含まれています。
- 製品サービス: 製品情報が表示されます。
- 注文サービス: 注文を行います。
- Makeline サービス: キューの注文を処理し、注文を完了します。
- ネットショップ: 顧客が製品を見て注文するための Web アプリケーション。
- Store Admin: ストアの従業員がキュー内の注文を確認し、製品情報を管理するための Web アプリケーション。
- 仮想顧客: スケジュールに基づいて注文の作成をシミュレートします。
- 仮想ワーカー: スケジュールに基づいて注文の完了をシミュレートします。
- Mongo DB: 保持されているデータの NoSQL インスタンス。
- Rabbit MQ: 注文キューのメッセージ キュー。
Note
MongoDB や Rabbit MQ などのステートフル コンテナーを運用環境の永続ストレージなしで実行することはお勧めしません。 わかりやすくするためにここではこれらを使用しますが、Azure CosmosDB や Azure Service Bus などのマネージド サービスを使うことをお勧めします。
アプリケーションの YAML マニフェストを確認します。
kubectl apply
コマンドを使用してアプリケーションをデプロイし、ご利用の YAML マニフェストの名前を指定します。kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/aks-store-all-in-one.yaml
次の出力例は、正常に作成されたデプロイおよびサービスを示しています。
deployment.apps/mongodb created service/mongodb created deployment.apps/rabbitmq created service/rabbitmq created deployment.apps/order-service created service/order-service created deployment.apps/makeline-service created service/makeline-service created deployment.apps/product-service created service/product-service created deployment.apps/store-front created service/store-front created deployment.apps/store-admin created service/store-admin created deployment.apps/virtual-customer created deployment.apps/virtual-worker created
OpenAI をデプロイする
Azure OpenAI または OpenAI を使って、AKS 上でアプリケーションを実行できます。
- [Request Access to Azure OpenAI Service] (Azure OpenAI Service へのアクセスを要求する) フォームに入力して、Azure サブスクリプションで Azure OpenAI を有効にします。
- Azure portal で Azure OpenAI インスタンスを作成します。
- 作成した Azure OpenAI インスタンスを選びます。
- [Keys and Endpoints] (キーとエンドポイント) を選んでキーを生成します。
- [Model Deployments] (モデルのデプロイ)>[Managed Deployments] (マネージド デプロイ) を選んで Azure OpenAI スタジオを開きます。
- gpt-35-turbo モデルを使用して新しいデプロイを作成します。
Azure OpenAI でデプロイを作成する方法の詳細については、「Azure OpenAI Service を使用してテキストの生成を開始する」を参照してください。
AI サービスをデプロイする
アプリケーションがデプロイされたので、OpenAI を使ってストアのカタログに追加される新しい製品の説明を自動的に生成する Python ベースのマイクロサービスをデプロイできます。
ai-service.yaml
という名前のファイルを作成し、そこに次のマニフェストをコピーします。apiVersion: apps/v1 kind: Deployment metadata: name: ai-service spec: replicas: 1 selector: matchLabels: app: ai-service template: metadata: labels: app: ai-service spec: nodeSelector: "kubernetes.io/os": linux containers: - name: ai-service image: ghcr.io/azure-samples/aks-store-demo/ai-service:latest ports: - containerPort: 5001 env: - name: USE_AZURE_OPENAI value: "True" - name: AZURE_OPENAI_DEPLOYMENT_NAME value: "" - name: AZURE_OPENAI_ENDPOINT value: "" - name: OPENAI_API_KEY value: "" resources: requests: cpu: 20m memory: 50Mi limits: cpu: 50m memory: 128Mi --- apiVersion: v1 kind: Service metadata: name: ai-service spec: type: ClusterIP ports: - name: http port: 5001 targetPort: 5001 selector: app: ai-service
環境変数
USE_AZURE_OPENAI
を"True"
に設定します。Azure OpenAI スタジオから Azure OpenAI デプロイ名を取得し、
AZURE_OPENAI_DEPLOYMENT_NAME
の値を入力します。Azure portal から、リソースの左ブレードにある [キーとエンドポイント] を選択して、Azure OpenAI エンドポイントと Azure OpenAI API キーを取得します。 適宜、YAML の
AZURE_OPENAI_ENDPOINT
とOPENAI_API_KEY
を更新します。kubectl apply
コマンドを使用してアプリケーションをデプロイし、ご利用の YAML マニフェストの名前を指定します。kubectl apply -f ai-service.yaml
次の出力例は、正常に作成されたデプロイおよびサービスを示しています。
deployment.apps/ai-service created service/ai-service created
Note
API キーなどの機密情報を Kubernetes マニフェスト ファイルに直接追加することは安全ではなく、誤ってコード リポジトリにコミットされる可能性があります。 ここでは、わかりやすくするために追加しました。 運用環境ワークロードの場合は、代わりにマネージド ID を使って Azure OpenAI サービスの認証を受けるか、Azure Key Vault にシークレットを格納します。
アプリケーションをテストする
kubectl get pods コマンドを使って、デプロイされたポッドの状態を確認します。
kubectl get pods
次の手順に進む前に、すべてのポッドが "実行中" であることを確認します。
NAME READY STATUS RESTARTS AGE makeline-service-7db94dc7d4-8g28l 1/1 Running 0 99s mongodb-78f6d95f8-nptbz 1/1 Running 0 99s order-service-55cbd784bb-6bmfb 1/1 Running 0 99s product-service-6bf4d65f74-7cbvk 1/1 Running 0 99s rabbitmq-9855984f9-94nlm 1/1 Running 0 99s store-admin-7f7d768c48-9hn8l 1/1 Running 0 99s store-front-6786c64d97-xq5s9 1/1 Running 0 99s virtual-customer-79498f8667-xzsb7 1/1 Running 0 99s virtual-worker-6d77fff4b5-7g7rj 1/1 Running 0 99s
kubectl get service
コマンドを使用して、Store Admin Web アプリケーションとネットショップ Web アプリケーションの IP を取得します。kubectl get service store-admin
このアプリケーションは、Kubernetes サービスによってプロビジョニングされたパブリック ロード バランサーを介して、Store Admin サイトをインターネットに公開しています。 このプロセスが完了するまでに数分かかることがあります。 サービスが起動して IP アドレスが表示されるまでの初期には、外部 IP は "保留中" と表示されます。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE store-admin LoadBalancer 10.0.142.228 40.64.86.161 80:32494/TCP 50m
''store-front'' という名前のサービスについても同じ手順を繰り返します。
Web ブラウザーを開き、サービスの外部 IP アドレスを参照します。 ここで示す例では、40.64.86.161 を開き、ブラウザーに Store Admin を表示します。 ネットショップについても同じ手順を繰り返します。
Store Admin で製品タブをクリックし、[製品の追加] を選択します。
''ai-service'' が正常に実行されている場合は、説明フィールドの横に [OpenAI に聞く] ボタンが表示されるはずです。 名前、価格、キーワードを入力し、[OpenAI に聞く]>[製品の保存] を選択し、製品の説明を生成します。
これで、販売者が使う Store Admin に作成した新しい製品が表示されます。 この画像では、Jungle Monkey Chew Toy が追加されたことを確認できます。
購入者が使うネットショップにも、作成した新製品が表示されます。 この画像では、Jungle Monkey Chew Toy が追加されたことを確認できます。 必ず、
kubectl get service
コマンドを使ってネットショップの IP アドレスを取得してください。
次のステップ
AKS アプリケーションに OpenAI 機能を追加したので、Azure Kubernetes Service (AKS) から Azure OpenAI へのアクセスをセキュリティで保護できます。
生成 AI のユース ケースについて詳しくは、次のリソースを参照してください。
Azure Kubernetes Service