Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

第16章 クラスターへのトラフィックの送信

16.1. クラスターへのトラフィックの送信

 

OpenShift Container Platform は、クラスター内で実行されるサービスを使ってクラスター外からの通信を実行するための複数の方法を提供します。

注記

このセクションの手順では、クラスターの管理者が事前に行っておく必要のある前提条件があります。

管理者は、一定範囲の外部 IP アドレスから固有の外部 IP アドレスをサービスに割り当てることにより外部トラフィックが到達できるサービスのエンドポイントを公開することができます。管理者は CIDR 表記を使用してアドレスの範囲を指定でき、これによりユーザーはクラスターに対して外部 IP アドレスの要求を行うことができます。

各 IP アドレスは、各サービスがそれぞれ固有のエンドポイントを持つように 1 つのサービスにのみ割り当てる必要があります。起こり得るポートのクラッシュについては 「first-come, first-served (先着順)」で処理されます。

推奨事項は、推薦される順に以下に示しています。

  • HTTP/HTTPS を使用する場合はルーターを使用します。
  • HTTPS 以外の TLS で暗号化されたプロトコルを使用する場合 (TLS と SNI ヘッダーの使用など) はルーターを使用します。
  • それ以外の場合は、ロードバランサー外部 IP、または NodePort を使用します。
方法目的

ルーターの使用

HTTP/HTTPS トラフィックおよび HTTPS 以外の TLS で暗号化されたプロトコル (TLS と SNI ヘッダーの使用など) へのアクセスを許可します。

ロードバランサーサービスを使用したパブリック IP の自動割り当て

プールから割り当てられた IP アドレスを使った非標準ポートへのトラフィックを許可します。

外部 IP のサービスへの手動割り当て

特定の IP アドレスを使った非標準ポートへのトラフィックを許可します。

NodePort の設定

クラスターのすべてのノードでサービスを公開します。

16.2. ルーターを使用したトラフィックのクラスターへの送信

16.2.1. 概要

ルーターの使用は、OpenShift Container Platform クラスターへの外部アクセスを許可する最も一般的な方法です。

「ルーター」は、設定した「ルート」に基づいて、外部の要求を受け入れ、プロキシー化するように設定されます。これは Web アプリケーションに対応する HTTP/HTTPS(SNI)/TLS(SNI) に制限されます。

16.2.2. 管理者の前提条件

この手順を開始する前に、管理者は以下の条件を満たしていることを確認する必要があります。

  • 要求がクラスターに到達するように外部ポートをクラスターネットワーク環境にセットアップします。たとえば名前については、クラスター内の特定ノードまたは他の IP アドレスを参照するように DNS で設定できます。「DNS ワイルドカード」機能はクラスター内の IP アドレスに対して名前のサブセットを設定するために使用できます。これを使用するユーザーは、管理者に問い合わせることなくクラスター内でルートをセットアップできます。
  • 各ノードのローカルのファイアウォールが、IP アドレスの到達要求を許可していることを確認します。
  • OpenShift Container Platform クラスターが、「アイデンティティープロバイダーを使用」して適切なユーザーアクセスを許可できるように設定します。
  • クラスター管理者ロールを持つユーザーが 1 名以上いることを確認します。このロールをユーザーに追加するには、以下のコマンドを実行します。

    oc adm policy add-cluster-role-to-user cluster-admin username
  • OpenShift Container Platform クラスターを、1 つ以上のマスターと 1 つ以上のノード、およびクラスターへのネットワークアクセスのあるクラスター外のシステムと共に用意します。この手順では、外部システムがクラスターと同じサブセットにあることを前提とします。別のサブセットの外部システムに必要な追加のネットワーク設定については、このトピックでは扱いません。

16.2.2.1. パブリック IP 範囲の定義

サービスへのアクセスを許可するための最初の手順として、マスター設定ファイルで外部 IP アドレス範囲を定義します。

  1. クラスター管理者ロールを持つユーザーとして OpenShift Container Platform にログインします。

    $ oc login
    Authentication required (openshift)
    Username: admin
    Password:
    Login successful.
    
    You have access to the following projects and can switch between them with 'oc project <projectname>':
      * default
    Using project "default".
  2. 以下のように /etc/origin/master/master-config.yaml ファイルで externalIPNetworkCIDRs パラメーターを設定します。

    networkConfig:
      externalIPNetworkCIDRs:
      - <ip_address>/<cidr>

    以下に例を示します。

    networkConfig:
      externalIPNetworkCIDRs:
      - 192.168.120.0/24
  3. 変更を有効にするために OpenShift Container Platform マスターサービスを再起動します。

    # master-restart api
    # master-restart controllers
注意

IP アドレスプールはクラスター内の 1 つ以上のノードで終了している必要があります。

16.2.3. プロジェクトおよびサービスの作成

