0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Azure】Load Balancer の「Ports per instance」とは?SNAT ポートとスケールアウトの関係を理解する

0
Posted at

【Azure】Load Balancer の「Ports per instance」とは?SNAT ポートとスケールアウトの関係を理解する

Azure Standard Load Balancer の Outbound Rule を設定していると、「Ports per instance」 という設定項目が登場します。

この値は単純に「大きければ大きいほど安心」というものではありません。

Ports per instance を大きくすると、1 台のバックエンド VM が利用できる SNAT ポートを増やせます。一方で、Load Balancer のフロントエンド IP が提供できる SNAT ポートには上限があるため、将来バックエンド VM を何台まで増やすのかも合わせて考える必要があります。

今回は、Ports per instance の意味と、SNAT ポート枯渇、スケールアウトとの関係を分かりやすく整理します。

1. Ports per instance とは?

一言でいうと、

「Load Balancer のバックエンド インスタンス 1 台あたりに割り当てる Outbound SNAT ポート数」

です。

ここでいう「instance」とは、Load Balancer 自体のインスタンスではありません。

Load Balancer の Backend Pool に存在する VM や Virtual Machine Scale Sets のインスタンスを指します。

たとえば、

  • Backend VM:4 台
  • Ports per instance:2,000

という設定であれば、バックエンド インスタンスごとに 2,000 個の SNAT ポートを割り当てる考え方になります。

2. そもそも SNAT ポートは何に使うのか?

たとえば Azure VM からインターネット上の API サーバーへ接続するとします。

VM:

10.0.0.4:50001

が、そのままインターネットへ通信するわけではありません。

Load Balancer の Outbound Rule を使用する構成では、Load Balancer のフロントエンド Public IP と SNAT ポートを利用して、送信元が変換されます。

イメージとしては、

10.0.0.4:50001

↓

20.x.x.x:12345

↓

Internet

となります。

この変換に使われる 12345 のようなポートが SNAT ポートです。

つまり、VM が大量の Outbound Connection を作成する場合、それだけ多くの SNAT ポートが必要になる可能性があります。

3. Ports per instance を増やすと何が起こる?

たとえば現在、

Ports per instance = 1,024

だったとします。

1 台の VM から非常に多数の Outbound Connection が作成される環境では、割り当てられた SNAT ポートを使い切り、SNAT port exhaustion が問題になる可能性があります。

そこで、

1,024 → 4,096

のように Ports per instance を増やすことで、そのバックエンド インスタンスが利用可能な SNAT ポート数を増やせます。

Microsoft の公開情報でも、SNAT exhaustion が発生する場合には Outbound Rule を使用して SNAT ポート割り当てを調整できることが説明されています。

4. では、Ports per instance は大きいほど良い?

ここが重要です。

必ずしも大きければ良いわけではありません。

Load Balancer のフロントエンド Public IP が提供できる SNAT ポートにも上限があります。

1 つの Public IP は、SNAT 用として最大約 64,000 の ephemeral ports を提供します。

そのため、Ports per instance を設計する際には、

「1 台の VM に何ポート必要か」

だけではなく、

「その Backend Pool が将来的に何台まで増える可能性があるか」

も考える必要があります。

5. 具体例で考えてみる

たとえば、

  • Frontend Public IP:1 個
  • Ports per instance:10,000
  • Backend VM:2 台

という環境を考えます。

必要となる割り当て量は、

2 × 10,000 = 20,000 ports

です。

この規模では十分収まっています。

ところが、将来的に Backend VM を 8 台へ増やしたいとします。

単純計算では、

8 × 10,000 = 80,000 ports

となります。

1 個の Frontend Public IP が提供可能な SNAT ポート数を超えるため、この Ports per instance の設定のままでは 8 台分に必要な SNAT ポートを確保できません。

ここが Ports per instance を大きく設定する際に注意すべきポイントです。

つまり問題は、

「大きい値を設定すると通信障害が発生する」

というよりも、

