Red Hat Training
A Red Hat training course is available for OpenShift Container Platform
第18章 外部サービスの統合
18.1. 概要
数多くの OpenShift Container Platform アプリケーションは外部データベースや外部 SaaS エンドポイントなどの外部リソースを使用します。これらの外部リソースはネイティブの OpenShift Container Platform サービスとしてモデリングされ、アプリケーションが他の内部サービスの場合と同様にそれらを使用できるようにします。
「Egress トラフィック」はファイアウォールルールまたは Egress ルーターで制御できます。これにより、アプリケーションサービスの静的 IP アドレスの使用が許可されます。
18.2. 外部データベースのサービスの定義
外部サービスの最も一般的なタイプとして外部データベースを挙げることができます。外部データベースをサポートするには、アプリケーションで以下が必要になります。
- 通信するエンドポイント。
以下を含む認証情報および位置情報 (coordinate)。
- ユーザー名
- パスフレーズ
- データベース名
外部データベースと統合するためのソリューションには、以下が含まれます。
-
Service
オブジェクト: SaaS プロバイダーを OpenShift Container Platform サービスとして表示します。 -
1 つ以上のサービスの
Endpoint
。 - 認証情報を含む適切な Pod の環境変数。
以下の手順は、外部 MySQL データベースとの統合シナリオについて説明しています。
18.2.1. 手順 1: サービスの定義
サービスは、IP アドレスとエンドポイントを指定するか、または完全修飾ドメイン名 (FQDN) を指定し定義することができます。
18.2.1.1. IP アドレスの使用
外部データベースを表す「OpenShift Container Platform サービス」を作成します。これは内部サービスを作成する場合と同様ですが、サービスの
Selector
フィールドが異なります。内部 OpenShift Container Platform サービスは
Selector
フィールドで「ラベル」を使用して Pod をサービスに関連付けます。EndpointsController
システムコンポーネントは、セレクターに一致する Pod でセレクターを指定するサービスのエンドポイントを同期します。「サービスプロキシー」と OpenShift Container Platform 「ルーター」は、サービスに対する要求を、サービスのエンドポイント全体で負荷分散します。外部リソースを表すサービスには関連付けられる Pod が不要です。代わりに、
Selector
フィールドを未設定のままにします。これは外部サービスであることを表します。これによりEndpointsController
にこのサービスを無視させ、エンドポイントを手動で指定することができます。kind: "Service" apiVersion: "v1" metadata: name: "external-mysql-service" spec: ports: - name: "mysql" protocol: "TCP" port: 3306 targetPort: 3306 1 nodePort: 0 selector: {} 2
次に、サービスの必要なエンドポイントを作成します。これによりサービスプロキシーとルーターに対し、サービスにダイレクトされたトラフィックを送信する場所が指定されます。
kind: "Endpoints" apiVersion: "v1" metadata: name: "external-mysql-service" 1 subsets: 2 - addresses: - ip: "10.0.0.0" 3 ports: - port: 3306 4 name: "mysql"
18.2.1.2. 外部ドメイン名の使用
外部ドメイン名を使用すると、外部サービスの IP アドレスの変更について把握しておく必要がないために外部サービスのリンケージを管理するのが容易になります。
ExternalName
サービスにはセレクターまたは定義されたポートまたはエンドポイントがないため、ExternalName
サービスを使用してトラフィックを外部サービスにダイレクトすることができます。
kind: "Service"
apiVersion: "v1"
metadata:
name: "external-mysql-service"
spec:
type: ExternalName
externalName: example.domain.name
selector: {} 1
- 1
selector
フィールドは空白のままにします。
外部ドメイン名サービスを使用すると、システムに対して externalName
フィールドの DNS 名 (直前の例では example.domain.name
) がサービスをサポートするリソースの場所であることを示します。DNS 要求が Kubernetes DNS サーバーに対してなされる場合、CNAME レコードで externalName
を返し、クライアントに対して返された名前を検索して IP アドレスを取得するように指示します。
18.2.2. 手順 2: サービスの消費
サービスおよびエンドポイントが定義されたので、適切なコンテナーの環境変数を設定し、適切な Pod が認証情報にアクセスしてサービスを使用できるようにします。
kind: "DeploymentConfig" apiVersion: "v1" metadata: name: "my-app-deployment" spec: 1 strategy: type: "Rolling" rollingParams: updatePeriodSeconds: 1 2 intervalSeconds: 1 3 timeoutSeconds: 120 replicas: 2 selector: name: "frontend" template: metadata: labels: name: "frontend" spec: containers: - name: "helloworld" image: "origin-ruby-sample" ports: - containerPort: 3306 protocol: "TCP" env: - name: "MYSQL_USER" value: "${MYSQL_USER}" 4 - name: "MYSQL_PASSWORD" value: "${MYSQL_PASSWORD}" 5 - name: "MYSQL_DATABASE" value: "${MYSQL_DATABASE}" 6
外部データベースの環境変数
アプリケーションで外部サービスを使用することは内部サービスを使用することに似ています。アプリケーションには、直前の手順で説明されている認証情報と共に、サービスの環境変数と追加の環境変数が割り当てられます。たとえば、MySQL コンテナーは以下の環境変数を受信します。
-
EXTERNAL_MYSQL_SERVICE_SERVICE_HOST=<ip_address>
-
EXTERNAL_MYSQL_SERVICE_SERVICE_PORT=<port_number>
-
MYSQL_USERNAME=<mysql_username>
-
MYSQL_PASSWORD=<mysql_password>
-
MYSQL_DATABASE_NAME=<mysql_database>
アプリケーションは環境からサービスの位置情報 (coordinate) および認証情報を読み取り、サービス経由でデータベースとの接続を確立します。
18.3. 外部 SaaS プロバイダー
外部サービスの一般的なタイプは外部 SaaS エンドポイントです。外部 SaaS プロバイダーをサポートするために、アプリケーションには以下が必要になります。
- 通信に使用するエンドポイント
以下を含む認証情報のセット
- API キー
- ユーザー名
- パスフレーズ
以下の手順は、外部 SaaS プロバイダーとの統合シナリオについて説明しています。
18.3.1. IP アドレスおよびエンドポイントの使用
外部サービスを表す「OpenShift Container Platform サービス」を作成します。これは内部サービスの作成と同様ですが、サービスの
Selector
フィールドが異なります。内部 OpenShift Container Platform サービスは
Selector
フィールドで「ラベル」を使用して Pod をサービスに関連付けます。EndpointsController
と呼ばれるシステムコンポーネントは、セレクターと一致する pod でセレクターを指定するサービスのエンドポイントを同期します。「サービスプロキシー」と OpenShift Container Platform 「ルーター」は、サービスに対する要求を、サービスのエンドポイント全体で負荷分散します。外部リソースを表すサービスは関連付けられる Pod が不要です。代わりに、
Selector
フィールドを未設定のままにします。これによりEndpointsController
にこのサービスを無視させ、エンドポイントを手動で指定することができます。kind: "Service" apiVersion: "v1" metadata: name: "example-external-service" spec: ports: - name: "mysql" protocol: "TCP" port: 3306 targetPort: 3306 1 nodePort: 0 selector: {} 2
次に、サービスプロキシーおよびルーターにダイレクトされたトラフィックの送信先についての情報が含まれるサービスのエンドポイントを作成します。
kind: "Endpoints" apiVersion: "v1" metadata: name: "example-external-service" 1 subsets: 2 - addresses: - ip: "10.10.1.1" ports: - name: "mysql" port: 3306
サービスおよびエンドポイントが定義されたので、適切なコンテナーの環境変数を設定し、Pod にサービスを使用するための認証情報を付与します。
kind: "DeploymentConfig" apiVersion: "v1" metadata: name: "my-app-deployment" spec: 1 strategy: type: "Rolling" rollingParams: timeoutSeconds: 120 replicas: 1 selector: name: "frontend" template: metadata: labels: name: "frontend" spec: containers: - name: "helloworld" image: "openshift/openshift/origin-ruby-sample" ports: - containerPort: 3306 protocol: "TCP" env: - name: "SAAS_API_KEY" 2 value: "<SaaS service API key>" - name: "SAAS_USERNAME" 3 value: "<SaaS service user>" - name: "SAAS_PASSPHRASE" 4 value: "<SaaS service passphrase>"
これらの変数は環境変数としてコンテナーに追加されます。環境変数を使用することによりサービス間の通信が許可されます。これには API キーやユーザー名およびパスワード認証または証明書が必要になる場合とそうでない場合があります。
外部 SaaS プロバイダーの環境変数
内部サービスを作成する場合と同様に、アプリケーションには、直前の手順で説明されている認証情報と共に、サービスの環境変数と追加の環境変数が割り当てられます。直前の例では、コンテナーは以下の環境変数を受信します。
-
EXAMPLE_EXTERNAL_SERVICE_SERVICE_HOST=<ip_address>
-
EXAMPLE_EXTERNAL_SERVICE_SERVICE_PORT=<port_number>
-
SAAS_API_KEY=<saas_api_key>
-
SAAS_USERNAME=<saas_username>
-
SAAS_PASSPHRASE=<saas_passphrase>
アプリケーションは環境からサービスの位置情報 (coordinate) および認証情報を読み取り、サービス経由でデータベースとの接続を確立します。
18.3.2. 外部ドメイン名の使用
ExternalName
サービスにはセレクターや、定義されたポートまたはエンドポイントがありません。ExternalName
サービスを使用して、クラスター内にない外部サービスに、トラフィックを割り当てることができます。
kind: "Service"
apiVersion: "v1"
metadata:
name: "external-mysql-service"
spec:
type: ExternalName
externalName: example.domain.name
selector: {} 1
- 1
selector
フィールドは空白のままにします。
ExternalName
サービスを使用してサービスを externalName
フィールドの値 (直前の例では example.domain.name
) にマップします。これは CNAME レコードを挿入し、サービス名を外部 DNS アドレスに直接マップするので、エンドポイントのレコードは必要ありません。