公開するプロジェクトおよびサービスが存在しない場合、最初にプロジェクトを作成し、次にサービスを作成します。

プロジェクトおよびサービスがすでに存在する場合は、サービスを公開し、ルートを作成する という次の手順に進みます。

  1. OpenShift Container Platform にログインします。
  2. サービスの新規プロジェクトを作成します。

    $ oc new-project <project_name>

    以下に例を示します。

    $ oc new-project external-ip
  3. oc new-app コマンドを使用してサービスを作成します。

    以下に例を示します。

    $ oc new-app \
        -e MYSQL_USER=admin \
        -e MYSQL_PASSWORD=redhat \
        -e MYSQL_DATABASE=mysqldb \
        registry.access.redhat.com/openshift3/mysql-55-rhel7
  4. 以下のコマンドを実行して新規サービスが作成されていることを確認します。

    oc get svc
    NAME               CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    mysql-55-rhel7     172.30.131.89   <none>        3306/TCP   13m

    デフォルトで、新規サービスには外部 IP アドレスがありません。

16.2.4. サービスを公開し、ルートを作成する

oc expose コマンドを使用して、「サービスをルートとして公開する」必要があります。

サービスを公開するには、以下を実行します。

  1. OpenShift Container Platform にログインします。
  2. 公開するサービスが置かれているプロジェクトにログインします。

    $ oc project project1
  3. 以下のコマンドを実行してルートを公開します。

    oc expose service <service-name>

    以下に例を示します。

    oc expose service mysql-55-rhel7
    route "mysql-55-rhel7" exposed
  4. マスターで cURL などのツールを使用し、サービスのクラスター IP アドレスを使用してサービスに到達できることを確認します。

    curl <pod-ip>:<port>

    以下に例を示します。

    curl 172.30.131.89:3306

    このセクションの例では、クライアントアプリケーションを必要とする MySQL サービスを使用しています。Got packets out of order のメッセージと共に文字ストリングを取得する場合は、このサービスに接続されていることになります。

    MySQL クライアントがある場合は、標準 CLI コマンドでログインします。

    $ mysql -h 172.30.131.89 -u admin -p
    Enter password:
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    
    MySQL [(none)]>

16.2.5. ルーターの設定

管理者と連携してルーターを設定します。外部要求を許可し、設定されたルートに基づいてそれらをプロキシー送信するようにルーターを設定します。

管理者は「ワイルドカード DNS」エントリーを作成してからルーターをセットアップできます。その後は管理者に問い合わせることなく edge ルーターをセルフサービスで提供できます。

ルーターには、ユーザーがホスト名をセルフプロビジョニングできるかどうか、またはホスト名に特定のパターンを使用する必要があるかどうかを管理者が指定できるようにするコントロールがあります。

一連のルートが各種プロジェクトで作成される場合、ルートのセット全体が一連のルーターで利用可能になります。各ルートはルートのセットからルートを許可 (または選択) します。デフォルトで、すべてのルーターはすべてのルートを許可します。

全プロジェクトに含まれるすべての「ラベル」を表示するパーミッションを持つルーターは、ラベルに基づいて、許可するルートを選択できます。これは「ルーターのシャード化」と呼ばれています。これは一連のルーター間で受信トラフィックの負荷を分散する場合や、特定のルーターへのトラフィックを分離する場合に役立ちます。たとえば、Company A のトラフィックをあるルーターに設定し、Company B のトラフィックを別のルーターに指定する場合などに役立ちます。

ルーターは特定のノードで実行されるため、ルーターまたはノードが失敗すると、Ingress トラフィックが停止します。これによる影響を軽減するには、各種の異なるノードで冗長ルーターを作成し、「高可用性」を使用してノードの失敗時にルーター IP アドレスを切り換えます。

16.2.6. VIP を使用した IP フェイルオーバーの設定

オプションとして、管理者は IP フェイルオーバーを設定できます。

IP フェイルオーバーは、ノードセットの仮想 IP (VIP) アドレスのプールを管理します。セットのすべての VIP はセットから選択されるノードによって提供されます。VIP は単一ノードが利用可能である限り提供されます。ノード上で VIP を明示的に配布する方法がないため、VIP のないノードがある可能性も、多数の VIP を持つノードがある可能性もあります。ノードが 1 つのみ存在する場合は、すべての VIP がそのノードに配置されます。

VIP はクラスター外からルーティングできる必要があります。

IP フェイルオーバーを設定するには、以下を実行します。

  1. マスターで ipfailover サービスアカウントに十分なセキュリティー権限があることを確認します。

    oc adm policy add-scc-to-user privileged -z ipfailover
  2. 以下のコマンドを実行して IP フェイルオーバーを作成します。

    oc adm ipfailover --virtual-ips=<exposed-ip-address> --watch-port=<exposed-port> --replicas=<number-of-pods> --create

    以下に例を示します。

    oc adm ipfailover --virtual-ips="172.30.233.169" --watch-port=32315 --replicas=4 --create
    --> Creating IP failover ipfailover ...
        serviceaccount "ipfailover" created
        deploymentconfig "ipfailover" created
    --> Success

