第4章 MetalLB を使用した負荷分散
4.1. MetalLB アドレスプールの設定 リンクのコピーリンクがクリップボードにコピーされました!
ロードバランサーサービスに割り当てられた IP アドレスを割り当て、管理するには、MetalLB アドレスプールのカスタムリソースを設定します。これらのプールを定義することで、アプリケーションのワークロードが指定されたネットワーク範囲を通じて常にアクセス可能となり、外部からのアクセスが安定的に行われることが保証されます。
例で使用されている名前空間では 、metallb-system が 名前空間として示されています。
MetalLB Operator のインストール方法の詳細は、MetalLB および MetalLB Operator について を参照してください。
4.1.1. IPAddressPool カスタムリソースについて リンクのコピーリンクがクリップボードにコピーされました!
ロードバランサーサービスで使用可能な IP アドレス範囲を定義するには、MetalLB IPAddressPool カスタムリソース (CR) のプロパティーを設定します。
以下の表は、IPAddressPool CR のパラメーターの詳細を示しています。
| パラメーター | 型 | 説明 |
|---|---|---|
|
|
|
アドレスプールの名前を指定します。サービスを追加する場合は、 |
|
|
| アドレスプールの namespace を指定します。MetalLB Operator が使用するものと同じ namespace を指定します。 |
|
|
|
オプション: |
|
|
| MetalLB Operator がサービスに割り当てる IP アドレスのリストを指定します。1 つのプール内で複数の範囲を指定できます。これらの範囲はすべて同じ設定を共有します。各範囲は、Classless Inter-Domain Routing (CIDR) 表記で指定するか、開始 IP アドレスと終了 IP アドレスをハイフンで区切って指定します。 |
|
|
|
オプション:MetalLBOperator がこのプールから IP アドレスを自動的に割り当てるかどうかを指定します。 注記
IP アドレスプール設定の場合、アドレスパラメーターには、利用可能で他のネットワークデバイス (特にゲートウェイアドレス) で使用されていない IP アドレスのみを指定するようにしてください。これにより、 |
|
|
|
オプション: このパラメーターを有効に設定すると、末尾が |
spec.serviceAllocation 仕様を設定することにより、IPAddressPool からサービスおよび namespace に IP アドレスを割り当てることができます。
| パラメーター | 型 | 説明 |
|---|---|---|
|
|
| オプション: 複数の IP アドレスプールがサービスまたは namespace に一致する場合の IP アドレスプール間の優先度を定義します。数字が小さいほど優先度が高いことを示します。 |
|
|
| オプション: IP アドレスプール内の IP アドレスに割り当てることができる namespace のリストを指定します。 |
|
|
| オプション: リスト形式のラベルセレクターを使用して、IP アドレスプールから IP アドレスに割り当てることができる namespace ラベルを指定します。 |
|
|
| オプション: リスト形式のラベルセレクターを使用して、アドレスプールから IP アドレスに割り当てることができるサービスラベルを指定します。 |
4.1.2. アドレスプールの設定 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションワークロードへの外部アクセスを正確に管理するには、クラスター用に MetalLB アドレスプールを設定してください。これらのプールを定義することで、ロードバランサーサービスに割り当てられる特定の IP アドレス範囲を制御し、一貫性のあるネットワークルーティングを実現できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
以下の例のような内容で、
ipaddresspool.yamlなどのファイルを作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example labels: zone: east spec: addresses: - 203.0.113.1-203.0.113.10 - 203.0.113.65-203.0.113.75 # ...ここでは、以下のようになります。
labels-
IPAddressPoolに割り当てられたラベルは、BGPAdvertisementCRD 内のipAddressPoolSelectorsによって参照され、IPAddressPool をアドバタイズメントに関連付けることができます。
次のコマンドを入力して、IP アドレスプールの設定を適用します。
$ oc apply -f ipaddresspool.yaml
検証
次のコマンドを入力して、アドレスプールを表示します。
$ oc describe -n metallb-system IPAddressPool doc-example出力例
Name: doc-example Namespace: metallb-system Labels: zone=east Annotations: <none> API Version: metallb.io/v1beta1 Kind: IPAddressPool Metadata: ... Spec: Addresses: 203.0.113.1-203.0.113.10 203.0.113.65-203.0.113.75 Auto Assign: true Events: <none>-
doc-exampleなどのアドレスプール名と IP アドレス範囲が出力に存在することを確認します。
4.1.3. VLAN の MetalLB アドレスプールの設定 リンクのコピーリンクがクリップボードにコピーされました!
特定の VLAN を介した外部アクセスを正確に管理するには、クラスター用に MetalLB アドレスプールを設定してください。これらのプールを定義することで、ロードバランサーサービスは、指定されたネットワーク範囲から承認された IP アドレスを取得し、安全かつ一貫性のあるルーティングを実現できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - 別の VLAN を設定する。
-
cluster-admin権限を持つユーザーとしてログインしている。
手順
次の例のようなファイル (
ipaddresspool-vlan.yamlなど) を作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb-system name: doc-example-vlan labels: zone: east spec: addresses: - 192.168.100.1-192.168.100.254 # ...ここでは、以下のようになります。
ラベルゾーン-
IPAddressPoolに割り当てられたこのラベルは、BGPAdvertisementCRD のipAddressPoolSelectorsによって参照され、IPAddressPoolをアドバタイズメントに関連付けることができます。 spec.addresses- この IP 範囲は、ネットワーク上の VLAN に割り当てられたサブネットと一致する必要があります。レイヤー 2 (L2) モードをサポートするには、IP アドレス範囲がクラスターノードと同じサブネット内にある必要があります。
IP アドレスプールの設定を適用します。
$ oc apply -f ipaddresspool-vlan.yamlこの設定が VLAN に適用されることを確認するには、
specgatewayConfig.ipForwarding をGlobalに設定する必要があります。次のコマンドを実行して、ネットワーク設定カスタムリソース (CR) を編集します。
$ oc edit network.operator.openshift/clusterspec.defaultNetwork.ovnKubernetesConfigセクションを更新して、gatewayConfig.ipForwardingをGlobalに設定します。次の例はこの設定を示しています。apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster spec: clusterNetwork: - cidr: 10.128.0.0/14 hostPrefix: 23 defaultNetwork: type: OVNKubernetes ovnKubernetesConfig: gatewayConfig: ipForwarding: Global # ...
4.1.4. アドレスプールの設定例 リンクのコピーリンクがクリップボードにコピーされました!
クラスターサービスに IP アドレス範囲を正確に割り当てるには、Classless Inter-Domain Routing (CIDR) 表記またはハイフン付き境界を使用して MetalLB アドレスプールを設定します。これらの特定の範囲を定義することで、アプリケーションのワークロードが、既存のネットワークインフラストラクチャーの要件に合致した有効な IP アドレス割り当てを受けられることが保証されます。
- IPv4 と CIDR の範囲の例
- Classless Inter-Domain Routing (CIDR) 表記で IP アドレスの範囲を指定できます。CIDR 表記と、ハイフンを使用する表記を組み合わせて下層と上限を分けることができます。
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: doc-example-cidr
namespace: metallb-system
spec:
addresses:
- 192.168.100.0/24
- 192.168.200.0/24
- 192.168.255.1-192.168.255.5
# ...
- IP アドレスの割り当て例
-
autoAssignパラメーターをfalseに設定すると、MetalLB がアドレスプールから IP アドレスを自動的に割り当てるのを防ぐことができます。その場合、IP アドレスプールから単一の IP アドレスまたは複数の IP アドレスを割り当てることができます。IP アドレスを割り当てるには、spec.addressesパラメーター内のターゲット IP アドレスに CIDR 表記/32を追加します。この設定により、特定の IP アドレスのみが割り当て可能となり、予約されていない IP アドレスはアプリケーションで使用できるようになります。
複数の IP アドレスを割り当てる IPAddressPool CR の例
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: doc-example-reserved
namespace: metallb-system
spec:
addresses:
- 192.168.100.1/32
- 192.168.200.1/32
autoAssign: false
# ...
サービスを追加する場合は、アドレスプールから特定の IP アドレスを要求することも、アノテーションでプール名を指定して、そのプールから任意の IP アドレスを要求することもできます。
- IPv4 アドレスと IPv6 アドレスの例
-
IPv4 および IPv6 を使用するアドレスプールを追加できます。複数の IPv4 の例と同様に、
addresses一覧で複数の範囲を指定できます。
サービスが単一の IPv4 アドレス、単一の IPv6 アドレス、またはその両方に割り当てられるかどうかは、サービスの追加方法によって決まります。spec.ipFamilies および spec.ipFamilyPolicy パラメーターは、サービスに IP アドレスを割り当てる方法を制御します。
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: doc-example-combined
namespace: metallb-system
spec:
addresses:
- 10.0.100.0/28
- 2002:2:2::1-2002:2:2::100
# ...
spec.addresses: ここで、10.0.100.0/28 はローカルネットワークの IP アドレスに /28 ネットワークプレフィックスが続くものです。
- サービスまたは名前空間に IP アドレスプールを割り当てる例
-
IPAddressPoolから指定したサービスと namespace に IP アドレスを割り当てることができます。
サービスまたは namespace を複数の IP アドレスプールに割り当てる場合、MetalLB は優先度の高い IP アドレスプールから使用可能な IP アドレスを使用します。割り当てられた優先度の高い IP アドレスプールから使用可能な IP アドレスがない場合、MetalLB は、優先度の低い、または優先度のない IP アドレスプールから使用可能な IP アドレスを使用します。
namespaceSelectors と serviceSelectors の仕様には、matchLabels ラベルセレクター、matchExpressions ラベルセレクター、またはその両方を使用できます。この例は、仕様ごとに 1 つのラベルセレクターを示しています。
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: doc-example-service-allocation
namespace: metallb-system
spec:
addresses:
- 192.168.20.0/24
serviceAllocation:
priority: 50
namespaces:
- namespace-a
- namespace-b
namespaceSelectors:
- matchLabels:
zone: east
serviceSelectors:
- matchExpressions:
- key: security
operator: In
values:
- S1
# ...
ここでは、以下のようになります。
サービス割り当て優先度- アドレスプールに優先度を割り当てます。数字が小さいほど優先度が高いことを示します。
serviceAllocation.namespaces- 1 つ以上の namespace をリスト形式で IP アドレスプールに割り当てます。
serviceAllocation.namespaceSelectors- リスト形式のラベルセレクターを使用して、1 つ以上の namespace ラベルを IP アドレスプールに割り当てます。
serviceAllocation.serviceSelectors- リスト形式のラベルセレクターを使用して、1 つ以上のサービスラベルを IP アドレスプールに割り当てます。