🎼

Azure Container Apps で、正常性プローブを構成する

2022/04/26に公開

Azure Container Apps では、正常性プローブを利用することができます。

が、現状 GUI (Azure portal) では該当の設定はできない模様です。

ARM Template からデプロイする必要がありますが、公式ドキュメントでは微妙に省略されているようですので、実際にやって結果を残してみました。

環境・準備

  • Azure Container Apps
  • Windows 10
  • Windows PowerShell
  • Azure CLI (v2.30.0)

使ったサンプル

今回は Web サーバが立っていれば OK ということで、Nginx を使いました。

正常性プローブについて

正常性プローブそのものについては Kubernetes の概念です。下記ようなドキュメントを参照くださいませ。

やってみた

正常動作するパターン (1)

ARM Template の作成

ARM Template の containers 配下の probes にて、プローブの構成を配列で指定することになります。

原型は単一コンテナイメージの Container App で生成される ARM Template を参考に、下記のように template.json および parameters.json を作成しました。

template.json
{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "subscriptionId": {
            "type": "string"
        },
        "name": {
            "type": "string"
        },
        "location": {
            "type": "string"
        },
        "environmentId": {
            "type": "string"
        },
        "containers": {
            "type": "array"
        },
        "secrets": {
            "type": "array"
        },
        "registries": {
            "type": "array"
        },
        "ingress": {
            "type": "object"
        }
    },
    "resources": [
        {
            "name": "[parameters('name')]",
            "kind": "containerapps",
            "location": "[parameters('location')]",
            "dependsOn": [],
            "properties": {
                "configuration": {
                    "secrets": "[parameters('secrets')]",
                    "registries": "[parameters('registries')]",
                    "ingress": "[parameters('ingress')]"
                },
                "template": {
                    "containers": "[parameters('containers')]"
                },
                "managedEnvironmentId": "[parameters('environmentId')]"
            },
            "apiVersion": "2022-01-01-preview",
            "type": "Microsoft.App/containerapps"
        }
    ]
}
parameters.json
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "subscriptionId": {
            "value": "..." // Subscription ID
        },
        "name": {
            "value": "prove-test-80"
        },
        "location": {
            "value": "northeurope"
        },
        "environmentId": {
            "value": "..." // Container Apps Environment ID
        },
        "containers": {
            "value": [
                {
                    "name": "prove-test-con",
                    "image": "nginx",
                    "command": [],
                    "resources": {
                        "cpu": ".25",
                        "memory": ".5Gi"
                    },
                    "probes": [
                        {
                            "type": "readiness",
                            "tcpSocket": {
                                "port": 80
                            },
                            "initialDelaySeconds": 1,
                            "periodSeconds": 5
                        }
                    ]
                }
            ]
        },
        "registries": {
            "value": []
        },
        "secrets": {
            "value": []
        },
        "ingress": {
            "value": {
                "external": true,
                "targetPort": "80",
                "transport": "auto",
                "allowInsecure": true
            }
        }
    }
}

デプロイ

Container Apps 環境が作成されていれば、あとは ARM Template をデプロイすれば OK です。

az deployment group create --resource-group <リソースグループ名> --template-file template.json --parameters '@parameters.json'

動作確認

正常にアクセスできていることが確認できます。

NG のパターン

ARM Template の作成

今度は Startup Probe を設定してみます。わざと失敗するよう、検証ポートを 81 にしておきます。template.json は同一なので省略です。

parameters.json
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "subscriptionId": {
            "value": "..." // Subscription ID
        },
        "name": {
            "value": "prove-test-81"
        },
        "location": {
            "value": "northeurope"
        },
        "environmentId": {
            "value": "..." // Container Apps Environment ID
        },
        "containers": {
            "value": [
                {
                    "name": "prove-test-con",
                    "image": "nginx",
                    "command": [],
                    "resources": {
                        "cpu": ".25",
                        "memory": ".5Gi"
                    },
                    "probes": [
                        {
                            "type": "readiness",
                            "tcpSocket": {
                                "port": 80
                            },
                            "initialDelaySeconds": 1,
                            "periodSeconds": 5
                        },
                        {
                            "type": "startup",
                            "httpGet": {
                                "path": "/",
                                "port": 81,
                                "httpHeaders": [
                                    {
                                        "name": "Custom-Header",
                                        "value": "startup probe"
                                    }
                                ]
                            },
                            "initialDelaySeconds": 1,
                            "periodSeconds": 5
                        }
                    ]
                }
            ]
        },
        "registries": {
            "value": []
        },
        "secrets": {
            "value": []
        },
        "ingress": {
            "value": {
                "external": true,
                "targetPort": "80",
                "transport": "auto",
                "allowInsecure": true
            }
        }
    }
}

デプロイ

同上

動作確認

いつまでたってもアクセスできないことが確認できます。Startup Probe が成功しないので、受信アクセスの割り振りが有効になっていないことが想定できます。

なお、Log Analytics 側に何か出てないかと思って確認したのですが、それらしいログは確認できませんでした。残念。

正常動作するパターン (2)

ARM Template の作成

Startup Probe の検証ポートを 80 にしておきます。template.json は同一なので省略です。

parameters.json
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "subscriptionId": {
            "value": "..." // Subscription ID
        },
        "name": {
            "value": "prove-test-80-2"
        },
        "location": {
            "value": "northeurope"
        },
        "environmentId": {
            "value": "..." // Container Apps Environment ID
        },
        "containers": {
            "value": [
                {
                    "name": "prove-test-con",
                    "image": "nginx",
                    "command": [],
                    "resources": {
                        "cpu": ".25",
                        "memory": ".5Gi"
                    },
                    "probes": [
                        {
                            "type": "readiness",
                            "tcpSocket": {
                                "port": 80
                            },
                            "initialDelaySeconds": 1,
                            "periodSeconds": 5
                        },
                        {
                            "type": "startup",
                            "httpGet": {
                                "path": "/",
                                "port": 80,
                                "httpHeaders": [
                                    {
                                        "name": "Custom-Header",
                                        "value": "startup probe"
                                    }
                                ]
                            },
                            "initialDelaySeconds": 1,
                            "periodSeconds": 5
                        }
                    ]
                }
            ]
        },
        "registries": {
            "value": []
        },
        "secrets": {
            "value": []
        },
        "ingress": {
            "value": {
                "external": true,
                "targetPort": "80",
                "transport": "auto",
                "allowInsecure": true
            }
        }
    }
}

デプロイ

同上

動作確認

今度は正常にアクセスできるようになったことが確認できました。

まとめ

無事、動作確認できました🤗

通常の Kubernetes と同様に、「起動に時間を要するコンテナの起動を待つ」といったことが実現できますね!

Discussion