16.3. ロードバランサーを使用したトラフィックのクラスターへの送信

16.3.1. 概要

特定の外部 IP アドレスを必要としない場合、ロードバランサーサービスを OpenShift Container Platform クラスターへの外部アクセスを許可するよう設定することができます。

ロードバランサーサービスは設定済みのプールから固有の IP を割り当てます。ロードバランサーには単一の edge ルーター IP があります (これは「仮想 IP (VIP)」の場合もありますが、初期の負荷分散では単一マシンになります)。

このプロセスには以下を実行することが関係します。

16.3.2. 管理者の前提条件

この手順を開始する前に、管理者は以下の条件を満たしていることを確認する必要があります。

  • 要求がクラスターに到達するように外部ポートをクラスターネットワーク環境にセットアップします。たとえば名前については、クラスター内の特定ノードまたは他の IP アドレスを参照するように DNS で設定できます。「DNS ワイルドカード」機能はクラスター内の IP アドレスに対して名前のサブセットを設定するために使用できます。これを使用するユーザーは、管理者に問い合わせることなくクラスター内でルートをセットアップできます。
  • 各ノードのローカルのファイアウォールが、IP アドレスの到達要求を許可していることを確認します。
  • OpenShift Container Platform クラスターが、「アイデンティティープロバイダーを使用」して適切なユーザーアクセスを許可できるように設定します。
  • クラスター管理者ロールを持つユーザーが 1 名以上いることを確認します。このロールをユーザーに追加するには、以下のコマンドを実行します。

    oc adm policy add-cluster-role-to-user cluster-admin username
  • OpenShift Container Platform クラスターを、1 つ以上のマスターと 1 つ以上のノード、およびクラスターへのネットワークアクセスのあるクラスター外のシステムと共に用意します。この手順では、外部システムがクラスターと同じサブセットにあることを前提とします。別のサブセットの外部システムに必要な追加のネットワーク設定については、このトピックでは扱いません。

16.3.2.1. パブリック IP 範囲の定義

サービスへのアクセスを許可するための最初の手順として、マスター設定ファイルで外部 IP アドレス範囲を定義します。

  1. クラスター管理者ロールを持つユーザーとして OpenShift Container Platform にログインします。

    $ oc login
    Authentication required (openshift)
    Username: admin
    Password:
    Login successful.
    
    You have access to the following projects and can switch between them with 'oc project <projectname>':
      * default
    Using project "default".
  2. 以下のように /etc/origin/master/master-config.yaml ファイルで externalIPNetworkCIDRs パラメーターを設定します。

    networkConfig:
      externalIPNetworkCIDRs:
      - <ip_address>/<cidr>

    以下に例を示します。

    networkConfig:
      externalIPNetworkCIDRs:
      - 192.168.120.0/24
  3. 変更を有効にするために OpenShift Container Platform マスターサービスを再起動します。

    # master-restart api
    # master-restart controllers
注意

IP アドレスプールはクラスター内の 1 つ以上のノードで終了している必要があります。

16.3.3. プロジェクトおよびサービスの作成

公開するプロジェクトおよびサービスが存在しない場合、最初にプロジェクトを作成し、次にサービスを作成します。

プロジェクトおよびサービスがすでに存在する場合は、サービスを公開し、ルートを作成する という次の手順に進みます。

  1. OpenShift Container Platform にログインします。
  2. サービスの新規プロジェクトを作成します。

    $ oc new-project <project_name>

    以下に例を示します。

    $ oc new-project external-ip
  3. oc new-app コマンドを使用してサービスを作成します。

    以下に例を示します。

    $ oc new-app \
        -e MYSQL_USER=admin \
        -e MYSQL_PASSWORD=redhat \
        -e MYSQL_DATABASE=mysqldb \
        registry.access.redhat.com/openshift3/mysql-55-rhel7
  4. 以下のコマンドを実行して新規サービスが作成されていることを確認します。

    oc get svc
    NAME               CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    mysql-55-rhel7     172.30.131.89   <none>        3306/TCP   13m

    デフォルトで、新規サービスには外部 IP アドレスがありません。

16.3.4. サービスを公開し、ルートを作成する

oc expose コマンドを使用して、「サービスをルートとして公開する」必要があります。

