第18章 外部サービスの統合


18.1. 概要

数多くの OpenShift Container Platform アプリケーションは外部データベースや外部 SaaS エンドポイントなどの外部リソースを使用します。これらの外部リソースはネイティブの OpenShift Container Platform サービスとしてモデリングされ、アプリケーションが他の内部サービスの場合と同様にそれらを使用できるようにします。

「Egress トラフィック」はファイアウォールルールまたは Egress ルーターで制御できます。これにより、アプリケーションサービスの静的 IP アドレスの使用が許可されます。

18.2. 外部データベースのサービスの定義

外部サービスの最も一般的なタイプとして外部データベースを挙げることができます。外部データベースをサポートするには、アプリケーションで以下が必要になります。

  1. 通信するエンドポイント。
  2. 以下を含む認証情報および位置情報 (coordinate)。

    • ユーザー名
    • パスフレーズ
    • データベース名

外部データベースと統合するためのソリューションには、以下が含まれます。

  • Service オブジェクト: SaaS プロバイダーを OpenShift Container Platform サービスとして表示します。
  • 1 つ以上のサービスの Endpoint
  • 認証情報を含む適切な Pod の環境変数。

以下の手順は、外部 MySQL データベースとの統合シナリオについて説明しています。

18.2.1. 手順 1: サービスの定義

サービスは、IP アドレスとエンドポイントを指定するか、または完全修飾ドメイン名 (FQDN) を指定し定義することができます。

18.2.1.1. IP アドレスの使用

  1. 外部データベースを表す「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
    Copy to Clipboard Toggle word wrap
    1
    オプション: サービスによる接続の転送先となるバッキング Pod のポートです。
    2
    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"
    Copy to Clipboard Toggle word wrap
    1
    直前の手順で定義された Service インスタンスの名前です。
    2
    サービスへのトラフィックは、複数の指定がある場合に指定された Endpoints 間で負荷分散されます。
    3
    エンドポイント IP にはループバック (127.0.0.0/8)、リンクローカル (169.254.0.0/16)、またはリンクローカルマルチキャスト (224.0.0.0/24) を使用できません
    4
    port および name の定義は直前の手順で定義されたサービスの port および name の値に一致している必要があります。

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
Copy to Clipboard Toggle word wrap
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
Copy to Clipboard Toggle word wrap
1
DeploymentConfig の他のフィールドは省略されます。
2
個別の Pod 更新間の待機時間です。
3
更新後に実行されるデプロイメントステータスのポーリング間の待機時間です。
4
サービスで使用するユーザー名です。
5
サービスで使用するパスフレーズです。
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 プロバイダーをサポートするために、アプリケーションには以下が必要になります。

  1. 通信に使用するエンドポイント
  2. 以下を含む認証情報のセット

    1. API キー
    2. ユーザー名
    3. パスフレーズ

以下の手順は、外部 SaaS プロバイダーとの統合シナリオについて説明しています。

18.3.1. IP アドレスおよびエンドポイントの使用

  1. 外部サービスを表す「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
    Copy to Clipboard Toggle word wrap
    1
    オプション: サービスによる接続の転送先となるバッキング Pod のポートです。
    2
    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
    Copy to Clipboard Toggle word wrap
    1
    Service インスタンスの名前です。
    2
    サービスへのトラフィックはここで指定される subsets 間で負荷分散されます。
  3. サービスおよびエンドポイントが定義されたので、適切なコンテナーの環境変数を設定し、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>"
    Copy to Clipboard Toggle word wrap
    1
    DeploymentConfig の他のフィールドは省略されます。
    2
    SAAS_API_KEY: サービスで使用する API キーです。
    3
    SAAS_USERNAME: サービスで使用するユーザー名です。
    4
    SAAS_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
Copy to Clipboard Toggle word wrap
1
selector フィールドは空白のままにします。

ExternalName サービスを使用してサービスを externalName フィールドの値 (直前の例では example.domain.name) にマップします。これは CNAME レコードを挿入し、サービス名を外部 DNS アドレスに直接マップするので、エンドポイントのレコードは必要ありません。

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat