Azure Container Instances の信頼性

重要

現在、この機能はプレビュー段階にあります。 プレビュー版は、追加使用条件に同意することを条件に使用できます。

この記事では、Azure Container Instances (ACI) における信頼性サポートについて説明し、可用性ゾーンによるリージョン内の回復性と、ディザスター リカバリーの両方について取り上げます。 Azure における信頼性の詳細については、Azure の信頼性に関するページを参照してください。

可用性ゾーンのサポート

Azure 可用性ゾーンとは、各 Azure リージョン内にある、3 つ以上に物理的に分離されたデータセンターのグループです。 各ゾーン内のデータセンターには、独立した電源、冷却手段、ネットワーク インフラストラクチャが備わっています。 ローカル ゾーンの障害が発生した場合、可用性ゾーンは、1 つのゾーンが影響を受けたときに、リージョンのサービス、容量、高可用性が残りの 2 つのゾーンによってサポートされるように設計されています。

障害の範囲は、ソフトウェアやハードウェアの障害から、地震、水害、火災などの事象に至る可能性があります。 Azure サービスの冗長と論理的な分離により、障害に対するトレランスが実現されます。 Azure の可用性ゾーンの詳細については、リージョンと可用性ゾーンに関する記事を参照してください。

Azure の可用性ゾーン対応サービスは、適切なレベルの信頼性と柔軟性を提供するように設計されています。 それらは 2 つの方法で構成できます。 それらは、ゾーン間の自動レプリケーションによるゾーン冗長、またはインスタンスを特定のゾーンにピン留めするゾーンベースのいずれかになります。 これらのアプローチを組み合わせることもできます。 ゾーン ベースとゾーン冗長のアーキテクチャを比較した詳細については、「可用性ゾーンとリージョンの使用に関する推奨事項」を参照してください。

Azure Container Instances では、ゾーン ベースのコンテナー グループのデプロイをサポートしています。したがって、インスタンスは、自分で選んだ特定の可用性ゾーンに固定されます。 可用性ゾーンは、コンテナー グループ レベルで指定します。 コンテナー グループ内のコンテナーは、一意の可用性ゾーンを持つことができません。 コンテナー グループの可用性ゾーンを変更するには、そのコンテナー グループを削除し、新しい可用性ゾーンを持つ別のコンテナー グループを作成する必要があります。

前提条件

重要

この機能は、Azure portal では現在使用できません。

  • ゾーン ベースのコンテナー グループのデプロイは、Linux および Windows Server 2019 のコンテナー グループで ACI が使用できるほとんどのリージョンでサポートされています。 詳細については、リージョンとリソースの可用性に関するページをご覧ください。
  • Azure CLI を使用する場合は、バージョン 2.30.0 以降がインストールされていることを確認します。
  • PowerShell を使用する場合は、バージョン 2.1.1-preview 以降がインストールされていることを確認します。
  • Java SDK を使用する場合は、バージョン 2.9.0 以降がインストールされていることを確認します。
  • 可用性ゾーンのサポートは、ACI API バージョン 09-01-2021 以降でのみ使用できます。

重要

現時点では、GPU リソースを含むコンテナー グループは可用性ゾーンに対応していません。

可用性ゾーンの再デプロイと移行

コンテナー グループの可用性ゾーンを変更するには、そのコンテナー グループを削除し、新しい可用性ゾーンを持つ別のコンテナー グループを作成する必要があります。

可用性ゾーンが有効になっているリソースを作成する

可用性ゾーンが有効になっている Container Instance リソースを作成するには、Azure Resource Manager (ARM) テンプレートを使用してコンテナー グループをデプロイする必要があります。

注意

この記事の例は、Bash シェル形式で示してあります。 別のシェルを使用する場合は、必要に応じて行連結文字を調整してください。