サービスを公開するには、以下を実行します。

  1. OpenShift Container Platform にログインします。
  2. 公開するサービスが置かれているプロジェクトにログインします。

    $ oc project project1
  3. 以下のコマンドを実行してルートを公開します。

    oc expose service <service-name>

    以下に例を示します。

    oc expose service mysql-55-rhel7
    route "mysql-55-rhel7" exposed
  4. マスターで cURL などのツールを使用し、サービスのクラスター IP アドレスを使用してサービスに到達できることを確認します。

    curl <pod-ip>:<port>

    以下に例を示します。

    curl 172.30.131.89:3306

    このセクションの例では、クライアントアプリケーションを必要とする MySQL サービスを使用しています。Got packets out of order のメッセージと共に文字ストリングを取得する場合は、このサービスに接続されていることになります。

    MySQL クライアントがある場合は、標準 CLI コマンドでログインします。

    $ mysql -h 172.30.131.89 -u admin -p
    Enter password:
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    
    MySQL [(none)]>

次に以下のタスクを実行します。

16.3.5. ロードバランサーサービスの作成

ロードバランサーサービスを作成するには、以下を実行します。

  1. OpenShift Container Platform にログインします。
  2. 公開するサービスが置かれているプロジェクトを読み込みます。プロジェクトまたはサービスが存在しない場合は、「プロジェクトおよびサービスの作成」を参照してください。

    $ oc project project1
  3. マスターノードでテキストファイルを開き、以下のテキストを貼り付け、必要に応じてファイルを編集します。

    例16.1 ロードバランサー設定ファイルのサンプル

    apiVersion: v1
    kind: Service
    metadata:
      name: egress-2 1
    spec:
      ports:
      - name: db
        port: 3306 2
      loadBalancerIP:
      type: LoadBalancer 3
      selector:
        name: mysql 4
    1
    ロードバランサーサービスの説明となる名前を入力します。
    2
    公開するサービスがリッスンしている同じポートを入力します。
    3
    タイプに loadbalancer を入力します。
    4
    サービスの名前を入力します。
  4. ファイルを保存し、終了します。
  5. 以下のコマンドを実行してサービスを作成します。

    oc create -f <file-name>

    以下に例を示します。

    oc create -f mysql-lb.yaml
  6. 以下のコマンドを実行して新規サービスを表示します。

    oc get svc
    NAME              CLUSTER-IP       EXTERNAL-IP                   PORT(S)                   AGE
    egress-2          172.30.236.167   172.29.121.74,172.29.121.74   3306/TCP                  6s

    サービスには自動的に割り当てられた外部 IP アドレスがあることに注意してください。

  7. マスターで cURL などのツールを使用し、パブリック IP アドレスを使用してサービスに到達できることを確認します。

    $ curl <public-ip>:<port>

    ++ 例:

    $ curl 172.29.121.74:3306

    このセクションの例では、クライアントアプリケーションを必要とする MySQL サービスを使用しています。Got packets out of order のメッセージと共に文字ストリングを取得する場合は、このサービスに接続していることになります。

    MySQL クライアントがある場合は、標準 CLI コマンドでログインします。

    $ mysql -h 172.30.131.89 -u admin -p
    Enter password:
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    
    MySQL [(none)]>

16.3.6. ネットワークの設定

以下の手順は、他のノードから公開されたサービスにアクセスするために必要なネットワークを設定するための一般的なガイドラインです。ネットワーク環境は異なるため、お使いに環境に必要な特定の設定についてはネットワーク管理者にお問い合わせください。

以下の手順は、すべてのシステムが同じサブネットにあることを前提としています。

ノード上:

  1. ネットワークを稼働させるためにネットワークを再起動します。

    $ service network restart
    Restarting network (via systemctl):  [  OK  ]

    ネットワークが稼働していない場合、以下のコマンドを実行すると Network is unreachable などのエラーメッセージが表示されます。

  2. マスター上の公開されたサービスの IP アドレスとマスターホストの IP アドレス間のルートを追加します。ネットワークルートのネットマスクを使用する場合には、使用するネットマスクおよび netmask オプションを使用します。

    $ route add -net 172.29.121.74 netmask 255.255.0.0 gw 10.16.41.22 dev eth0
  3. cURL などのツールを使用して、パブリック IP アドレスを使用してサービスに到達できることを確認します。

    $ curl <public-ip>:<port>

    以下に例を示します。

    curl 172.29.121.74:3306

    Got packets out of order のメッセージと共に文字ストリングを取得する場合は、サービスがノードからアクセス可能であることになります。

クラスター内にないシステム上:

  1. ネットワークを稼働させるためにネットワークを再起動します。

    $ service network restart
    Restarting network (via systemctl):  [  OK  ]

    ネットワークが稼働していない場合、以下のコマンドを実行すると Network is unreachable などのエラーメッセージが表示されます。

  2. マスター上の公開されたサービスの IP アドレスとマスターホストの IP アドレス間のルートを追加します。ネットワークルートのネットマスクを使用する場合には、使用するネットマスクおよび netmask オプションを使用します。

    $ route add -net 172.29.121.74 netmask 255.255.0.0 gw 10.16.41.22 dev eth0
  3. パブリック IP アドレスを使用してサービスに到達できることを確認します。

    $ curl <public-ip>:<port>

    以下に例を示します。

    curl 172.29.121.74:3306

    Got packets out of order のメッセージと共に文字ストリングを取得する場合、サービスがクラスター外からアクセス可能であることになります。

