Azure Cosmos DB を使用して新しいデータベースをホストする

完了

外部状態の基本的な概念と、Kubernetes を使ってそれらを処理する方法を確認したので、運送会社のアプリケーションをサポートするリソースを作成してから、アプリケーション自体を作成しましょう。

リソース グループを作成する

重要

この演習を行うには、独自の Azure サブスクリプションが必要です。また、料金が発生することがあります。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

  1. 独自のサブスクリプションを使用して、Azure portal にサインインします。

  2. Cloud Shell を開いて、[Bash] を選びます。

  3. 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 は相互に関連付けられては "いません"。

  1. これ以降のモジュールを通して使用する Azure Cosmos DB アカウント名とリソース グループ名を格納するための Bash 変数を作成します。

    export RESOURCE_GROUP=rg-ship-manager
    export COSMOSDB_ACCOUNT_NAME=contoso-ship-manager-$RANDOM
    
  2. az cosmosdb create コマンドを使用して、新しい Azure Cosmos DB アカウントを作成します。

    az cosmosdb create --name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --kind MongoDB
    

    作成プロセスが完了するまでに、しばらく時間がかかることがあります。

  3. 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
    
  4. 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 クラスターを作成する

  1. これ以降のモジュールを通して使用するクラスター名を格納するための Bash 変数を作成します。

    AKS_CLUSTER_NAME=ship-manager-cluster
    
  2. 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 サポート リクエストを通じてこのクォータを増加させる必要があります ([問題] の種類では [クォータ] を選択します)。

  3. 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」と入力します。

  4. 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 をデプロイする

  1. 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
    
  2. 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
    
  3. {your database connection string} プレースホルダーを、前のステップで取得したデータベース接続文字列に置き換えます。

    Note

    接続文字列は無効な YAML 文字を表すことがあるため、環境変数に引用符 " を追加することを忘れないでください。 AKS に接続文字列を格納および取得する安全な方法として、シークレットの使用を検討することをお勧めします。

  4. ファイルを保存して閉じます。

  5. kubectl apply コマンドを使って、バックエンド API のデプロイを適用します。

    kubectl apply -f backend-deploy.yml
    

    次の出力例のようなメッセージが表示されます。

    deployment.apps/ship-manager-backend created
    

誰でもこのアプリケーションを使用できるようにするには、トラフィックを処理するためのサービスとイングレスを作成する必要があります。

  1. 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
    
  2. 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
    
  3. <host-name> プレースホルダーを、前のステップで取得した接続文字列に置き換えます。

  4. ファイルを保存して閉じます。

  5. 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 にすぐにアクセスできない場合は、数分待ってからもう一度やり直してください。

  6. 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
    

フロントエンド インターフェイスをデプロイする

  1. 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}',
          }
        })()
    
  2. {YOUR_BACKEND_URL} プレースホルダーを、前のセクションで取得したバックエンド API のホスト名の URL に置き換えます。

  3. ファイルを保存して閉じます。

  4. kubectl apply コマンドを使って、フロントエンドのデプロイを適用します。

    kubectl apply -f frontend-deploy.yml
    

    出力は次の出力例のようになります。

    deployment.apps/ship-manager-frontend created
    configmap/frontend-config created
    

次に、このアプリケーションを Web に公開するために必要なネットワーク リソースを作成できます。

  1. 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
    
  2. <host-name> プレースホルダーを、前のセクションで取得した接続文字列に置き換えます。

  3. ファイルを保存して閉じます。

  4. 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 にすぐにアクセスできない場合は、数分待ってからもう一度やり直してください。

  5. 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 にアクセスして、出荷マネージャー アプリケーションを入力できるようになりました。