本記事は毎週水曜日のAzureリレーの記事となります。
今回は私が以前嵌ったAKSのLoadBalancer Serviceのタイムアウト時間について少し書いていきます。
この記事の要約
- AKSで作成した LoadBalancer Serviceリソースのデフォルトタイムアウトは4分
- 最大は30分で、時間を設定するには設定したいServiceリソースの
Service.metadata.annotations.service.beta.kubernetes.io/azure-load-balancer-tcp-idle-timeout
を4~30の任意の値に設定する。
デフォルトタイムアウト時間について
要約でも書いていますが、AKSのLoadBalancer Serviceリソースのデフォルトタイムアウトは4分です。
なぜ???
結論から言うとAKSではLoadBalancer Serviceリソースを作る際、AzureリソースとしてのLoadBalancerリソースを作成するからです。そして、Azure LoadBalancerのデフォルトタイムアウト時間が4分なのです。
実際に確認してみます。例えばとあるAKSクラスターに以下のようなLoadBalancer Serviceリソースのyamlを流します。
kind: Service
apiVersion: v1
metadata:
name: test
labels:
app: test
spec:
ports:
- name: http
protocol: TCP
port: 8000
targetPort: 80
selector:
app: test
type: LoadBalancer
すると以下のようなリソースがAKS内に作成されます。External IPは 20.194.178.69
です。
次にAzure Poral上でLoad Balancerリソースを確認してみます。するとkubernetes
と言う名前のLoadBalancerリソースが作成されており、先程の External IPの負荷分散規則が追加されているのが確認できます。画像下部を確認してもらえるとわかるのですが、アイドルタイムアウトという項目が4分になっていますね。
タイムアウト時間を伸ばしたい
バックエンドに時間のかかる処理をさせる時に4分では足りない場合があります。ここではタイムアウト時間を伸ばす方法について説明していきます。
といってもすごく簡単で、要約に書いた通りyamlファイルに一行追加するだけです。ちなみにタイムアウト時間は伸ばせても最大で30分なのでそこは注意です。では先程のyamlファイルを以下のように書き換えます。
kind: Service
apiVersion: v1
metadata:
name: test
labels:
app: test
annotations:
service.beta.kubernetes.io/azure-load-balancer-tcp-idle-timeout: "30"
spec:
ports:
- name: http
protocol: TCP
port: 8000
targetPort: 80
selector:
app: test
type: LoadBalancer
service.beta.kubernetes.io/azure-load-balancer-tcp-idle-timeout: "30"
の部分を追記しています。今回は "30" と指定していますので30分になる想定です。改めてAzure Poral上でLoad Balancerリソースを確認してみます。指定通りアイドル タイムアウトが30分になっていますね。これでタイムアウト時間を伸ばすことができました。
まとめ
今回はAKSのLoadBalancer Serviceリソースのデフォルトタイムアウト時間とその時間の伸ばし方について説明しました。こういった内部的な動きは使う側はしっかり理解しておかないとひょんなことで嵌ったりします。裏側で色々よしなにしてくれるのはマネージドの良いところでもあるのですが、使う側は注意しないといけないですね。