16.3.7. VIP を使用した IP フェイルオーバーの設定

オプションとして、管理者は IP フェイルオーバーを設定できます。

IP フェイルオーバーは、ノードセットの仮想 IP (VIP) アドレスのプールを管理します。セットのすべての VIP はセットから選択されるノードによって提供されます。VIP は単一ノードが利用可能である限り提供されます。ノード上で VIP を明示的に配布する方法がないため、VIP のないノードがある可能性も、多数の VIP を持つノードがある可能性もあります。ノードが 1 つのみ存在する場合は、すべての VIP がそのノードに配置されます。

VIP はクラスター外からルーティングできる必要があります。

IP フェイルオーバーを設定するには、以下を実行します。

  1. マスターで ipfailover サービスアカウントに十分なセキュリティー権限があることを確認します。

    oc adm policy add-scc-to-user privileged -z ipfailover
  2. 以下のコマンドを実行して IP フェイルオーバーを作成します。

    oc adm ipfailover --virtual-ips=<exposed-ip-address> --watch-port=<exposed-port> --replicas=<number-of-pods> --create

    以下に例を示します。

    oc adm ipfailover --virtual-ips="172.30.233.169" --watch-port=32315 --replicas=4 --create
    --> Creating IP failover ipfailover ...
        serviceaccount "ipfailover" created
        deploymentconfig "ipfailover" created
    --> Success

16.4. サービスの外部 IP を使用したトラフィックのクラスターへの送信

16.4.1. 概要

サービスを公開する 1 つの方法として、外部 IP アドレスをクラスター外からアクセス可能にするサービスに直接割り当てることができます。

パブリック IP アドレス範囲の定義」で説明されているように、使用する IP アドレスの範囲を作成していることを確認します。

サービスに外部 IP を設定することにより、OpenShift Container Platform は、その IP アドレスをターゲットとするクラスターノードに到達するトラフィックが内部 Pod のいずれかに送信されることを許可する IP テーブルルールをセットアップします。これは内部サービス IP アドレスと似ていますが、外部 IP は OpenShift Container Platform に対し、このサービスが所定の IP で外部に公開される必要があることを示します。管理者は、この IP アドレスをクラスター内のノードのいずれかのホスト (ノード) インターフェースに割り当てる必要があります。または、このアドレスは 仮想 IP (VIP) として使用することができます。

OpenShift Container Platform ではこれらの IP を管理しないため、管理者はトラフィックがこの IP を持つノードに到達することを確認する必要があります。

注記

以下は非 HA ソリューションであり、IP フェイルオーバーを設定しません。IP フェイルオーバーはサービスの高可用性を確保するために必要です。

このプロセスには以下を実行することが関係します。

16.4.2. 管理者の前提条件

この手順を開始する前に、管理者は以下の条件を満たしていることを確認する必要があります。

  • 要求がクラスターに到達するように外部ポートをクラスターネットワーク環境にセットアップします。たとえば名前については、クラスター内の特定ノードまたは他の IP アドレスを参照するように DNS で設定できます。「DNS ワイルドカード」機能はクラスター内の IP アドレスに対して名前のサブセットを設定するために使用できます。これを使用するユーザーは、管理者に問い合わせることなくクラスター内でルートをセットアップできます。
  • 各ノードのローカルのファイアウォールが、IP アドレスの到達要求を許可していることを確認します。
  • OpenShift Container Platform クラスターが、「アイデンティティープロバイダーを使用」して適切なユーザーアクセスを許可できるように設定します。
  • クラスター管理者ロールを持つユーザーが 1 名以上いることを確認します。このロールをユーザーに追加するには、以下のコマンドを実行します。

    oc adm policy add-cluster-role-to-user cluster-admin username
  • OpenShift Container Platform クラスターを、1 つ以上のマスターと 1 つ以上のノード、およびクラスターへのネットワークアクセスのあるクラスター外のシステムと共に用意します。この手順では、外部システムがクラスターと同じサブセットにあることを前提とします。別のサブセットの外部システムに必要な追加のネットワーク設定については、このトピックでは扱いません。

16.4.2.1. パブリック IP 範囲の定義

サービスへのアクセスを許可するための最初の手順として、マスター設定ファイルで外部 IP アドレス範囲を定義します。

  1. クラスター管理者ロールを持つユーザーとして OpenShift Container Platform にログインします。

    $ oc login
    Authentication required (openshift)
    Username: admin
    Password:
    Login successful.
    
    You have access to the following projects and can switch between them with 'oc project <projectname>':
      * default
    Using project "default".
  2. 以下のように /etc/origin/master/master-config.yaml ファイルで externalIPNetworkCIDRs パラメーターを設定します。

    networkConfig:
      externalIPNetworkCIDRs:
      - <ip_address>/<cidr>

    以下に例を示します。

    networkConfig:
      externalIPNetworkCIDRs:
      - 192.168.120.0/24
  3. 変更を有効にするために OpenShift Container Platform マスターサービスを再起動します。

    # master-restart api
    # master-restart controllers
