第17章 Routes (ルート)
17.1. 概要
OpenShift Container Platform の「ルート」は、外部クライアントが名前で到達できるように www.example.com などのホスト名で「サービス」を公開します。
ホスト名の DNS 解決はルーティングとは別に処理されます。管理者は常に OpenShift Container Platform ルーターに対して正常に解決されるクラウドドメインを設定している場合がありますが、関連性のないホスト名を使用する場合には、ルーターに対して解決されるようにその DNS レコードを別途変更する必要がある場合があります。
17.2. ルートの作成
Web コンソールまたは CLI を使用して、セキュリティー保護されていないルートとセキュリティー保護されているルートを作成できます。
Web コンソールを使用してナビゲーションの Applications セクションの下にある Routes ページに移動します。
Create Route をクリックしてプロジェクト内でルートを定義し、作成します。
図17.1 Web コンソールを使用したルートの作成
以下の例では、CLI を使用して非セキュアなルートを作成します。
$ oc expose svc/frontend --hostname=www.example.com
新規ルートは、--name
オプションを使用して名前を指定しない限りサービスから名前を継承します。
上記で作成された非セキュアなルートの YAML 定義
apiVersion: v1
kind: Route
metadata:
name: frontend
spec:
host: www.example.com
path: "/test" 1
to:
kind: Service
name: frontend
- 1
- 「パスベースのルーティング」については、URL に対して比較対象となるパスコンポーネントを指定します。
CLI を使用したルートの設定についての情報は、「ルートタイプ」を参照してください。
セキュアでないルートがデフォルト設定であるため、これは設定が最も簡単です。ただし、「セキュリティー保護されたルート」は、接続がプライベートのままになるようにセキュリティーを確保します。キーと証明書 (別々に生成し、署名する必要のある PEM 形式のファイル) で暗号化されたセキュリティー保護された HTTPS ルートを作成するには、create route
コマンドを使用し、オプションで証明書およびキーを指定できます。
TLS は、HTTPS および他の暗号化されたプロトコルにおける SSL の代わりとして使用されます。
$ oc create route edge --service=frontend \ --cert=${MASTER_CONFIG_DIR}/ca.crt \ --key=${MASTER_CONFIG_DIR}/ca.key \ --ca-cert=${MASTER_CONFIG_DIR}/ca.crt \ --hostname=www.example.com
上記で作成されたセキュリティー保護されたルートの YAML 定義
apiVersion: v1 kind: Route metadata: name: frontend spec: host: www.example.com to: kind: Service name: frontend tls: termination: edge key: |- -----BEGIN PRIVATE KEY----- [...] -----END PRIVATE KEY----- certificate: |- -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- caCertificate: |- -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE-----
現時点で、パスワードで保護されたキーファイルはサポートされていません。HAProxy は開始時にパスワードを求めるプロンプトを出しますが、このプロセスを自動化する方法はありません。キーファイルからパスフレーズを削除するために、以下を実行できます。
# openssl rsa -in <passwordProtectedKey.key> -out <new.key>
キーと証明書を指定せずにセキュリティー保護されたルートを作成できます。この場合、「ルーターのデフォルト証明書」が TLS 終端に使用されます。
OpenShift Container Platform での TLS 終端は、カスタム証明書の提供について SNI に依存します。ポート 443 で受信される SNI 以外のトラフィックは TLS 終端で処理され、要求されるホスト名に一致しない可能性のあるデフォルト証明書により検証エラーが生じる可能性があります。
すべてのタイプの「TLS 終端」および「パスベースのルーティング」についての詳細は、「アーキテクチャー」セクションを参照してください。
17.3. ルートエンドポイントによる Cookie 名の制御の許可
OpenShift Container Platform は、すべてのトラフィックを同じエンドポイントにヒットさせることによりステートフルなアプリケーションのトラフィックを可能にするスティッキーセッションを提供します。ただし、エンドポイント Pod が再起動、スケーリング、または設定の変更などによって終了する場合、このステートフルはなくなります。
OpenShift Container Platform は Cookie を使用してセッションの永続化を設定できます。ルーターはユーザー要求を処理するエンドポイントを選択し、そのセッションの Cookie を作成します。Cookie は要求の応答として戻され、ユーザーは Cookie をセッションの次の要求と共に送り返します。Cookie はルーターに対し、セッションを処理しているエンドポイントを示し、クライアント要求が Cookie を使用して同じ Pod にルーティングされるようにします。
Cookie 名を設定して、ルート用に自動生成されるデフォルト名を上書きできます。これにより、ルートトラフィックを受信するアプリケーションが Cookie 名を認識できるようになります。Cookie を削除すると、次の要求でエンドポイントの再選択が強制的に実行される可能性があります。そのためサーバーがオーバーロードしている場合には、クライアントからの要求を取り除き、再分配を試行します。
必要な Cookie 名でルートにアノテーションを付けます。
$ oc annotate route <route_name> router.openshift.io/<cookie_name>="-<cookie_annotation>"
たとえば、
my_cookie_anno
というアノテーションでmy_route
にmy_cookie
という Cookie 名のアノテーションを付けるには、以下を実行します。$ oc annotate route my_route router.openshift.io/my_cookie="-my_cookie_anno"
Cookie を保存し、ルートにアクセスします。
$ curl $my_route -k -c /tmp/my_cookie