AddressPool¶
AddressPoolは、外部広報に利用できる外部アドレス範囲をまとめるリソースです。 ExternalNetworkやBGPAdvertisementから参照され、それらのリソースが払い出し可能なアドレスの源になります。
spec.advertiseModeはこのAddressPoolがどの方式で外部へ広報されるかを指定します。
bgp:BGPで経路広報されるAddressPoolarp:ARPで到達性が広報されるAddressPool
spec.advertiseModeは作成時に必須で、変更はできません。
spec.addressesはこのAddressPoolが保持するアドレス範囲の集合です。 重複は許されず、少なくとも1つの要素が必要で、要素を後から削除することはできません(追加のみ許容)。
spec.addressesの各要素の形式はspec.advertiseModeによって異なります。
spec.advertiseMode=bgpの場合、各要素はIPv4 CIDR(プレフィックス長は/8から/32の範囲)で指定します。spec.advertiseMode=arpの場合、各要素はstart-end形式のIPv4アドレス範囲で指定します。
start-endは開始アドレスと終了アドレスをハイフンでつないだ形式で、10.225.32.240-10.225.32.250のように書きます。 両端を含みます。開始アドレスが終了アドレスより後になっている場合や、CIDRを書いた場合は拒否されます。
1つのアドレスを持てるAddressPoolは1つだけです。 spec.addressesのどれかが他のAddressPoolのアドレスと1つでも重なると、作成も更新もwebhookに拒否されます。 spec.advertiseModeが違うAddressPoolどうしも比べるので、bgpのCIDRとarpのstart-endが重なった場合も拒否されます。 エラーには、重なった相手のAddressPool名とその要素、重なったアドレスの範囲が出ます。
重なりを確認するのはwebhookだけで、controllerは確認しません。 この検証が入る前のバージョンで作られた重なりは、そのまま残ります。重なっているAddressPoolを次に更新しようとしたときに、はじめて拒否されます。 spec.addressesの要素は削除できないので、重なりをなくすにはどちらかのAddressPoolを作り直してください。
AddressPoolがExternalNetworkまたはBGPAdvertisementから参照されている間は削除できません。 削除するには先に参照側のリソースから外すか、参照側のリソースを削除してください。
払い出しの実体¶
AddressPoolを作成すると、controllerがaddr-<AddressPool名>という名前のAllocationPoolを自動的に作成します。 ElasticIPやServiceLoadBalancerが実際にアドレスを確保するのはこのAllocationPoolに対してで、AddressPool自体には使用中のアドレスは記録されません。
spec.advertiseModeによって、AllocationPoolに書き込まれるフィールドが変わります。
bgpの場合、spec.addressesのCIDRがそのままspec.ip.cidrsに入ります。各CIDRのネットワークアドレスとブロードキャストアドレスは払い出しの対象外です。arpの場合、start-endを分解した{start, end}がspec.ip.rangesに入ります。範囲内のアドレスはすべて払い出しの対象です。
advertiseMode=arpのAddressPoolの範囲に、NodeのInternalIPを含めないでください。 そのアドレスがElasticIPなどに払い出されると、ARPAdvertisementの作成がwebhookに拒否され、そのリソースは利用可能になりません。