このエントリ2020/02/20現在の情報に基づくものです。将来の機能追加・変更に伴い、記載内容との乖離が発生する可能性があります(2020/03/13にVirtual Network NATが一般提供されたことを反映)。
このエントリの目的
Azure Kubernetes Service (以下、AKS) でingress trafficを受けるPublic IPを制限する方法にはIngress Controllerを使う。その逆、egress trafficは何も設定していなければ、ランダムなIPを使って外部にアクセスする。この場合、外部APIでIPフィルタリングしたい場合に不都合が生じるため、特定のPublic IPからのegress trafficに制限したいという要求がある。その要求を満たす方法を調査した。
AKSでの実現方法
2020/03/13時点でVirtual Network NATが一般提供されたので、以下の3方法が考えられる。
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 を使う
エグレスのために独自のパブリック 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
通常ロードバランサーはバックエンドに複数のサービスがあって…というイメージだが、この例ではバックエンドが外部インターネットへのアクセスと考えるとわかりやすいかもしれない。
3. Virtual Network NATを使う
Internetへのアウトバウンド接続をNAT Gatewayで束ねることができる。サブネットごとにNAT Gatewayを作成できる。詳細は以下。
Virtual Network NAT
https://logico-jp.io/2020/02/20/virtual-network-nat/
その他
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