注意

IP アドレスプールはクラスター内の 1 つ以上のノードで終了している必要があります。

16.4.3. プロジェクトおよびサービスの作成

公開するプロジェクトおよびサービスが存在しない場合、最初にプロジェクトを作成し、次にサービスを作成します。

プロジェクトおよびサービスがすでに存在する場合は、サービスを公開し、ルートを作成する という次の手順に進みます。

  1. OpenShift Container Platform にログインします。
  2. サービスの新規プロジェクトを作成します。

    $ oc new-project <project_name>

    以下に例を示します。

    $ oc new-project external-ip
  3. oc new-app コマンドを使用してサービスを作成します。

    以下に例を示します。

    $ oc new-app \
        -e MYSQL_USER=admin \
        -e MYSQL_PASSWORD=redhat \
        -e MYSQL_DATABASE=mysqldb \
        registry.access.redhat.com/openshift3/mysql-55-rhel7
  4. 以下のコマンドを実行して新規サービスが作成されていることを確認します。

    oc get svc
    NAME               CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    mysql-55-rhel7     172.30.131.89   <none>        3306/TCP   13m

    デフォルトで、新規サービスには外部 IP アドレスがありません。

16.4.4. サービスを公開し、ルートを作成する

oc expose コマンドを使用して、「サービスをルートとして公開する」必要があります。

サービスを公開するには、以下を実行します。

  1. OpenShift Container Platform にログインします。
  2. 公開するサービスが置かれているプロジェクトにログインします。

    $ oc project project1
  3. 以下のコマンドを実行してルートを公開します。

    oc expose service <service-name>

    以下に例を示します。

    oc expose service mysql-55-rhel7
    route "mysql-55-rhel7" exposed
  4. マスターで cURL などのツールを使用し、サービスのクラスター IP アドレスを使用してサービスに到達できることを確認します。

    curl <pod-ip>:<port>

    以下に例を示します。

    curl 172.30.131.89:3306

    このセクションの例では、クライアントアプリケーションを必要とする MySQL サービスを使用しています。Got packets out of order のメッセージと共に文字ストリングを取得する場合は、このサービスに接続されていることになります。

    MySQL クライアントがある場合は、標準 CLI コマンドでログインします。

    $ mysql -h 172.30.131.89 -u admin -p
    Enter password:
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    
    MySQL [(none)]>

次に以下のタスクを実行します。

16.4.5. IP アドレスのサービスへの割り当て

外部 IP アドレスをサービスに割り当てるには、以下を実行します。

  1. OpenShift Container Platform にログインします。
  2. 公開するサービスが置かれているプロジェクトを読み込みます。プロジェクトまたはサービスが存在しない場合は、前提条件にある「プロジェクトおよびサービスの作成」を参照してください。
  3. 以下のコマンドを実行して、アクセスするサービスに外部 IP アドレスを割り当てます。外部 IP アドレス範囲の IP アドレスを使用します。

    oc patch svc <name> -p '{"spec":{"externalIPs":["<ip_address>"]}}'

    <name> はサービスの名前であり、-p はサービス JSON ファイルに適用されるパッチを示しています。括弧内の式は特定の IP アドレスを指定されたサービスに割り当てます。

    以下に例を示します。

    oc patch svc mysql-55-rhel7 -p '{"spec":{"externalIPs":["192.174.120.10"]}}'
    
    "mysql-55-rhel7" patched
  4. 以下のコマンドを実行してサービスにパブリック IP があることを確認します。

    oc get svc
    NAME               CLUSTER-IP      EXTERNAL-IP     PORT(S)    AGE
    mysql-55-rhel7     172.30.131.89   192.174.120.10  3306/TCP   13m
  5. マスターで cURL などのツールを使用し、パブリック IP アドレスを使用してサービスに到達できることを確認します。

    $ curl <public-ip>:<port>

    以下に例を示します。

    curl 192.168.120.10:3306

    Got packets out of order のメッセージと共に文字ストリングを取得する場合、サービスに接続していることになります。

    MySQL クライアントがある場合は、標準 CLI コマンドでログインします。

    $ mysql -h 192.168.120.10 -u admin -p
    Enter password:
    Welcome to the MariaDB monitor. Commands end with ; or \g.
    
    MySQL [(none)]>

16.4.6. ネットワークの設定

外部 IP アドレスが割り当てられた後は、その IP へのルートを作成する必要があります。

