Azure Cosmos DB を使用して新しいデータベースをホストする
外部状態の基本的な概念と、Kubernetes を使ってそれらを処理する方法を確認したので、運送会社のアプリケーションをサポートするリソースを作成してから、アプリケーション自体を作成しましょう。
リソース グループを作成する
重要
この演習を行うには、独自の Azure サブスクリプションが必要です。また、料金が発生することがあります。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
独自のサブスクリプションを使用して、Azure portal にサインインします。
Cloud Shell を開いて、[Bash] を選びます。
az group create
コマンドを使って Azure リソース グループを作成し、リージョンを指定します。 この例では、eastus リージョンに rg-ship-manager という名前のリソース グループを作成します。az group create --name rg-ship-manager --location eastus
作成プロセスが完了するまでに、しばらく時間がかかることがあります。
状態を作成する
前に説明したように、Kubernetes で状態を処理することはできますが、お勧めしません。 状態を自分で管理する必要があると、高可用性アプリケーションの状態の管理が難しくなりすぎることがあります。
その問題を解決するため、外部状態の処理に特化したアプリケーションに状態を外部化します。Azure Cosmos DB を使います。
Note
アプリケーションを実行するために必要なリソースの一部として Azure Cosmos DB のインスタンスを作成していますが、Azure Kubernetes Service (AKS) と Azure Cosmos DB は相互に関連付けられては "いません"。
これ以降のモジュールを通して使用する Azure Cosmos DB アカウント名とリソース グループ名を格納するための Bash 変数を作成します。
export RESOURCE_GROUP=rg-ship-manager export COSMOSDB_ACCOUNT_NAME=contoso-ship-manager-$RANDOM
az cosmosdb create
コマンドを使用して、新しい Azure Cosmos DB アカウントを作成します。az cosmosdb create --name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --kind MongoDB
作成プロセスが完了するまでに、しばらく時間がかかることがあります。
az cosmosdb mongodb database create
コマンドを使用して、新しいデータベースを作成します。 この例では、データベースの名前は contoso-ship-manager です。az cosmosdb mongodb database create --account-name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --name contoso-ship-manager
az cosmosdb mongodb database list
コマンドを使って、データベースが正常に作成されたことを確認します。az cosmosdb mongodb database list --account-name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP -o table
出力は次の出力例のようになります。
Name ResourceGroup -------------------- --------------- contoso-ship-manager rg-ship-manager
これで、出荷マネージャー アプリケーションからすべてのデータを格納するための外部状態ができました。次は、アプリケーション自体を格納するための AKS リソースを作成しましょう。
AKS クラスターを作成する
これ以降のモジュールを通して使用するクラスター名を格納するための Bash 変数を作成します。
AKS_CLUSTER_NAME=ship-manager-cluster
az aks create
コマンドを使用して、AKS クラスターを作成します。az aks create --resource-group $RESOURCE_GROUP \ --name $AKS_CLUSTER_NAME \ --node-count 3 \ --generate-ssh-keys \ --node-vm-size Standard_B2s \ --enable-addons http_application_routing
作成プロセスが完了するまでに、しばらく時間がかかることがあります。
Note
すべての Azure サービスには、特定の仮想マシン (VM) SKU の使用制限を含め、リソースと機能に対してデフォルトの制限とクォータが設定されています。 選択したリージョンで目的の VM SKU が利用できないというエラーが発生した場合は、おそらく Azure サポート リクエストを通じてこのクォータを増加させる必要があります ([問題] の種類では [クォータ] を選択します)。
az aks get-credentials
コマンドを使って、kubectl の構成をダウンロードします。az aks get-credentials --name $AKS_CLUSTER_NAME --resource-group $RESOURCE_GROUP
たとえば、既存のクラスターに関するメッセージを受信した場合は次のようになります。
A different object named ship-manager-cluster already exists in your kubeconfig file. Overwrite? (y/n):
上書きするには「
y
」と入力します。kubectl get nodes
コマンドを使って、構成をテストします。kubectl get nodes
出力は次の出力例のようになります。
NAME STATUS ROLES AGE VERSION aks-nodepool1-12345678-vmss000000 Ready agent 3m19s v1.27.7 aks-nodepool1-12345678-vmss000001 Ready agent 3m25s v1.27.7 aks-nodepool1-12345678-vmss000002 Ready agent 3m20s v1.27.7
アプリケーションを展開する
アプリケーションを作成するには、Kubernetes にデプロイするための YAML ファイルを作成する必要があります。
バックエンド API をデプロイする
az cosmosdb keys list
コマンドを使って、Azure Cosmos DB のデータベース接続文字列を取得します。az cosmosdb keys list --type connection-strings -g $RESOURCE_GROUP -n $COSMOSDB_ACCOUNT_NAME --query "connectionStrings[0].connectionString" -o tsv
出力は次の出力例のようになります。
mongodb://contoso-ship-manager-12345678.documents.azure.com:10255/?ssl=true&replicaSet=globaldb
backend-deploy.yml という名前で新しいファイルを作成して、次のデプロイ仕様を貼り付けます。
apiVersion: apps/v1 kind: Deployment metadata: name: ship-manager-backend spec: replicas: 1 selector: matchLabels: app: ship-manager-backend template: metadata: labels: app: ship-manager-backend spec: containers: - image: mcr.microsoft.com/mslearn/samples/contoso-ship-manager:backend name: ship-manager-backend resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 3000 name: http env: - name: DATABASE_MONGODB_URI value: "{your database connection string}" - name: DATABASE_MONGODB_DBNAME value: contoso-ship-manager
{your database connection string}
プレースホルダーを、前のステップで取得したデータベース接続文字列に置き換えます。Note
接続文字列は無効な YAML 文字を表すことがあるため、環境変数に引用符
"
を追加することを忘れないでください。 AKS に接続文字列を格納および取得する安全な方法として、シークレットの使用を検討することをお勧めします。ファイルを保存して閉じます。
kubectl apply
コマンドを使って、バックエンド API のデプロイを適用します。kubectl apply -f backend-deploy.yml
次の出力例のようなメッセージが表示されます。
deployment.apps/ship-manager-backend created
誰でもこのアプリケーションを使用できるようにするには、トラフィックを処理するためのサービスとイングレスを作成する必要があります。
az aks show
コマンドを使って、クラスター API サーバーのアドレスを取得します。az aks show -g $RESOURCE_GROUP -n $AKS_CLUSTER_NAME -o tsv --query fqdn
出力は次の出力例のようになります。
ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io
backend-network.yml という名前で新しいファイルを作成して、次のネットワーク仕様を貼り付けます。
apiVersion: v1 kind: Service metadata: name: ship-manager-backend spec: type: ClusterIP ports: - port: 80 targetPort: 3000 selector: app: ship-manager-backend --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ship-manager-backend spec: ingressClassName: webapprouting.kubernetes.azure.com rules: - host: <host-name> http: paths: - backend: service: name: ship-manager-backend port: number: 80 path: / pathType: Prefix
<host-name>
プレースホルダーを、前のステップで取得した接続文字列に置き換えます。ファイルを保存して閉じます。
kubectl apply
コマンドを使って、バックエンド ネットワークのデプロイを適用します。kubectl apply -f backend-network.yml
出力は次の出力例のようになります。
service/ship-manager-backend created ingress.networking.k8s.io/ship-manager-backend created
API には、イングレス リソースに貼り付けたホスト名を使用してアクセスできます。 Azure DNS ゾーン リソースによる DNS の検出が完了するまでに、最大で 5 分かかることがあります。 API にすぐにアクセスできない場合は、数分待ってからもう一度やり直してください。
kubectl get ingress
コマンドを使って、Kubernetes で利用できるイングレスのクエリを実行し、イングレスの状態を確認します。kubectl get ingress
次の出力例で示すように、出力の ADDRESS フィールドに値が設定されたら、イングレスがデプロイされ、アクセスできる状態になったことを意味します。
NAME CLASS HOSTS ADDRESS PORTS AGE ship-manager-backend webapprouting.kubernetes.azure.com ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io xx.xx.xx.xx 80 2m40s
フロントエンド インターフェイスをデプロイする
frontend-deploy.yml という名前で新しいファイルを作成して、次のデプロイ仕様を貼り付けます。
apiVersion: apps/v1 kind: Deployment metadata: name: ship-manager-frontend spec: replicas: 1 selector: matchLabels: app: ship-manager-frontend template: metadata: labels: app: ship-manager-frontend spec: containers: - image: mcr.microsoft.com/mslearn/samples/contoso-ship-manager:frontend name: ship-manager-frontend imagePullPolicy: Always resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 80 volumeMounts: - name: config mountPath: /usr/src/app/dist/config.js subPath: config.js volumes: - name: config configMap: name: frontend-config --- apiVersion: v1 kind: ConfigMap metadata: name: frontend-config data: config.js: | const config = (() => { return { 'VUE_APP_BACKEND_BASE_URL': 'http://{YOUR_BACKEND_URL}', } })()
{YOUR_BACKEND_URL}
プレースホルダーを、前のセクションで取得したバックエンド API のホスト名の URL に置き換えます。ファイルを保存して閉じます。
kubectl apply
コマンドを使って、フロントエンドのデプロイを適用します。kubectl apply -f frontend-deploy.yml
出力は次の出力例のようになります。
deployment.apps/ship-manager-frontend created configmap/frontend-config created
次に、このアプリケーションを Web に公開するために必要なネットワーク リソースを作成できます。
frontend-network.yml という名前で新しいファイルを作成して、次のネットワーク仕様を貼り付けます。
apiVersion: v1 kind: Service metadata: name: ship-manager-frontend spec: type: ClusterIP ports: - port: 80 targetPort: 80 selector: app: ship-manager-frontend --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ship-manager-frontend spec: ingressClassName: webapprouting.kubernetes.azure.com rules: - host: <host-name> http: paths: - backend: service: name: ship-manager-frontend port: number: 80 path: / pathType: Prefix
<host-name>
プレースホルダーを、前のセクションで取得した接続文字列に置き換えます。ファイルを保存して閉じます。
kubectl apply
コマンドを使って、フロントエンド ネットワークのデプロイを適用します。kubectl apply -f frontend-network.yml
出力は次の出力例のようになります。
service/ship-manager-frontend created ingress.networking.k8s.io/ship-manager-frontend created
API には、イングレス リソースに貼り付けたホスト名を使用してアクセスできます。 Azure DNS ゾーン リソースによる DNS の検出が完了するまでに、最大で 5 分かかることがあります。 API にすぐにアクセスできない場合は、数分待ってからもう一度やり直してください。
kubectl get ingress
コマンドを使って、Kubernetes で利用できるイングレスのクエリを実行し、イングレスの状態を確認します。kubectl get ingress
次の出力例で示すように、出力の ADDRESS フィールドに値が設定されたら、イングレスがデプロイされ、アクセスできる状態になったことを意味します。
NAME CLASS HOSTS ADDRESS PORTS AGE ship-manager-backend webapprouting.kubernetes.azure.com ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io xx.xx.xx.xx 80 2m40s ship-manager-frontend webapprouting.kubernetes.azure.com ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io xx.xx.xx.xx 80 100s
これで、イングレス リソースのホスト名から URL にアクセスして、出荷マネージャー アプリケーションを入力できるようになりました。