「1 台あたりの割り当てを大きくすると、その Public IP で収容可能なバックエンド インスタンス数が少なくなる」

と理解すると分かりやすいです。

6. Ports per instance を考える基本式

手動で SNAT ポート数を指定する場合には、概念的には次の関係を意識すると分かりやすいでしょう。

Ports per instance × Backend instances

が、

Frontend IP が提供可能な SNAT port capacity

に収まる必要があります。

たとえば、

2,000 ports × 8 VMs = 16,000 ports

であれば、1 個の Public IP が提供する SNAT ポート容量に十分余裕があります。

一方、

10,000 ports × 8 VMs = 80,000 ports

では、1 個の Public IP だけでは不足します。

7. では、1 台の VM から大量の通信を出したい場合は?

今回のように、

「VM 台数はそれほど増えないが、1 instance から大量の Outbound Connection が発生する」

というシステムでは、Ports per instance を増やすこと自体は合理的です。

たとえば、

  • 最大 VM 台数:4 台
  • Ports per instance:8,000

であれば、

4 × 8,000 = 32,000

となります。

最大 VM 台数を把握したうえで Ports per instance を設定しているのであれば、単純に「8,000 は大きすぎる」と判断する必要はありません。

重要なのは、

現在の VM 台数ではなく、将来想定している最大 VM 台数との組み合わせで考えること

です。

8. もっと多くの SNAT ポートが必要なら?

方法は大きく 2 つあります。

方法1:Frontend Public IP を増やす

Outbound Rule に複数の Frontend Public IP を使用することで、利用可能な SNAT ポート容量を増やせます。

Public IP が追加されれば、それぞれの IP が SNAT ポート容量を提供します。

方法2:Azure NAT Gateway を利用する

大量の Outbound Connection が発生するシステムでは、Azure NAT Gateway も有力な選択肢です。

Load Balancer の Outbound SNAT では、バックエンド インスタンスごとに SNAT ポートを割り当てる方式ですが、NAT Gateway は SNAT ポートをより動的に利用できます。

そのため、

「VM ごとの Outbound Connection 数に大きな偏りがある」

環境では NAT Gateway の方が扱いやすい場合があります。

9. 設計時に確認しておきたいポイント

Ports per instance を変更する前に、少なくとも次の 3 点を確認しておくとよいでしょう。

① 1 VM あたり何個の SNAT ポートを使用しているか

Azure Monitor の SNAT 関連メトリックを利用して、実際の使用状況を確認します。

② 最大何台までスケールアウトするか

現在 2 台だからといって、2 台だけを前提に Ports per instance を決めるのは危険です。

Virtual Machine Scale Sets などを利用している場合には、最大インスタンス数も確認します。

③ VM ごとの通信量に偏りがあるか

たとえば、

  • VM-A:500 connections
  • VM-B:8,000 connections

のように Outbound 通信に大きな偏りがある場合、固定的にポートを割り当てる Load Balancer より NAT Gateway の方が適している可能性があります。

まとめ

Azure Load Balancer の Ports per instance は、

「バックエンド インスタンス 1 台あたりに割り当てる Outbound SNAT ポート数」

です。

覚えておきたいポイントは次のとおりです。

  1. instance は Backend Pool の VM / VMSS instance を意味する
  2. Ports per instance を増やせば、1 台の VM が利用可能な SNAT ポートを増やせる
  3. 一方で、Frontend Public IP が提供できる SNAT ポート容量には上限がある
  4. Ports per instance を大きくすると、その Public IP で収容可能な最大インスタンス数は小さくなる
  5. 現在の VM 台数ではなく、将来の最大スケールアウト数を考慮して設計する
  6. 大量の Outbound Connection が必要なら Azure NAT Gateway も検討する

Ports per instance は、

「大きければ安心」でも「小さければ安全」でもありません。

1 VM あたりに必要な Outbound Connection 数と、最大 Backend Instance 数のバランスを取って設計することが重要です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?