以下の手順は、他のノードから公開されたサービスにアクセスするために必要なネットワークを設定するための一般的なガイドラインです。ネットワーク環境は異なるため、お使いに環境に必要な特定の設定についてはネットワーク管理者にお問い合わせください。

注記

以下の手順は、すべてのシステムが同じサブネットにあることを前提としています。

マスター上:

  1. ネットワークを稼働させるためにネットワークを再起動します。

    $ service network restart
    Restarting network (via systemctl):  [  OK  ]

    ネットワークが稼働していない場合、以下のコマンドを実行すると Network is unreachable などのエラーメッセージが表示されます。

  2. 公開するサービスの外部 IP アドレスおよび ifconfig コマンド出力からのホスト IP に関連付けられたデバイス名を使って以下のコマンドを実行します。

    $ ip address add <external-ip> dev <device>

    以下に例を示します。

    $ ip address add 192.168.120.10 dev eth0

    必要な場合は、以下のコマンドを実行してマスターが置かれているホストサーバーの IP アドレスを取得します。

    $ ifconfig

    UP,BROADCAST,RUNNING,MULTICAST のように一覧表示されているデバイスを検索します。

    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 10.16.41.22  netmask 255.255.248.0  broadcast 10.16.47.255
            ...
  3. マスターが存在するホストの IP アドレスと、マスターホストのゲートウェイ IP アドレスの間のルートを追加します。ネットワークルートのネットマスクを使用する場合には、使用するネットマスクおよび netmask オプションを使用します。

    $ route add -host <host_ip_address> netmask <netmask> gw <gateway_ip_address> dev <device>

    以下に例を示します。

    $ route add -host 10.16.41.22 netmask 255.255.248.0 gw 10.16.41.254 dev eth0

    netstat -nr コマンドはゲートウェイ IP アドレスを提供します。

    $ netstat -nr
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    0.0.0.0         10.16.41.254    0.0.0.0         UG        0 0          0 eth0
  4. 公開されるサービスの IP アドレスとマスターホストの IP アドレス間のルートを追加します。

    $ route add -net 192.174.120.0/24 gw 10.16.41.22 eth0

ノード上:

  1. ネットワークを稼働させるためにネットワークを再起動します。

    $ service network restart
    Restarting network (via systemctl):  [  OK  ]

    ネットワークが稼働していない場合、以下のコマンドを実行すると Network is unreachable などのエラーメッセージが表示されます。

  2. ノードが配置されているホストの IP アドレスと、ノードホストのゲートウェイ IP との間のルートを追加します。ネットワークルートのネットマスクを使用する場合には、使用するネットマスクおよび netmask オプションを使用します。

    $ route add -net 10.16.40.0 netmask 255.255.248.0 gw 10.16.47.254 eth0

    ifconfig コマンドはホスト IP を表示します。

    ifconfig
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 10.16.41.71  netmask 255.255.248.0  broadcast 10.19.41.255

    netstat -nrコマンドはゲートウェイ IP を表示します。

    netstat -nr
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    0.0.0.0         10.16.41.254    0.0.0.0         UG        0 0          0 eth0
  3. 公開されるサービスの IP アドレスとマスターノードが置かれているホストサーバーの IP アドレス間のルートを追加します。

    $ route add -net 192.174.120.0 netmask 255.255.255.0 gw 10.16.41.22 dev eth0
  4. cURL などのツールを使用して、パブリック IP アドレスを使用してサービスに到達できることを確認します。

    $ curl <public-ip>:<port>

    以下に例を示します。

    curl 192.168.120.10:3306

    Got packets out of order のメッセージと共に文字ストリングを取得する場合は、サービスがノードからアクセス可能であることになります。

クラスター内にないシステム上:

  1. ネットワークを稼働させるためにネットワークを再起動します。

    $ service network restart
    Restarting network (via systemctl):  [  OK  ]

    ネットワークが稼働していない場合、以下のコマンドを実行すると Network is unreachable などのエラーメッセージが表示されます。

  2. リモートホストの IP アドレスと、リモートホストのゲートウェイ IP の間のルートを追加します。ネットワークルートのネットマスクを使用する場合には、使用するネットマスクおよび netmask オプションを使用します。

    $ route add -net 10.16.64.0 netmask 255.255.248.0 gw 10.16.71.254 eno1
  3. マスター上の公開されたサービスの IP アドレスとマスターホストの IP アドレス間のルートを追加します。

    $ route add -net 192.174.120.0 netmask 255.255.248.0 gw 10.16.41.22
  4. cURL などのツールを使用して、パブリック IP アドレスを使用してサービスに到達できることを確認します。

    $ curl <public-ip>:<port>

    以下に例を示します。

    curl 192.168.120.10:3306

    Got packets out of order のメッセージと共に文字ストリングを取得する場合、サービスがクラスター外からアクセス可能であることになります。

16.4.7. VIP を使用した IP フェイルオーバーの設定

