15.12. リダイレクトモードでの egress ルーター Pod のデプロイ
クラスター管理者は、トラフィックを予約されたソース IP アドレスから指定された宛先 IP アドレスにリダイレクトするように egress ルーター Pod をデプロイできます。
egress ルーターの実装では、egress ルーターの Container Network Interface (CNI) プラグインを使用します。
egress ルーター CNI プラグインはテクノロジープレビュー機能としてのみご利用いただけます。テクノロジープレビュー機能は Red Hat の実稼働環境でのサービスレベルアグリーメント (SLA) ではサポートされていないため、Red Hat では実稼働環境での使用を推奨していません。Red Hat は実稼働環境でこれらを使用することを推奨していません。テクノロジープレビューの機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行いフィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲についての詳細は、https://access.redhat.com/ja/support/offerings/techpreview/ を参照してください。
15.12.1. リダイレクトモードでの egress ルーターのネットワーク接続定義
Pod が egress ルーターとして機能する前に、ネットワークインターフェイス設定を NetworkAttachmentDefinition
オブジェクトとして指定する必要があります。オブジェクトは、egress ルーター Pod、ネットワークの宛先、およびネットワークゲートウェイに割り当てる IP アドレスなどの情報を指定します。egress ルーターの Pod が起動すると、Multus はネットワーク接続定義を使用して、指定されたプロパティーを持つネットワークインターフェイスを Pod に追加します。
ネットワーク接続定義の例
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: egress-router-redirect 1 spec: config: '{ "cniVersion": "0.4.0", "type": "egress-router", "name": "egress-router", "ip": { "addresses": [ "192.168.12.99/24" 2 ], "destinations": [ "192.168.12.91/32" 3 ], "gateway": "192.168.12.1" 4 } }'
- 1
- ネットワーク接続定義の名前は、後に egress ルーター Pod の仕様で使用されます。
- 2
addresses
キーは、追加のネットワークインターフェイスで使用する予約されたソース IP アドレスを指定します。192.168.12.99/24
などの CIDR 表記で単一 IP アドレスを指定します。- 3
destinations
キーは、egress ルーターがパケットを送信する CIDR 表記の単一 IP アドレスを指定します。egress ルーター Pod のネットワークアドレス変換 (NAT) 表は、Pod のクラスター IP アドレスへの接続が宛先 IP アドレスの同じポートにリダイレクトされるように設定されます。この例では、Pod への接続は192.168.12.91
にリダイレクトされます。 ソース IP アドレスは192.168.12.99
です。- 4
gateway
キーは、ネットワークゲートウェイの IP アドレスを指定します。
15.12.2. リダイレクトモードの egress ルーター Pod 仕様
ネットワーク接続定義の作成後に、定義を参照する Pod を追加します。
egress ルーター Pod 仕様の例
apiVersion: v1
kind: Pod
metadata:
name: egress-router-pod
annotations:
k8s.v1.cni.cncf.io/networks: egress-router-redirect 1
spec:
containers:
- name: egress-router-pod
image: registry.redhat.com/openshift3/ose-pod
- 1
- 指定されたネットワークはネットワーク接続定義の名前と一致する必要があります。
<namespace> /<network>@<interface>
パターンの値を置き換えて、namespace、インターフェイス名、またはその両方を指定することができます。デフォルトで、Multus はnet1
、net2
などの名前でセカンダリーネットワークインターフェイスを Pod に追加します。
15.12.3. リダイレクトモードでの egress ルーター Pod のデプロイ
egress ルーター Pod は、トラフィックを独自の予約されたソース IP アドレスから 1 つ以上の宛先 IP アドレスにリダイレクトするためにデプロイできます。
egress ルーター Pod を追加した後に、予約されたソース IP アドレスを使用する必要のあるクライアント Pod は、宛先 IP に直接接続するのでなく、egress ルーターに接続するように変更される必要があります。
前提条件
-
OpenShift CLI (
oc
) をインストールしている。 -
cluster-admin
権限を持つユーザーとしてログインしている。
手順
- ネットワーク接続定義の作成
- egress ルーター Pod の作成
他の Pod が egress ルーター Pod の IP アドレスを見つられるようにするには、以下の例のように、egress ルーター Pod を使用するサービスを作成します。
apiVersion: v1 kind: Service metadata: name: egress-1 spec: ports: - name: database protocol: TCP port: 3306 type: ClusterIP selector: name: egress-router-pod
サービスの作成後に、Pod はサービスに接続できます。egress ルーター Pod は、接続を宛先 IP アドレスの対応するポートにリダイレクトします。接続は、予約されたソース IP アドレスを起点とします。
検証
egress ルーター Pod が起動し、セカンダリーネットワークインターフェイスがあることを確認するには、以下の手順を実行します。
egress ルーター Pod のイベントを表示します。
$ oc get events --field-selector involvedObject.name=egress-router-pod
Pod がネットワーク接続定義を参照する場合、直前のコマンドは以下のような出力を返します。
出力例
LAST SEEN TYPE REASON OBJECT MESSAGE 5m4s Normal Scheduled pod/egress-router-pod Successfully assigned default/egress-router-pod to ci-ln-9x2bnsk-f76d1-j2v6g-worker-c-24g65 5m3s Normal AddedInterface pod/egress-router-pod Add eth0 [10.129.2.31/23] 5m3s Normal AddedInterface pod/egress-router-pod Add net1 [192.168.12.99/24] from default/egress-router-redirect
オプション: egress ルーター Pod のルーティングテーブルを表示します。
egress ルーター Pod のノード名を取得します。
$ POD_NODENAME=$(oc get pod egress-router-pod -o jsonpath="{.spec.nodeName}")
ターゲットノードのデバッグセッションに入ります。この手順は、
<node_name>-debug
というデバッグ Pod をインスタンス化します。$ oc debug node/$POD_NODENAME
/host
をデバッグシェル内の root ディレクトリーとして設定します。デバッグ Pod は、Pod 内の/host
にホストのルートファイルシステムをマウントします。ルートディレクトリーを/host
に変更すると、ホストの実行可能パスに含まれるバイナリーを実行できます。# chroot /host
chroot
環境コンソール内で、コンテナー ID を取得します。# crictl ps --name egress-router-redirect | awk '{print $1}'
出力例
CONTAINER bac9fae69ddb6
コンテナーのプロセス ID を判別します。この例では、コンテナー ID は
bac9fae69ddb6
です。# crictl inspect -o yaml bac9fae69ddb6 | grep 'pid:' | awk '{print $2}'
出力例
68857
コンテナーのネットワーク namespace を入力します。
# nsenter -n -t 68857
ルーティングテーブルを表示します。
# ip route
以下の出力例では、
net1
ネットワークインターフェイスはデフォルトのルートです。クラスターネットワークのトラフィックはeth0
ネットワークインターフェイスを使用します。192.168.12.0/24
ネットワークのトラフィックは、net1
ネットワークインターフェイスを使用し、予約されたソース IP アドレス192.168.12.99
を起点とします。Pod は他のすべてのトラフィックを IP アドレス192.168.12.1
のゲートウェイにルーティングします。サービスネットワークのルーティングは表示されません。出力例
default via 192.168.12.1 dev net1 10.129.2.0/23 dev eth0 proto kernel scope link src 10.129.2.31 192.168.12.0/24 dev net1 proto kernel scope link src 192.168.12.99 192.168.12.1 dev net1