ARM を使用してコンテナーをデプロイするには:

  1. 次の JSON をコピーして、azuredeploy.json という名前の新しいファイルに貼り付けます。 このテンプレート例では、1 つのコンテナーを含むコンテナー グループが、米国東部の可用性ゾーン 1 にデプロイされます。

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "metadata": {
            "_generator": {
                "name": "bicep",
                "version": "0.4.1.14562",
                "templateHash": "12367894147709986470"
            }
        },
        "parameters": {
            "name": {
                "type": "string",
                "defaultValue": "acilinuxpublicipcontainergroup",
                "metadata": {
                    "description": "Name for the container group"
                }
            },
            "image": {
                "type": "string",
                "defaultValue": "mcr.microsoft.com/azuredocs/aci-helloworld",
                "metadata": {
                    "description": "Container image to deploy. Should be of the form repoName/imagename:tag for images stored in public Docker Hub, or a fully qualified URI for other registries. Images from private registries require additional registry credentials."
                }
            },
            "port": {
                "type": "int",
                "defaultValue": 80,
                "metadata": {
                    "description": "Port to open on the container and the public IP address."
                }
            },
            "cpuCores": {
                "type": "int",
                "defaultValue": 1,
                "metadata": {
                    "description": "The number of CPU cores to allocate to the container."
                }
            },
            "memoryInGb": {
                "type": "int",
                "defaultValue": 2,
                "metadata": {
                    "description": "The amount of memory to allocate to the container in gigabytes."
                }
            },
            "restartPolicy": {
                "type": "string",
                "defaultValue": "Always",
                "allowedValues": [
                    "Always",
                    "Never",
                    "OnFailure"
                ],
                "metadata": {
                    "description": "The behavior of Azure runtime if container has stopped."
                }
            },
            "location": {
                "type": "string",
                "defaultValue": "eastus",
                "metadata": {
                    "description": "Location for all resources."
                }
            }
        },
        "functions": [],
        "resources": [
            {
                "type": "Microsoft.ContainerInstance/containerGroups",
                "apiVersion": "2021-09-01",
                "zones": [
                    "1"
                ],
                "name": "[parameters('name')]",
                "location": "[parameters('location')]",
                "properties": {
                    "containers": [
                        {
                            "name": "[parameters('name')]",
                            "properties": {
                                "image": "[parameters('image')]",
                                "ports": [
                                    {
                                        "port": "[parameters('port')]",
                                        "protocol": "TCP"
                                    }
                                ],
                                "resources": {
                                    "requests": {
                                        "cpu": "[parameters('cpuCores')]",
                                        "memoryInGB": "[parameters('memoryInGb')]"
                                    }
                                }
                            }
                        }
                    ],
                    "osType": "Linux",
                    "restartPolicy": "[parameters('restartPolicy')]",
                    "ipAddress": {
                        "type": "Public",
                        "ports": [
                            {
                                "port": "[parameters('port')]",
                                "protocol": "TCP"
                            }
                        ]
                    }
                }
            }
        ],
        "outputs": {
            "containerIPv4Address": {
                "type": "string",
                "value": "[reference(resourceId('Microsoft.ContainerInstance/containerGroups', parameters('name'))).ipAddress.ip]"
            }
        }
    }
    
  2. [az group create][availability-zones-group-create] コマンドを使用してリソース グループを作成します。

    az group create --name myResourceGroup --location eastus
    
  3. az deployment group create コマンドを使用してテンプレートをデプロイします。

    az deployment group create \
      --resource-group myResourceGroup \
      --template-file azuredeploy.json
    
  4. コンテナー グループが可用性ゾーンに正常にデプロイされたことを確認するには、az container show コマンドを使用してコンテナー グループの詳細を表示します。

    az containershow --name acilinuxcontainergroup --resource-group myResourceGroup
    

ゾーン フェールオーバーのサポート

コンテナー インスタンスのコンテナー グループは、1 つの可用性ゾーンに割り当てられます。 その結果、コンテナー インスタンスのグループは、同じリージョンの他の可用性ゾーンで発生する停止の影響を受けることはありません

ただし、コンテナー グループの可用性ゾーンで停止が発生した場合は、そのグループ内のすべてのコンテナー インスタンスでダウンタイムが発生する可能性があります。

コンテナー インスタンスのダウンタイムを回避するために、特定のリージョンの 2 つの異なる可用性ゾーンに渡って、少なくとも 2 つのコンテナー グループを作成することをお勧めします。 これにより、そのリージョン内の 1 つのゾーンで障害が発生しても、コンテナー インスタンス リソースは常に稼働状態になります。

障害復旧

Azure リージョンまたはデータセンター全体でダウンタイムが発生した場合でも、ミッション クリティカルなコードは別のリージョンで処理を続行する必要があります。 Azure Container Instances は、ゾーン構成でデプロイされ、特定のリージョン内の特定のゾーンで実行されます。 使用可能な組み込みの冗長性は存在しません。 リージョン全体の停止中に稼動できなくなるのを防ぐために、コンテナー インスタンスを他のリージョンに冗長的にデプロイできます。

次のステップ