このエントリ2021/03/31現在の情報に基づくものです。将来の機能追加・変更に伴い、記載内容との乖離が発生する可能性があります(2021/03/31にノードプールを一意のSubnetに分離する方法と、ノードプール中のノードにPublic IPを割り当てる方法を追加)。
このエントリの目的
Azure Kubernetes Service (以下、AKS) でingress trafficを受けるPublic IPを制限する方法にはIngress Controllerを使う。その逆、egress trafficは何も設定していなければ、ランダムなIPを使って外部にアクセスする。この場合、外部APIでIPフィルタリングしたい場合に不都合が生じるため、特定のPublic IPからのegress trafficに制限したいという要求がある。その要求を満たす方法を調査した。
AKSでの実現方法
2021/03/31時点では以下の4方法が考えられる。
1. Azure Firewallを使う
Azure Kubernetes Service (AKS) でクラスター ノードに対するエグレス トラフィックを制御する / Control egress traffic for cluster nodes in Azure Kubernetes Service (AKS)
https://docs.microsoft.com/azure/aks/limit-egress-traffic
これはインターネットアクセスのためにプロキシを配置しているオンプレミス環境から、インターネットにアクセスするイメージと同じ。FirewallのSubnetに対してUDRを振り向けることで実現する。以下は(Load Balancerを挟んではいるが)イメージ図。
AKSの内部サブネットでのトラフィックはブロックしないように注意しなければならない。
ネットワーク セキュリティ グループ (NSGs) とファイアウォールを使用して内部サブネット トラフィックをブロックすることは、サポートされていません。 クラスター内のトラフィックを制御およびブロックするには、ネットワーク ポリシーを使用します。
https://docs.microsoft.com/azure/aks/limit-egress-traffic
2. Standard Load Balancer もしくは Basic Load Balancer を使う
通常ロードバランサーはバックエンドに複数のサービスがあって…というイメージだが、この例ではバックエンドからのアウトバウンド送信ルールを定義する、というもの。
エグレスのために独自のパブリック IP またはプレフィックスを指定する / Provide your own public IPs or prefixes for egress
https://docs.microsoft.com/azure/aks/load-balancer-standard#provide-your-own-public-ips-or-prefixes-for-egress
Azure Kubernetes Service (AKS) で Basic SKU ロード バランサーと共に、エグレス トラフィックに静的パブリック IP アドレスを使用する / Use a static public IP address for egress traffic with a Basic SKU load balancer in Azure Kubernetes Service (AKS)
https://docs.microsoft.com/azure/aks/egress
3. Virtual Network NATを使う
ノードプールが接続するSubnetにNAT Gatewayを割り当てることで実現する。この機能を使うと、Podからのegressは、NAT GatewayのIPアドレス(もしくはIPプレフィックス)をSource IPとして利用する(Load Balancerサービスを作成している場合はLoad Balancerサービスに割り付けたIPアドレスを使う)。
Virtual Network NATについては以下にも記載している。
Virtual Network NAT
https://logico-jp.io/2020/02/20/virtual-network-nat/
通常、ノードプール(VMSS)が接続しているSubnetは固定されているが、ノードプールごとに一意のSubnetに割り付けることができる(2021/03/31現在プレビュー)。この機能とNAT Gatewayを使えば、PodからのegressはノードプールのSubnetに紐付けられたNAT Gatewayの持つIPアドレス(もしくはIPプレフィックス) からのアクセスにできる 。ノードプールごとにIPアドレスがつくので、ノードプールを分けて管理する必要があれば、この方法を使うのもありかもしれない。
一意なサブネットを持つノード プールを追加する (プレビュー) / Add a node pool with a unique subnet (preview)
https://docs.microsoft.com/azure/aks/use-multiple-node-pools#add-a-node-pool-with-a-unique-subnet-preview
4. ノードプールのノードごとにPublic IPを割り当てる
ノードプールは通常VMSSであるが、VMSSを構成するノード一つ一つに Public IPを割り当てることができる(2021/03/31現在プレビュー)。 この機能を使うと、Podからのegressは、Podが稼働するノードのPublic IPをSource IPとして利用する(Load Balancerサービスを作成している場合はLoad Balancerサービスに割り付けたIPアドレスを使う)。
ノード プールのノードごとにパブリック IP を割り当てる (プレビュー) / Assign a public IP per node for your node pools
https://docs.microsoft.com/azure/aks/use-multiple-node-pools#assign-a-public-ip-per-node-for-your-node-pools-preview
その他
Standard Load BalancerとFirewallを組み合わせる場合には、以下のドキュメントに記載がある。
Azure Firewall と Azure Standard Load Balancer を統合する / Integrate Azure Firewall with Azure Standard Load Balancer
https://docs.microsoft.com/azure/firewall/integrate-lb
以下のドキュメントではサービス単位でstatic public IPを割り当てる仕組みを説明している。
Azure Kubernetes Service (AKS) でエグレス トラフィックに静的パブリック IP アドレスを使用する / Use a static public IP address for egress traffic in Azure Kubernetes Service (AKS)
https://docs.microsoft.com/azure/aks/egress