Azure Container Apps で、正常性プローブを構成する
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
を作成しました。
{
"$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"
}
]
}
{
"$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
は同一なので省略です。
{
"$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
は同一なので省略です。
{
"$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