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 は net1net2 などの名前でセカンダリーネットワークインターフェイスを Pod に追加します。

15.12.3. リダイレクトモードでの egress ルーター Pod のデプロイ

egress ルーター Pod は、トラフィックを独自の予約されたソース IP アドレスから 1 つ以上の宛先 IP アドレスにリダイレクトするためにデプロイできます。

egress ルーター Pod を追加した後に、予約されたソース IP アドレスを使用する必要のあるクライアント Pod は、宛先 IP に直接接続するのでなく、egress ルーターに接続するように変更される必要があります。

前提条件

  • OpenShift CLI (oc) をインストールしている。
  • cluster-admin 権限を持つユーザーとしてログインしている。

手順

  1. ネットワーク接続定義の作成
  2. egress ルーター Pod の作成
  3. 他の 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 が起動し、セカンダリーネットワークインターフェイスがあることを確認するには、以下の手順を実行します。

  1. 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

  2. オプション: egress ルーター Pod のルーティングテーブルを表示します。

    1. egress ルーター Pod のノード名を取得します。

      $ POD_NODENAME=$(oc get pod egress-router-pod -o jsonpath="{.spec.nodeName}")
    2. ターゲットノードのデバッグセッションに入ります。この手順は、<node_name>-debug というデバッグ Pod をインスタンス化します。

      $ oc debug node/$POD_NODENAME
    3. /host をデバッグシェル内の root ディレクトリーとして設定します。デバッグ Pod は、Pod 内の /host にホストのルートファイルシステムをマウントします。ルートディレクトリーを /host に変更すると、ホストの実行可能パスに含まれるバイナリーを実行できます。

      # chroot /host
    4. chroot 環境コンソール内で、コンテナー ID を取得します。

      # crictl ps --name egress-router-redirect | awk '{print $1}'

      出力例

      CONTAINER
      bac9fae69ddb6

    5. コンテナーのプロセス ID を判別します。この例では、コンテナー ID は bac9fae69ddb6 です。

      # crictl inspect -o yaml bac9fae69ddb6 | grep 'pid:' | awk '{print $2}'

      出力例

      68857

    6. コンテナーのネットワーク namespace を入力します。

      # nsenter -n -t 68857
    7. ルーティングテーブルを表示します。

      # 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