Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

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

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

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

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

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

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

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

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

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

17.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
    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"
    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 の値に一致している必要があります。

17.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 アドレスを取得するように指示します。