複数ポートの Service で Load Balancer の更新を高速化する
type: LoadBalancer の Service では、ポートごとに Load Balancer 上の pool が 1 つ対応します。クラスターの node が変わると(node の追加・削除、オートスケール、node pool のアップグレード)、すべての pool の backend リストを更新する必要があります。
デフォルトでは pool を 1 つずつ順番に 更新するため、ポートが多い Service ほど更新に時間がかかります。batch-update-strategy annotation を有効にすると、すべての pool の backend を 1 回の操作でまとめて 更新します。Load Balancer が新しい設定を適用するのは 1 回だけなので、ポートの多い Service では、Load Balancer 上の backend が新しい node に揃うまでの時間を大幅に短縮できます。
有効にするケース
次の場合に有効にします。
- Service に 複数のポート がある
- クラスターの node が 頻繁に変わる(autoscaler の有効化、node pool のスケール、定期的なアップグレード)
ポートが 1 つだけの Service では、目立った違いはありません。
annotation を有効にする
Service に値 "true" の annotation を追加します。
apiVersion: v1
kind: Service
metadata:
name: web
annotations:
loadbalancer.fptcloud.com/batch-update-strategy: "true"
spec:
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 8080
- name: https
port: 443
targetPort: 8443
稼働中の Service で有効にすることもできます。
kubectl annotate service web loadbalancer.fptcloud.com/batch-update-strategy="true" --overwrite
- 機能が有効になるのは、小文字の文字列
"true"を指定した場合だけです。"True"、"yes"、"1"などの値は 無効 として扱われます。 - Service や Load Balancer を作り直す必要はありません。変更は次回の Load Balancer 更新から反映されます。
- annotation を有効化・無効化しても、既存の backend は削除も再作成もされず、サービスは中断しません。
annotation を無効にする
annotation を削除するか、値を "false" に設定します。
kubectl annotate service web loadbalancer.fptcloud.com/batch-update-strategy-
Service はデフォルトの pool ごとの更新に戻ります。
結果を確認する
Service の event を確認します。
kubectl describe service web
正常に動作している場合、関連する 警告 event は出ません。表示される可能性のある event は次のとおりです。
| Event (Warning) | 意味 | 対応 |
|---|---|---|
LoadBalancerBatchUpdateSkipped | annotation は無視され、Service はデフォルトの方法で更新されています。多くの場合、Load Balancer が複数の Service で 共有 されていることが原因です | 対応は不要です。この機能は 1 つの Service 専用の Load Balancer にのみ適用されます |
LoadBalancerBatchUpdateFallback | region または Load Balancer が、まだ一括更新に対応していません。システムはその回の更新を 自動的に pool ごとの更新に切り替え、後で再試行します | 対応は不要です。backend は通常どおり更新されます |
LoadBalancerBatchUpdateEmptyMembers | backend にする node の IP アドレスを特定できませんでした。接続断を避けるため、システムは現在の backend を そのまま維持 し、自動的に再試行します | node の状態を確認してください(kubectl get nodes -o wide)。解消しない場合はサポートにお問い合わせください |
LoadBalancerBatchUpdateFailed | 新しい設定の適用中に Load Balancer でエラーが発生しました。システムが自動的に再試行します | event が繰り返し発生する場合は、Service 名と namespace を添えて FPT Cloud サポートにお問い合わせください |
制限事項
- この機能が変えるのは、既存の Load Balancer における backend の更新方法 だけです。listener、ヘルスチェック、Load Balancer の IP は変わりません。
- 最終的な結果はデフォルトの更新と同じで、backend リストも属性も同一です。
- annotation を付けていない Service はこれまでどおり動作し、影響を受けません。
- 複数の Service で共有している Load Balancer(annotation
loadbalancer.fptcloud.com/load-balancer-id)では、この機能は使用できません。 - Service の新規作成時は、もともとすべての backend を 1 回で作成するため、annotation が効果を持つのはその後の更新からです。
よくある質問
annotation を有効にするとアプリケーションが中断しますか? いいえ。既存の backend はそのまま残り、変更のあった node だけが追加または削除されます。
annotation の値を打ち間違えた場合はどうなりますか?
"true" 以外の値はすべて無効として扱われます。Service はデフォルトの方法で更新を続けるため、backend を失うリスクはありません。
使用している region がまだ対応していない場合は? システムが自動的にデフォルトの方法に切り替えるため、backend は引き続き更新されます。annotation はそのまま残しておけば、region が対応した時点で自動的に有効になります。
有効にするにはどの権限が必要ですか?
namespace 内の Service に対する update または patch 権限です。通常の Service 編集と同じです。