34.5. IP アドレスプールのアドバタイズメントについて
IP アドレスがレイヤー 2 プロトコル、BGP プロトコル、またはその両方でアドバタイズされるように MetalLB を設定できます。レイヤー 2 では、MetalLB ではフォールトトレラントな外部 IP アドレスを使用できます。BGP を使用すると、MetalLB で外部 IP アドレスに対するフォールトトレランス機能および負荷分散が提供されます。
MetalLB は、同じ IP アドレスのセットに対して L2 と BGP を使用したアドバタイズをサポートします。
MetalLB は、ネットワーク上のノードのサブセットに対して、特定の BGP ピアにアドレスプールを効果的に割り当てる柔軟性を提供します。これにより、たとえばノードの分離やネットワークのセグメンテーションを容易にするなど、より複雑な設定が可能になります。
34.5.1. BGPAdvertisement カスタムリソースについて
BGPAdvertisements
オブジェクトのフィールドは、次の表に定義されています。
フィールド | 型 | 説明 |
---|---|---|
|
| BGP アドバタイズメントの名前を指定します。 |
|
| BGP アドバタイズメントの namespace を指定します。MetalLB Operator が使用するものと同じ namespace を指定します。 |
|
|
オプション: 32 ビット CIDR マスクに含めるビット数を指定します。マスクが複数のサービス IP アドレスのルートに適用され、speaker は集約されたルートをアドバタイズし、speaker が BGP ピアにアドバタイズするルートを集約します。たとえば、集約の長さが |
|
|
オプション: 128 ビット CIDR マスクに含めるビット数を指定します。たとえば、集約の長さが |
|
| オプション: 1 つ以上の BGP コミュニティーを指定します。各コミュニティーは、16 ビット値 2 つをコロン文字で区切って指定します。一般的なコミュニティーは、16 ビット値として指定する必要があります。
|
|
| オプション: このアドバタイズメントのローカル設定を指定します。この BGP 属性は、Autonomous System 内の BGP セッションに適用されます。 |
|
|
オプション: 名前で選択された、このアドバタイズメントでアドバタイズする |
|
|
オプション: このアドバタイズメントでアドバタイズされる |
|
|
オプション: |
|
| オプション: ピアは、選択したプールの IP をアドバタイズする BGP ピアを制限します。空の場合、ロードバランサー IP は設定されているすべての BGP ピアにアナウンスされます。 |
34.5.2. BGP アドバタイズメントと基本的なユースケースを使用する MetalLB の設定
MetalLB を次のとおり設定し、ピア BGP ルーターが、MetalLB がサービスに割り当てるロードバランサー IP アドレスごとに、203.0.113.200/32
ルート 1 つ、fc00:f853:ccd:e799::1/128
ルート 1 つを受信するようにします。localPref
および communities
フィールドが指定されていないため、ルートは localPref
をゼロに設定して BGP コミュニティーなしでアドバタイズされます。
34.5.2.1. 例: BGP を使用する基本的なアドレスプール設定のアドバタイズメント
IPAddressPool
が BGP プロトコルでアドバタイズされるように、MetalLB を次のように設定します。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてログインしている。
手順
IP アドレスプールを作成します。
以下の例のような内容で、
ipaddresspool.yaml
などのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-bgp-basic spec: addresses: - 203.0.113.200/30 - fc00:f853:ccd:e799::/124
IP アドレスプールの設定を適用します。
$ oc apply -f ipaddresspool.yaml
BGP アドバタイズメントを作成します。
以下の例のような内容で、
bgpadvertisement.yaml
などのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: bgpadvertisement-basic namespace: metallb-system spec: ipAddressPools: - doc-example-bgp-basic
設定を適用します。
$ oc apply -f bgpadvertisement.yaml
34.5.3. BGP アドバタイズメントと高度なユースケースを使用する MetalLB の設定
MetalLB を次のように設定し、MetalLB が 203.0.113.200
と 203.0.113.203
、fc00:f853:ccd:e799::0
と fc00:f853:ccd:e799::f
の範囲の IP アドレスを割り当てるようにします。
MetalLB が 203.0.113.200
の IP アドレスをサービスに割り当てる例を見ていき、これら 2 つの BGP アドバタイズメントを説明します。この IP アドレスを例にとると、speaker は 2 つのルートを BGP ピアにアドバタイズします。
-
localPref
が100
に、コミュニティーがNO_ADVERTISE
コミュニティーの数値に設定されている203.0.113.200/32
。この仕様は、ピアルーターにこのルートを使用できることを指定していますが、このルートに関する情報を BGP ピアに伝播しないようにします。 -
MetalLB で割り当てられたロードバランサーの IP アドレスを 1 つのルートに集約する
203.0.113.200/30
。MetalLB は、コミュニティー属性が8000:800
に設定された BGP ピアに集約ルートをアドバタイズします。BGP ピアは、203.0.113.200/30
ルートを他の BGP ピアに伝播します。トラフィックが speaker のあるノードにルーティングされる場合には、203.0.113.200/32
ルートを使用して、トラフィックがクラスターに転送され、サービスに関連付けられている Pod に転送されます。
さらにサービスを追加し、MetalLB でプールからより多くのロードバランサー IP アドレスを割り当てると、ピアルーターはサービスごとにローカルルート 203.0.113.20x/32
を 1 つと、203.0.113.200/30
集約ルートを受け取ります。追加する各サービスは/30
ルートを生成しますが、MetalLB は、ピアルーターと通信する前に、ルートの重複を排除して 1 つの BGP アドバタイズにします。
34.5.3.1. 例: BGP を使用する高度なアドレスプール設定のアドバタイズメント
IPAddressPool
が BGP プロトコルでアドバタイズされるように、MetalLB を次のように設定します。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてログインしている。
手順
IP アドレスプールを作成します。
以下の例のような内容で、
ipaddresspool.yaml
などのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-bgp-adv labels: zone: east spec: addresses: - 203.0.113.200/30 - fc00:f853:ccd:e799::/124 autoAssign: false
IP アドレスプールの設定を適用します。
$ oc apply -f ipaddresspool.yaml
BGP アドバタイズメントを作成します。
以下の例のような内容で、
bgpadvertisement1.yaml
などのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: bgpadvertisement-adv-1 namespace: metallb-system spec: ipAddressPools: - doc-example-bgp-adv communities: - 65535:65282 aggregationLength: 32 localPref: 100
設定を適用します。
$ oc apply -f bgpadvertisement1.yaml
以下の例のような内容で、
bgpadvertisement2.yaml
などのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: bgpadvertisement-adv-2 namespace: metallb-system spec: ipAddressPools: - doc-example-bgp-adv communities: - 8000:800 aggregationLength: 30 aggregationLengthV6: 124
設定を適用します。
$ oc apply -f bgpadvertisement2.yaml
34.5.4. ノードのサブセットからの IP アドレスプールのアドバタイズ
特定のノードセットのみから IP アドレスプールから IP アドレスをアドバタイズするには、BGPAdvertisement カスタムリソースで .spec.nodeSelector
仕様を使用します。この仕様は、IP アドレスのプールをクラスター内の一連のノードに関連付けます。これは、クラスター内の異なるサブネット上にノードがあり、特定のサブネット (パブリックに面したサブネットのみなど) のアドレスプールから IP アドレスをアドバタイズしたい場合に役立ちます。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてログインしている。
手順
カスタムリソースを使用して IP アドレスプールを作成します。
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: pool1 spec: addresses: - 4.4.4.100-4.4.4.200 - 2001:100:4::200-2001:100:4::400
BGPAdvertisement カスタムリソースで
.spec.nodeSelector
値を定義することにより、pool1
からの IP アドレスがアドバタイズするクラスター内のノードを制御します。apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: example spec: ipAddressPools: - pool1 nodeSelector: - matchLabels: kubernetes.io/hostname: NodeA - matchLabels: kubernetes.io/hostname: NodeB
この例では、pool1 の IP アドレスは NodeA
と NodeB
からの み
アドバタイズします。
34.5.5. L2Advertisement カスタムリソースについて
l2Advertisements
オブジェクトのフィールドは、次の表に定義されています。
フィールド | 型 | 説明 |
---|---|---|
|
| L2 アドバタイズメントの名前を指定します。 |
|
| L2 アドバタイズメントの namespace を指定します。MetalLB Operator が使用するものと同じ namespace を指定します。 |
|
|
オプション: 名前で選択された、このアドバタイズメントでアドバタイズする |
|
|
オプション: このアドバタイズメントでアドバタイズされる |
|
|
オプション: 重要 ネクストホップとしてアナウンスするノードの制限は、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビューの機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行いフィードバックを提供していただくことを目的としています。 Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。 |
|
|
オプション: ロードバランサー IP をアナウンスするために使用される |
34.5.6. L2 アドバタイズメントを使用した MetalLB の設定
IPAddressPool
が L2 プロトコルでアドバタイズされるように、MetalLB を次のように設定します。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてログインしている。
手順
IP アドレスプールを作成します。
以下の例のような内容で、
ipaddresspool.yaml
などのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-l2 spec: addresses: - 4.4.4.0/24 autoAssign: false
IP アドレスプールの設定を適用します。
$ oc apply -f ipaddresspool.yaml
L2 アドバタイズメントを作成します。
以下の例のような内容で、
l2advertisement.yaml
などのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: l2advertisement namespace: metallb-system spec: ipAddressPools: - doc-example-l2
設定を適用します。
$ oc apply -f l2advertisement.yaml
34.5.7. L2 アドバタイズメントとラベルを使用した MetalLB の設定
BGPAdvertisement
および L2Advertisement
カスタムリソース定義の ipAddressPoolSelectors
フィールドは、名前自体ではなく、IPAddressPool
に割り当てられたラベルに基づいて IPAddressPool
をアドバタイズメントに関連付けるために使用されます。
この例は、ipAddressPoolSelectors
フィールドを設定することにより、IPAddressPool
が L2 プロトコルでアドバタイズされるように MetalLB を設定する方法を示しています。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてログインしている。
手順
IP アドレスプールを作成します。
以下の例のような内容で、
ipaddresspool.yaml
などのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-l2-label labels: zone: east spec: addresses: - 172.31.249.87/32
IP アドレスプールの設定を適用します。
$ oc apply -f ipaddresspool.yaml
ipAddressPoolSelectors
を使用して IP をアドバタイズする L2 アドバタイズメントを作成します。以下の例のような内容で、
l2advertisement.yaml
などのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: l2advertisement-label namespace: metallb-system spec: ipAddressPoolSelectors: - matchExpressions: - key: zone operator: In values: - east
設定を適用します。
$ oc apply -f l2advertisement.yaml
34.5.8. 選択したインターフェイスの L2 アドバタイズを使用した MetalLB の設定
デフォルトでは、サービスに割り当てられた IP アドレスプールの IP アドレスが、すべてのネットワークインターフェイスからアドバタイズされます。L2Advertisement
カスタムリソース定義の interfaces
フィールドは、IP アドレスプールをアドバタイズするネットワークインターフェイスを制限するために使用されます。
この例では、すべてのノードの interfaces
フィールドにリストされているネットワークインターフェイスからのみ IP アドレスプールがアドバタイズされるように、MetalLB を設定する方法を示します。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてログインしている。
手順
IP アドレスプールを作成します。
ipaddresspool.yaml
などのファイルを作成し、次の例のように設定の詳細を入力します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-l2 spec: addresses: - 4.4.4.0/24 autoAssign: false
次の例のように、IP アドレスプールの設定を適用します。
$ oc apply -f ipaddresspool.yaml
interfaces
セレクターを使用して IP をアドバタイズする L2 アドバタイズメントを作成します。l2advertisement.yaml
などの YAML ファイルを作成し、次の例のように設定の詳細を入力します。apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: l2advertisement namespace: metallb-system spec: ipAddressPools: - doc-example-l2 interfaces: - interfaceA - interfaceB
次の例のように、広告の設定を適用します。
$ oc apply -f l2advertisement.yaml
インターフェイスセレクターは、MetalLB が L2 を使用して特定の IP をアナウンスするノードを選択する方法には影響しません。ノードが選択されたインターフェイスを持たない場合、選択されたノードはサービスをアナウンスしません。
34.5.9. セカンダリーネットワークを使用した MetalLB の設定
OpenShift Container Platform 4.14 以降、デフォルトのネットワーク動作では、ネットワークインターフェイス間での IP パケットの転送は許可されません。したがって、MetalLB がセカンダリーインターフェイス上に設定されている場合は、必要なインターフェイスに対してのみ IP 転送を有効にするマシン設定を追加する必要があります。
4.13 からアップグレードされた OpenShift Container Platform クラスターは、アップグレード中にグローバル IP 転送を有効にするグローバルパラメーターが設定されるため、影響を受けません。
セカンダリーインターフェイスの IP 転送を有効にするには、次の 2 つのオプションがあります。
- すべてのインターフェイスで IP 転送を有効にします。
特定のインターフェイスの IP 転送を有効にします。
注記特定のインターフェイスに対して IP 転送を有効にすると、よりきめ細かい制御が可能になりますが、すべてのインターフェイスに対して有効にすると、グローバル設定が適用されます。
手順
MachineConfig
CR を作成して適用することで、bridge-net
などの特定のセカンダリーインターフェイスの転送を有効にします。-
Bridge-net
という名前の指定されたセカンダリーインターフェイスの IP 転送を有効にするには、MachineConfig
CR を作成します。 以下の YAML を
enable-ip-forward.yaml
ファイルに保存します。apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: <node_role> 1 name: 81-enable-global-forwarding spec: config: ignition: version: 3.2.0 storage: files: - contents: source: data:text/plain;charset=utf-8;base64,`echo -e "net.ipv4.conf.bridge-net.forwarding = 1\nnet.ipv6.conf.bridge-net.forwarding = 1\nnet.ipv4.conf.bridge-net.rp_filter = 0\nnet.ipv6.conf.bridge-net.rp_filter = 0" | base64 -w0` verification: {} filesystem: root mode: 644 path: /etc/sysctl.d/enable-global-forwarding.conf osImageURL: ""
- 1
- IP 転送を有効にするノードロール (
worker
など)
以下のコマンドを実行して設定を適用します。
$ oc apply -f enable-ip-forward.yaml
-
または、次のコマンドを実行して、IP 転送をグローバルに有効にすることもできます。
$ oc patch network.operator cluster -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipForwarding": "Global"}}}}}