🎉

【Azure Kubernetes Service】- StreamlitをACR経由でAKSにデプロイするまでの流れ

2024/11/05に公開

執筆日

2024/11/5

やること

Localで開発したStreamlitのアプリケーションをAzure Container Registry(ACR)経由でAzure Kubernetes Service(AKS)にデプロイしてみます。

流れ

  1. Streamlitでアプリを作成する
  2. Dockerイメージを作成してローカルでテストする
  3. DockerイメージをACRにプッシュする
  4. AKSにデプロイする

前提

  • Windows OS
  • Python 3.9.2

1. Streamlitのアプリを作成する

  1. Python仮想環境を作成し、Streamlitをインストールします。
python -m venv .venv
.venv\Scripts\activate
pip install streamlit
  1. VSCodeを開き、app.pyファイルを作成し、以下のコードを記述します。
import streamlit as st

st.title("AKS TEST")
  1. 以下のコマンドを実行し、アプリが立ち上がることを確認します。
streamlit run app.py

2. Dockerイメージを作成してローカルでテストする

  1. requirements.txtDockerfileを作成します。
# requirements.txt
streamlit
# Dockerfile
FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD ["streamlit", "run", "app.py", "--server.port=80", "--server.enableCORS=false"]
  1. Dockerイメージをビルドし、ローカルでテストします。
docker build -t aks-test .
docker run -p 8501:80 aks-test
  1. ブラウザで http://localhost:8501/ にアクセスし、アプリが立ち上がったことを確認します。

3. DockerイメージをACRにプッシュする

  1. Azure Container Registry(ACR)を構築します。
    SKUは何でもOKです。今回はBasicで作成します。

  2. Dockerイメージをビルドし、ACRにプッシュします。

docker build -t <acrのリソース名>.azurecr.io/aks-test .
az acr login --name <acrのリソース名>
docker push <acrのリソース名>.azurecr.io/aks-test
  1. ACRにプッシュされたことを確認します。

  2. AKSにACR Pullの権限を付与する

https://zenn.dev/headwaters/articles/dfc49e5ed0a47e

4. AKSへデプロイする

  1. Azure CLIを使ってAKSクラスターに接続します。
# Azure のテナントにログインする
az login -t "tenant ID"

# クラスター資格情報をダウンロードする
az aks get-credentials --resource-group "リソースグループ名" --name "クラスター名" --overwrite-existing
  1. デプロイメントとサービスのYAMLファイルを作成します。

streamlit-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: streamlit-deployment
  namespace: web
spec:
  replicas: 2
  selector:
    matchLabels:
      app: streamlit
  template:
    metadata:
      labels:
        app: streamlit
    spec:
      containers:
      - name: streamlit
        image: <acrのリソース名>.azurecr.io/aks-test
        ports:
        - containerPort: 80

streamlit-service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: streamlit-service
  namespace: web
spec:
  type: LoadBalancer
  selector:
    app: streamlit
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  1. デプロイメントとサービスを適用します。
# 名前空間を作成
kubectl create namespace web

# デプロイメントを適用
kubectl apply -f streamlit-deployment.yaml

# サービスを適用
kubectl apply -f streamlit-service.yaml
  1. サービスのステータスを確認し、外部IPが割り当てられていることを確認します。
kubectl get services -n web
  1. ブラウザで外部IPにアクセスし、Streamlitアプリケーションが表示されることを確認します。

クリーンアップ

作業が終わったら、リソースをクリーンアップします。

# サービスの削除
kubectl delete -f streamlit-service.yaml

# デプロイメントの削除
kubectl delete -f streamlit-deployment.yaml

# 名前空間の削除(必要に応じて)
kubectl delete namespace web

まとめ

Localで開発したStreamlitのアプリケーションをACR経由でAKSにデプロイする手順についてまとめました。
AKSの雰囲気は分かってきた気がする。ただ、ムズカシイ。。

ヘッドウォータース

Discussion