このクイックスタートでは、Azure CLI を使用して、Azure Database for PostgreSQL フレキシブル サーバーを使用して Azure Kubernetes Service (AKS) クラスターに Django アプリケーションをデプロイします。
AKS は、クラスターをすばやくデプロイおよび管理するために使用するマネージド Kubernetes サービスです。 Azure Database for PostgreSQL フレキシブル サーバーは、データベース管理機能と構成設定に対してよりきめ細かな制御と柔軟性を提供するように設計されたフル マネージド データベース サービスです。
注
このクイックスタートでは、Kubernetes の概念、Django、PostgreSQL に関する基礎知識があることを前提としています。
[前提条件]
Azure アカウントをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
- 新しいブラウザー ウィンドウで Azure Cloud Shell を起動します。 ローカル コンピューターに Azure CLI をインストールすることもできます。 ローカル インストールを使用している場合は、 az login コマンドを使用してサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。
- az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。 この記事では、Azure CLI の最新バージョンが必要です。 Azure Cloud Shell を使用している場合は、最新バージョンが既にインストールされています。
リソース グループを作成する
Azure リソース グループは、Azure リソースをデプロイおよび管理する論理グループです。 eastus の場所で az-group-create コマンドを使用して、django-project という名前のリソース グループを作成します。
az group create --name django-project --location eastus
注
リソース グループの場所には、リソース グループのメタデータが格納されます。 また、リソースの作成時に別のリージョンを指定しない場合に、Azure でリソースが実行される場所でもあります。
次の出力例では、正常に作成されたリソース グループが示されています。
{
"id": "/subscriptions/<guid>/resourceGroups/django-project",
"location": "eastus",
"managedBy": null,
"name": "django-project",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null
}
AKS クラスターの作成
AKS クラスターを作成するには、az aks create コマンドを使用します。 次の例では、djangoappcluster という名前のクラスターを 1 つのノードで作成します。 クラスターの作成は、完了するまでに数分かかります。
az aks create --resource-group django-project --name djangoappcluster --node-count 1 --generate-ssh-keys
数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。
注
AKS クラスターを作成すると、コマンドによって、AKS リソースを格納する 2 つ目のリソース グループが自動的に作成されます。 詳細については、「AKS と一緒にリソース グループが 2 つ作成されるのはなぜでしょうか?」を参照してください。
クラスターに接続する
Kubernetes クラスターを管理するには、Kubernetes のコマンドライン クライアントである kubectl を使用します。 Azure Cloud Shell を使用している場合、kubectl は既にインストールされています。
注
Azure CLI をローカルで実行している場合は、 az aks install-cli コマンドを実行して kubectlをインストールします。
Kubernetes クラスターに接続するように kubectl を構成するには、az aks get-credentials コマンドを使用します。 このコマンドは、資格情報をダウンロードし、それを使用するように Kubernetes CLI を構成します。
az aks get-credentials --resource-group django-project --name djangoappcluster
クラスターへの接続を確認するには、クラスター ノードの一覧を返す kubectl get コマンドを使用します。
kubectl get nodes
次の出力例は、前の手順で作成した単一ノードを示しています。 ノードの状態が "準備完了" であることを確認します。
NAME STATUS ROLES AGE VERSION
aks-nodepool1-31718369-0 Ready agent 6m44s v1.12.8
フレキシブル サーバー インスタンスを作成する
az postgreSQL flexible-server create コマンドを使って、Azure Database for PostgreSQL フレキシブル サーバー インスタンスを作成します。 次のコマンドでは、サービスの既定値と Azure CLI のローカル コンテキストからの値を使用してサーバーを作成します。
az postgres flexible-server create --public-access all
サーバーには次の属性があります。
-
postgresという名前の新しい空のデータベースは、サーバーが最初にプロビジョニングされるときに作成されます。 このクイック スタートでは、postgresデータベースを使用します。 - 自動生成されたサーバー名、管理者ユーザー名、管理者パスワード、リソース グループ名 (ローカル コンテキストでまだ指定していない場合)、およびリソース グループと同じ場所。
- public-access 引数を使用すると、適切なユーザー名とパスワードを持つ任意のクライアントのパブリック アクセス権を持つサーバーを作成します。
- コマンドはローカル コンテキストを使用するため、リソース グループ
django-projectとリージョンeastusにサーバーを作成します。
Django Docker イメージを作成する
新しい Django アプリケーションを作成するか、既存の Django プロジェクトを使用します。 コードが次のフォルダー構造であることを確認します。
└───my-djangoapp
└───views.py
└───models.py
└───forms.py
├───templates
. . . . . . .
├───static
. . . . . . .
└───my-django-project
└───settings.py
└───urls.py
└───wsgi.py
. . . . . . .
└─── Dockerfile
└─── requirements.txt
└─── manage.py
ALLOWED_HOSTSのsettings.pyを更新して、Django アプリケーションが Kubernetes アプリに割り当てられる外部 IP を使用していることを確認します。
ALLOWED_HOSTS = ['*']
DATABASES={ } ファイルの settings.py セクションを更新します。 このコード スニペットは、Kubernetes マニフェスト ファイルからデータベース ホスト、ユーザー名、およびパスワードを読み取ります。
DATABASES={
'default':{
'ENGINE':'django.db.backends.postgresql_psycopg2',
'NAME':os.getenv('DATABASE_NAME'),
'USER':os.getenv('DATABASE_USER'),
'PASSWORD':os.getenv('DATABASE_PASSWORD'),
'HOST':os.getenv('DATABASE_HOST'),
'PORT':'5432',
'OPTIONS': {'sslmode': 'require'}
}
}
requirements.txt ファイルを生成する
Django アプリケーションの依存関係を一覧表示する requirements.txt ファイルを作成します。
requirements.txt ファイルの例を次に示します。
pip freeze > requirements.txt を使って、既存のアプリケーションの requirements.txt ファイルを生成できます。
Django==2.2.17
postgres==3.0.0
psycopg2-binary==2.8.6
psycopg2-pool==1.1
pytz==2020.4
Dockerfile を作成する
Dockerfileという名前の新しいファイルを作成し、次のコード スニペットをコピーします。 この Dockerfile は Python 3.8 を設定し、 requirements.txt ファイルに記載されているすべての要件をインストールします。
# Use the official Python image from the Docker Hub
FROM python:3.8.2
# Make a new directory to put our code in.
RUN mkdir /code
# Change the working directory.
WORKDIR /code
# Copy to code folder
COPY . /code/
# Install the requirements.
RUN pip install -r requirements.txt
# Run the application:
CMD python manage.py runserver 0.0.0.0:8000
イメージのビルド
my-django-app コマンドを使用して、ターミナルの cd ディレクトリにいることを確認します。 次のコマンドを実行して、掲示板イメージをビルドします。
docker build --tag myblog:latest .
Docker Hub または Azure Container Registry にイメージをデプロイします。
Important
Azure コンテナー レジストリ (ACR) を使用している場合は、 az aks update コマンドを実行して ACR アカウントを AKS クラスターにアタッチします。
az aks update --name djangoappcluster --resource-group django-project --attach-acr <your-acr-name>
Kubernetes マニフェスト ファイルを作成する
Kubernetes のマニフェスト ファイルでは、どのコンテナー イメージを実行するかなど、クラスターの望ましい状態を定義します。
djangoapp.yamlという名前のマニフェスト ファイルを作成し、次の YAML 定義でコピーします。
Important
env セクションを、Azure Database for PostgreSQL フレキシブル サーバー インスタンスのSERVERNAME、YOUR-DATABASE-USERNAME、およびYOUR-DATABASE-PASSWORDの値で更新します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: django-app
spec:
replicas: 1
selector:
matchLabels:
app: django-app
template:
metadata:
labels:
app: django-app
spec:
containers:
- name: django-app
image: [DOCKER-HUB-USER-OR-ACR-ACCOUNT]/[YOUR-IMAGE-NAME]:[TAG]
ports:
- containerPort: 8000
env:
- name: DATABASE_HOST
value: "SERVERNAME.postgres.database.azure.com"
- name: DATABASE_USER
value: "YOUR-DATABASE-USERNAME"
- name: DATABASE_PASSWORD
value: "YOUR-DATABASE-PASSWORD"
- name: DATABASE_NAME
value: "postgres"
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- django-app
topologyKey: "kubernetes.io/hostname"
---
apiVersion: v1
kind: Service
metadata:
name: python-svc
spec:
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 8000
selector:
app: django-app
Django を AKS クラスターにデプロイする
kubectl apply コマンドを使用してアプリケーションをデプロイします。 YAML マニフェストの名前を指定します。
kubectl apply -f djangoapp.yaml
次の出力例は、正常に作成されたデプロイおよびサービスを示しています。
deployment "django-app" created
service "python-svc" created
django-appという名前のデプロイでは、アプリに使用するイメージ、ポッドの数、ポッドの構成など、デプロイの詳細について説明します。 外部 IP を介してアプリケーションを公開するために、 python-svc という名前のサービスを作成します。
アプリケーションをテストする
アプリケーションが実行されると、Kubernetes サービスによってアプリケーション フロント エンドがインターネットに公開されます。 このプロセスが完了するまでに数分かかることがあります。
進行状況を監視するには、kubectl get service コマンドを --watch 引数と一緒に使用します。
kubectl get service python-svc --watch
最初に、django-app service の EXTERNAL-IP は保留中と表示されます。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
django-app LoadBalancer 10.0.37.27 <pending> 80:30572/TCP 6s
"EXTERNAL-IP" アドレスが "保留中" から実際のパブリック IP アドレスに変わったら、 を使用して ウォッチ プロセスを停止します。CTRL-Ckubectl 次の出力例は、サービスに割り当てられている有効なパブリック IP アドレスを示しています。
django-app LoadBalancer 10.0.37.27 52.179.23.131 80:30572/TCP 2m
次に、サービスの外部 IP アドレス (http://<service-external-ip-address>) を Web ブラウザーで開き、Django アプリケーションを表示します。
注
- 現在、Django サイトでは HTTPS は使われていません。 HTTPS の詳細と、AKS 用にアプリケーション ルーティングを構成する方法については、「アプリケーション ルーティング アドオンでのマネージド NGINX イングレス」をご覧ください。
データベースの移行を実行する
Django アプリケーションの場合は、データベースの移行を実行するか、静的ファイルを収集する必要があります。 これらの Django シェル コマンドは、 $ kubectl exec <pod-name> -- [COMMAND]を使用して実行できます。 コマンドを実行する前に、 kubectl get podsを使用してポッド名を見つける必要があります。
$ kubectl get pods
次のような出力が表示されます。
NAME READY STATUS RESTARTS AGE
django-app-5d9cd6cd8-l6x4b 1/1 Running 0 2m
ポッド名を見つけたら、コマンド $ kubectl exec <pod-name> -- [COMMAND]を使用して Django データベースの移行を実行します。
/code/ は、上記の「 Dockerfile 」セクションで定義したプロジェクトの作業ディレクトリです。
$ kubectl exec django-app-5d9cd6cd8-l6x4b -- python /code/manage.py migrate
出力は次のようになります。
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
. . . . . .
問題が発生した場合は、 kubectl logs <pod-name> を実行して、アプリケーションがスローする例外を確認します。 アプリケーションが正常に動作すると、 kubectl logsの実行時に次のような出力が表示されます。
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
December 08, 2020 - 23:24:14
Django version 2.2.17, using settings 'django_postgres_app.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
リソースのクリーンアップ
Azure の料金を回避するには、不要なリソースをクリーンアップします。 クラスターが不要になったら、 az group delete コマンドを使用して、リソース グループ、コンテナー サービス、およびすべての関連リソースを削除します。
az group delete --name django-project --yes --no-wait
注
クラスターを削除しても、AKS クラスターで使用される Microsoft Entra サービス プリンシパルは削除されません。 サービス プリンシパルを削除する手順については、AKS のサービス プリンシパルに関する考慮事項と削除に関するページを参照してください。 マネージド ID を使用する場合、プラットフォームによって ID が管理され、削除は必要ありません。