オプションとして、管理者は IP フェイルオーバーを設定できます。

IP フェイルオーバーは、ノードセットの仮想 IP (VIP) アドレスのプールを管理します。セットのすべての VIP はセットから選択されるノードによって提供されます。VIP は単一ノードが利用可能である限り提供されます。ノード上で VIP を明示的に配布する方法がないため、VIP のないノードがある可能性も、多数の VIP を持つノードがある可能性もあります。ノードが 1 つのみ存在する場合は、すべての VIP がそのノードに配置されます。

VIP はクラスター外からルーティングできる必要があります。

IP フェイルオーバーを設定するには、以下を実行します。

  1. マスターで ipfailover サービスアカウントに十分なセキュリティー権限があることを確認します。

    oc adm policy add-scc-to-user privileged -z ipfailover
  2. 以下のコマンドを実行して IP フェイルオーバーを作成します。

    oc adm ipfailover --virtual-ips=<exposed-ip-address> --watch-port=<exposed-port> --replicas=<number-of-pods> --create

    以下に例を示します。

    oc adm ipfailover --virtual-ips="172.30.233.169" --watch-port=32315 --replicas=4 --create
    --> Creating IP failover ipfailover ...
        serviceaccount "ipfailover" created
        deploymentconfig "ipfailover" created
    --> Success

16.5. NodePort を使用したトラフィックのクラスターへの送信

16.5.1. 概要

NodePort を使用してクラスター内のすべてのノードでサービス nodePort を公開します。

NodePort を使用するには追加のポートリソースが必要です。

ノードポートはノード IP アドレスの静的ポートでサービスを公開します。

NodePort はデフォルトで 30000-32767 の範囲に置かれます。つまり、NodePort はサービスの意図されるポートに一致しないことが予想されます (たとえば 8080 は 31020 として公開される可能性があります)。

管理者は外部 IP がノードにルーティングされており、すべてのノードのローカルのファイアウォールルールによって開いたポートへのアクセスが許可されることを確認する必要があります。

NodePort および外部 IP は独立しており、両方を同時に使用できます。

16.5.2. 管理者の前提条件

この手順を開始する前に、管理者は以下の条件を満たしていることを確認する必要があります。

  • 要求がクラスターに到達するように外部ポートをクラスターネットワーク環境にセットアップします。たとえば名前については、クラスター内の特定ノードまたは他の IP アドレスを参照するように DNS で設定できます。「DNS ワイルドカード」機能はクラスター内の IP アドレスに対して名前のサブセットを設定するために使用できます。これを使用するユーザーは、管理者に問い合わせることなくクラスター内でルートをセットアップできます。
  • 各ノードのローカルのファイアウォールが、IP アドレスの到達要求を許可していることを確認します。
  • OpenShift Container Platform クラスターが、「アイデンティティープロバイダーを使用」して適切なユーザーアクセスを許可できるように設定します。
  • クラスター管理者ロールを持つユーザーが 1 名以上いることを確認します。このロールをユーザーに追加するには、以下のコマンドを実行します。

    oc adm policy add-cluster-role-to-user cluster-admin username
  • OpenShift Container Platform クラスターを、1 つ以上のマスターと 1 つ以上のノード、およびクラスターへのネットワークアクセスのあるクラスター外のシステムと共に用意します。この手順では、外部システムがクラスターと同じサブセットにあることを前提とします。別のサブセットの外部システムに必要な追加のネットワーク設定については、このトピックでは扱いません。

16.5.3. サービスの設定

サービスの作成または変更時に nodePort のポート番号を指定します。ポートを手動で指定しない場合は、システムが代わりにこれを割り当てます。

  1. マスターノードにログインします。
  2. 使用予定のプロジェクトが存在しない場合には、サービス用に新規プロジェクトを作成します。

    $ oc new-project <project_name>

    以下に例を示します。

    $ oc new-project external-ip
  3. サービス定義を編集して spec.type:NodePort を指定し、オプションで 30000-32767 範囲のポートを指定します。

    apiVersion: v1
    kind: Service
    metadata:
      name: mysql
      labels:
        name: mysql
    spec:
      type: NodePort
      ports:
        - port: 3036
          nodePort: 30036
          name: http
      selector:
        name: mysql
  4. 以下のコマンドを実行してサービスを作成します。

    $ oc new-app <file-name>

    以下に例を示します。

    oc new-app mysql.yaml
  5. 以下のコマンドを実行して新規サービスが作成されていることを確認します。

    oc get svc
    
    NAME             CLUSTER_IP       EXTERNAL_IP   PORT(S)                      AGE
    mysql            172.30.89.219    <nodes>       3036:30036/TCP               2m

    外部 IP が <nodes> として一覧表示され、ノードのポートが一覧表示されることに注意してください。

<NodeIP>:<NodePort> アドレスを使用してサービスにアクセスできるはずです。