Google Cloud Platform Service Broker(ベータ版、非推奨)を使用して Cloud Pub/Sub にアクセスする

このチュートリアルでは、Kubernetes Service Catalog と Google Cloud Platform(GCP)Service Broker を使用して、GKE で実行するアプリケーションを Cloud Pub/Sub と接続する方法について説明します。

Service Catalog を使用する理由

Service Catalog を使用すると、認証情報やエンドポイントなどの情報を手動でインポートしなくても、クラスタ上で実行されるアプリケーションで外部サービスを容易に検出して接続できます。外部サービスの依存関係は Kubernetes リソースとしてモデル化されており、既存のデプロイ プロセスに容易に統合できます。

このチュートリアルでは、Service Catalog の次の機能を使用します。

  • Service Catalog を介して Service Broker 内の Google Cloud Platform サービスを検出する。
  • Cloud リソースを作成するために、サービス インスタンスプロビジョニングする
  • クラスタに認証情報を挿入するため、プロビジョニングされたサービス インスタンスを Kubernetes アプリケーションでバインドする
  • アプリケーションのサービス バインディングを使用して、Cloud リソースを参照するサービス インスタンスにアクセスする。

Service Catalog の詳細については、Kubernetes Service Catalog のドキュメントをご覧ください。

目標

このチュートリアルでは、次の手順について説明します。

  1. 名前空間の作成
  2. IAM サービス アカウントの作成
  3. Pub/Sub トピックの作成
  4. トピックへの Pub/Sub サブスクリプションの作成
  5. デモアプリを使用した Pub/Sub サービスのテスト
  6. クリーンアップ

始める前に

次の手順で Kubernetes Engine API を有効にします。
  1. Google Cloud Platform Console で [Kubernetes Engine] ページにアクセスします。
  2. プロジェクトを作成または選択します。
  3. API と関連サービスが有効になるのを待ちます。これには数分かかることがあります。
  4. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 詳しくは、課金を有効にする方法をご覧ください。

このチュートリアルで使用されている以下のコマンドライン ツールをインストールします。

  • Kubernetes Engine クラスタを作成および削除するには、gcloud を使用します。gcloudGoogle Cloud SDK に含まれています。
  • kubectl は、Kubernetes Engine で使用されるクラスタ オーケストレーション システムである Kubernetes を管理するために使用されます。gcloud を使用して kubectl をインストールできます。
    gcloud components install kubectl

gcloud コマンドライン ツールのデフォルトの設定

次のコマンドを実行してデフォルト値を設定しておくと、gcloud コマンドライン ツールでプロジェクト IDCompute Engine ゾーンの各オプションを入力する時間を節約できます。
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone [COMPUTE_ENGINE_ZONE]

Service Catalog を設定する

  • GKE クラスタに Service Catalog をインストールし、さらに Service Broker もインストールします。
  • コマンドラインで kubectl を使用して Service Catalog が実行中であることを確認して、すべての Service Catalog プロセスを一覧表示します。

    kubectl get deployment -n service-catalog

    デプロイはすべて AVAILABLE であると報告されます。

  • (省略可)svcat CLI ツールをインストールします。このツールを使用すると、Service Catalog のリソース操作に関するユーザー エクスペリエンスが向上します。

ステップ 1: 名前空間を作成する

名前空間は省略可能ですが、このチュートリアルのクリーンアップを容易にするため、作成をおすすめします。

名前空間名を、環境変数としてエイリアス設定します。

NAMESPACE=pubsub-app

Cloud Pub/Sub を使用してアプリケーションの名前空間を作成します。次のコマンドを実行します。

kubectl create namespace [NAMESPACE]

次のメッセージが出力されます。

namespace "pubsub-app" created

ステップ 2: IAM サービス アカウントを作成する

アプリケーションで GCP サービスを使用するには、IAM サービス アカウントが必要です。このチュートリアルでは、ID pubsub-sa を使用してこのアカウントを作成します。

それ以外の場合は、Service Catalog を使用して、IAM サービス アカウントを作成できます。これは、cloud-iam-service-account サービスクラスのサービス インスタンスのプロビジョニングとバインディングによって行うことができます。

IAM サービス アカウント インスタンスのプロビジョニング

次のコマンドを使用して、サービス アカウント名を環境変数に格納します。

SERVICE_ACCOUNT_ID=pubsub-sa

svcat

svcat コマンドを使用して、サービス アカウント インスタンスをプロビジョニングします。

svcat provision gcp-iam \
    --class cloud-iam-service-account \
    --plan beta \
    --namespace [NAMESPACE] \
    --param accountId=$SERVICE_ACCOUNT_ID

このコマンドで、次のメッセージが出力されます。

  Name:        gcp-iam
  Namespace:   pubsub-app
  Status:
  Class:       cloud-iam-service-account
  Plan:        beta

Parameters: accountId: pubsub-sa

次のコマンドを使用して、サービス インスタンスのステータスを確認します。

svcat get instance gcp-iam --namespace [NAMESPACE]

出力は次のようになります。

   NAME     NAMESPACE              CLASS             PLAN   STATUS
+---------+------------+---------------------------+------+--------+
  gcp-iam   pubsub-app   cloud-iam-service-account   beta   Ready

STATUS が Ready の場合、サービス インスタンスは正常にプロビジョニングされています。

kubectl

次の仕様で iam_instance.yaml という名前の ServiceInstance YAML ファイルを作成します。serviceAccount フィールドの値は必ず echo $SERVICE_ACCOUNT_ID と同じにしてください。

apiVersion: servicecatalog.k8s.io/v1beta1
kind: ServiceInstance
metadata:
  name: gcp-iam
  namespace: pubsub-app
spec:
  # This should match with a SERVICE EXTERNAL NAME
  # in the list of available services.
  clusterServiceClassExternalName: cloud-iam-service-account
  # This should match with a PLAN EXTERNAL NAME
  # in the list of available service plans.
  clusterServicePlanExternalName: beta
  parameters:
    accountId: pubsub-sa

kubectl コマンドでこの YAML ファイルを使用してサービス アカウント インスタンスをプロビジョニングします。

kubectl apply -f iam_instance.yaml

このコマンドで、次のメッセージが出力されます。

serviceinstance "gcp-iam" created

次のコマンドを使用して、サービス インスタンスのステータスを確認します。

kubectl get serviceinstances gcp-iam -n [NAMESPACE] -o 'custom-columns=INSTANCE-NAME:.metadata.name,SERVICE:.spec.clusterServiceClassExternalName,PLAN:.spec.clusterServicePlanExternalName,STATUS:.status.conditions[0].reason'

出力は次のようになります。

INSTANCE-NAME   SERVICE                     PLAN      STATUS
gcp-iam         cloud-iam-service-account   beta      ProvisionedSuccessfully

サービス インスタンスが正常にプロビジョニングされると、Cloud Console で対応する IAM サービス アカウント pubsub-sa@[PROJECT_ID].iam.gserviceaccount.com を確認できるようになります。

IAM サービス アカウント インスタンスへのバインディング

サービス アカウント インスタンスにバインドすると、シークレットが同じ名前空間に作成されます。シークレットには、サービス アカウント名と秘密鍵が格納されます。これらはアプリケーションで簡単に参照できます。

次のコマンドを使用して、シークレット名を環境変数に格納します。

SA_SECRET_NAME=pubsub-credentials

svcat

svcat コマンドを使用して、サービス アカウント インスタンスにバインドします。

svcat bind gcp-iam --namespace [NAMESPACE] --secret-name $SA_SECRET_NAME

このコマンドで、次のメッセージが出力されます。

  Name:        gcp-iam
  Namespace:   pubsub-app
  Status:
  Instance:    gcp-iam

Parameters: {}

次のコマンドを使用して、サービス バインディングのステータスを確認します。

svcat get binding gcp-iam --namespace [NAMESPACE]

出力は次のようになります。

   NAME     NAMESPACE    INSTANCE   STATUS
+---------+------------+----------+--------+
  gcp-iam   pubsub-app   gcp-iam    Ready

サービス バインディングのステータスが Ready になるまで待ってから、処理を続行します。これにはしばらく時間がかかることがあります。

kubectl

次の仕様で iam_binding.yaml という名前の ServiceBinding YAML ファイルを作成します。

apiVersion: servicecatalog.k8s.io/v1beta1
kind: ServiceBinding
metadata:
  name: gcp-iam
  namespace: pubsub-app
spec:
  instanceRef:
    name: gcp-iam
  secretName: pubsub-credentials

次のコマンドを実行して、サービス バインディングを作成します。

kubectl apply -f iam_binding.yaml

次のコマンドを実行して、サービス バインディングのステータスを確認します。

kubectl get servicebindings gcp-iam -n [NAMESPACE] -o 'custom-columns=BINDING-NAME:.metadata.name,SERVICE-INSTANCE:.spec.instanceRef.name,STATUS:.status.conditions[0].reason,OUTPUT-SECRET:.spec.secretName'

出力は次のようになります。

BINDING-NAME      SERVICE-INSTANCE   STATUS               OUTPUT-SECRET
gcp-iam           gcp-iam            InjectedBindResult   gcp-iam

サービス バインディングが正常に作成されたら、次の kubectl コマンドを使用してシークレットが存在することを確認します。

kubectl get secrets $SA_SECRET_NAME --namespace [NAMESPACE]

出力は次のようになります。

NAME                 TYPE      DATA      AGE
pubsub-credentials   Opaque    2         1m

サービス アカウントの認証情報が格納されたシークレットを表示することもできます。

kubectl get secrets $SA_SECRET_NAME --namespace [NAMESPACE] -o yaml

privateKeyData 値が Base64 でエンコードされていることと、サービス アカウントの秘密鍵が含まれていることがわかります。

ステップ 3: Pub/Sub トピックを作成する

Pub/Sub サービス インスタンスのプロビジョニング

ここでは、Service Catalog を使用して Pub/Sub サービス インスタンスをプロビジョニングします。そうすることで、アプリケーションで公開および参照される Pub/Sub トピックが作成されます。

svcat

svcat コマンドを使用して Pub/Sub サービス インスタンスをプロビジョニングします。

svcat provision gcp-pubsub \
    --class cloud-pubsub \
    --plan beta \
    --namespace [NAMESPACE] \
    --param topicId=pubsub-app

このコマンドで、次のメッセージが出力されます。

  Name:        gcp-pubsub
  Namespace:   pubsub-app
  Status:
  Class:       cloud-pubsub
  Plan:        beta

Parameters: topicId: pubsub-app

次のコマンドを使用して、サービス インスタンスのステータスを確認します。

svcat get instance gcp-pubsub --namespace [NAMESPACE]

出力は次のようになります。

     NAME      NAMESPACE       CLASS       PLAN   STATUS
+------------+------------+--------------+------+--------+
  gcp-pubsub   pubsub-app   cloud-pubsub   beta   Ready

STATUS が Ready の場合、サービス インスタンスは正常にプロビジョニングされています。

kubectl

次の仕様で pubsub_instance.yaml という名前の ServiceInstance YAML ファイルを作成します。

apiVersion: servicecatalog.k8s.io/v1beta1
kind: ServiceInstance
metadata:
  name: gcp-pubsub
  namespace: pubsub-app
spec:
  clusterServiceClassExternalName: cloud-pubsub
  # This should match with a PLAN EXTERNAL NAME
  # in the list of available service plans for Pub/Sub.
  clusterServicePlanExternalName: beta
  parameters:
    topicId: pubsub-app

次のコマンドを使用して、Pub/Sub サービス インスタンスをプロビジョニングします。

kubectl create -f pubsub_instance.yaml

次のメッセージが出力されます。

serviceinstance "gcp-pubsub" created

次のコマンドを使用して、Pub/Sub サービス インスタンスのステータスを確認します。

kubectl get serviceinstances gcp-pubsub -n [NAMESPACE] -o 'custom-columns=INSTANCE-NAME:.metadata.name,SERVICE:.spec.clusterServiceClassExternalName,PLAN:.spec.clusterServicePlanExternalName,STATUS:.status.conditions[0].reason'

次のようなステータス メッセージが出力されます。

INSTANCE-NAME   SERVICE        PLAN      STATUS
gcp-pubsub      cloud-pubsub   beta      ProvisionedSuccessfully

Pub/Sub サービス インスタンスが正常にプロビジョニングされると、Cloud Console で対応する Pub/Sub トピック projects/[PROJECT_ID]/topics/pubsub-app を確認できるようになります。

Pub/Sub サービス インスタンスへのバインディング

Pub/Sub サービス インスタンスにバインドすることで、次の処理が行われます。

  • 指定された IAM サービス アカウントに Pub/Sub サービスにアクセスするための適切な権限が付与されます。
  • Kubernetes アプリケーションがサービス インスタンスへのアクセスに必要な情報を Kubernates シークレットの形式で利用できるようになります。
  • 必要に応じて、Pub/Sub トピックのサブスクリプションが作成されます。

このバインディングは、デモ アプリケーションには必須です。アプリケーションを特定のサービス アカウント ID で実行して、Pub/Sub トピックにメッセージを公開するには、そのサービスへのアクセス権が必要になるためです。

Pub/Sub サービスクラスには、複数のタイプのサービス バインディングがあります。まず、タイプ publisher のサービス バインディングを作成します。これには roles/pubsub.publisherroles/pubsub.viewer の 2 つの役割が含まれています。このバインディングにより、サービス アカウントでこのトピックへの公開とメッセージの表示ができるようになります。

ヒント: Cloud Pub/Sub の IAM の役割と権限の詳細については、Cloud Pub/Sub の [アクセス制御ドキュメント](/pubsub/docs/access-control#tbl_roles)をご覧ください。

svcat

svcat コマンドを使用して、publisher として Pub/Sub トピックにバインドします。

svcat bind gcp-pubsub --namespace [NAMESPACE] --params-json '{
  "serviceAccount": "'${SERVICE_ACCOUNT_ID}'",
  "roles": [
    "roles/pubsub.publisher",
    "roles/pubsub.viewer"
  ]
}'

このコマンドは、次のメッセージを出力します(serviceAccount 値は、前にユーザーが作成したサービス アカウントの名前である場合があります)。

  Name:        gcp-pubsub
  Namespace:   pubsub-app
  Status:
  Instance:    gcp-pubsub

Parameters: roles:

  • roles/pubsub.publisher
  • roles/pubsub.viewer serviceAccount: pubsub-sa

次のコマンドを使用して、サービス バインディングのステータスを確認します。

svcat get binding gcp-pubsub --namespace [NAMESPACE]

出力は次のようになります。

     NAME      NAMESPACE     INSTANCE    STATUS
+------------+------------+------------+--------+
  gcp-pubsub   pubsub-app   gcp-pubsub   Ready

サービス バインディングのステータスが Ready になるまで待ってから、処理を続行します。これにはしばらく時間がかかることがあります。

kubectl

次の仕様で pubsub_binding.yaml という名前の ServiceBinding YAML ファイルを作成し、publisher として Pub/Sub トピックにバインドします。serviceAccount フィールドの値は必ず echo $SERVICE_ACCOUNT_ID と同じにしてください。

apiVersion: servicecatalog.k8s.io/v1beta1
kind: ServiceBinding
metadata:
  name: gcp-pubsub
  namespace: pubsub-app
spec:
  instanceRef:
    name: gcp-pubsub
  parameters:
    serviceAccount: pubsub-sa
    roles:
    - roles/pubsub.publisher
    - roles/pubsub.viewer

Cloud Pub/Sub サービス インスタンスにバインドします。

kubectl create -f pubsub_binding.yaml

次のコマンドを実行して、サービス バインディングのステータスを確認します。

kubectl get servicebindings gcp-pubsub -n [NAMESPACE] -o 'custom-columns=BINDING-NAME:.metadata.name,SERVICE-INSTANCE:.spec.instanceRef.name,STATUS:.status.conditions[0].reason,OUTPUT-SECRET:.spec.secretName'

InjectedBindResult ステータスが表示されます。

バインディングの結果として作成された gcp-pubsub シークレットには、プロジェクト(projectId)、サービス アカウント(serviceAccount)、トピック ID(topicId)が含まれています。次のコマンドを実行すると、シークレットを確認できます。

kubectl get secrets gcp-pubsub --namespace [NAMESPACE] -o yaml

ステップ 4: トピックの Pub/Sub サブスクリプションを作成する

トピックに公開するための Pub/Sub サービス インスタンスへのバインディングと同様に、デモ アプリケーションでもトピックにサブスクライブしてメッセージを参照するためにサービス バインディングが必要です。

ここでは、Pub/Sub サービス インスタンスへのサービス バインディングを別途作成し、今回はタイプを subscriber とします。これには、サブスクリプションと 2 つの役割(roles/pubsub.subscriberroles/pubsub.viewer)が含まれます。これにより、このトピックの Pub/Sub サブスクリプションが作成され、サービス アカウントでこのサブスクリプションからメッセージを pull して表示できるようになります。

svcat

svcat コマンドを使用して、subscriber として Pub/Sub トピックにバインドします。

svcat bind gcp-pubsub \
    --name gcp-pubsub-subscription \
    --namespace [NAMESPACE] \
    --params-json '{
      "serviceAccount": "'${SERVICE_ACCOUNT_ID}'",
      "roles": [
        "roles/pubsub.subscriber",
        "roles/pubsub.viewer"
      ],
      "subscription": {
        "subscriptionId": "pubsub-app"
      }
    }'

このコマンドは、次のメッセージを出力します(serviceAccount 値は、前にユーザーが作成したサービス アカウントの名前である場合があります)。

  Name:        gcp-pubsub-subscription
  Namespace:   pubsub-app
  Status:
  Instance:    gcp-pubsub

Parameters: roles:

  • roles/pubsub.subscriber
  • roles/pubsub.viewer serviceAccount: pubsub-sa subscription: subscriptionId: pubsub-app

次のコマンドを使用して、サービス バインディングのステータスを確認します。

svcat get binding gcp-pubsub-subscription --namespace [NAMESPACE]

出力は次のようになります。

           NAME             NAMESPACE     INSTANCE    STATUS
+-------------------------+------------+------------+--------+
  gcp-pubsub-subscription   pubsub-app   gcp-pubsub   Ready

サービス バインディングのステータスが Ready になるまで待ってから、処理を続行します。これにはしばらく時間がかかることがあります。

kubectl

pubsub_subscription_binding.yaml という名前の ServiceBinding YAML ファイルを作成し、subscriber として Pub/Sub トピックにバインドします。serviceAccount フィールドの値は必ず echo $SERVICE_ACCOUNT_ID と同じにしてください。

apiVersion: servicecatalog.k8s.io/v1beta1
kind: ServiceBinding
metadata:
  name: gcp-pubsub-subscription
  namespace: pubsub-app
spec:
  instanceRef:
    name: gcp-pubsub
  parameters:
    serviceAccount: pubsub-sa
    roles:
    - roles/pubsub.subscriber
    - roles/pubsub.viewer
    subscription:
      subscriptionId: pubsub-app

Cloud Pub/Sub サービス インスタンスにバインドします。

kubectl create -f pubsub_subscription_binding.yaml

次のコマンドを実行して、サービス バインディングのステータスを確認します。

kubectl get servicebindings gcp-pubsub-subscription -n [NAMESPACE] -o 'custom-columns=BINDING-NAME:.metadata.name,SERVICE-INSTANCE:.spec.instanceRef.name,STATUS:.status.conditions[0].reason,OUTPUT-SECRET:.spec.secretName'

InjectedBindResult ステータスが表示されます。

新しいサブスクリプション projects/[PROJECT_ID]/subscriptions/pubsub-appCloud Console で確認できます。バインディングの結果として作成された gcp-pubsub-subscription シークレットには、プロジェクト(projectId)、サービス アカウント(serviceAccount)、トピック ID(topicId)、サブスクリプション ID(subscriptionId)が含まれています。次のコマンドを実行すると、シークレットを確認できます。

kubectl get secrets gcp-pubsub-subscription --namespace [NAMESPACE] -o yaml

ステップ 5: デモアプリで Pub/Sub サービスをテストする

GKE クラスタでデモアプリを実行して、Cloud Pub/Sub サービスとの接続をテストします。

次の仕様で hello_pubsub_world.yaml という名前の Kubernetes ジョブファイルを作成します(サービス アカウントの秘密鍵を格納するシークレットを手動で作成した場合は、secretName の値を [SA_SECRET_NAME] に置き換えてください)。

apiVersion: batch/v1
kind: Job
metadata:
  name: hello-pubsub-world
  namespace: pubsub-app
spec:
  template:
    spec:
      volumes:
        # Make the 'pubsub-credentials' secret available as volume
        # 'google-cloud-key'.
        - name: google-cloud-key
          secret:
            secretName: pubsub-credentials
      restartPolicy: OnFailure
      containers:
        - name: hello-pubsub-world
          image: gcr.io/gcp-services/samples/hello-pubsub-world
          volumeMounts:
            # Mount the 'google-cloud-key' volume into the container file
            # system.
            - name: google-cloud-key
              mountPath: /var/secrets/google
          env:
            # Pass the path to the private key JSON file from the mounted volume
            # to the environment variable.
            - name: "GOOGLE_APPLICATION_CREDENTIALS"
              value: /var/secrets/google/privateKeyData

            # The two environment variables below come from the 'gcp-pubsub'
            # secret and, together, point at the Cloud Pub/Sub topic to use.
            - name: "GOOGLE_CLOUD_PROJECT_ID"
              valueFrom:
                secretKeyRef:
                  # Use the projectId value from the 'gcp-pubsub' secret created
                  # as a result of binding to the Pub/Sub service instance.
                  name: gcp-pubsub
                  key: projectId
            - name: "GOOGLE_CLOUD_PUBSUB_TOPIC"
              valueFrom:
                secretKeyRef:
                  # Use the topicId value from the 'gcp-pubsub' secret created
                  # as a result of binding to the Pub/Sub service instance.
                  name: gcp-pubsub
                  key: topicId

            # The environment variable below come from the
            # 'gcp-pubsub-subscription' secret and, together with the
            # GOOGLE_CLOUD_PROJECT_ID above, point at the Cloud Pub/Sub
            # subscription to use.
            - name: "GOOGLE_CLOUD_PUBSUB_SUBSCRIPTION"
              valueFrom:
                secretKeyRef:
                  # Use the subscriptionId value from the
                  # 'gcp-pubsub-subscription' secret created as a result of the
                  # subscription binding to the Pub/Sub service instance.
                  name: gcp-pubsub-subscription
                  key: subscriptionId

IAM サービス アカウントと Pub/Sub サービス インスタンスへのバインディングで作成された [SA_SECRET_NAME]IAM サービス アカウントを新規作成した場合は pubsub-credentials)、gcp-pubsubgcp-pubsub-subscription シークレットの値がどのように使用されているかに注意してください。

ジョブを作成します。

kubectl apply -f hello_pubsub_world.yaml

このコマンドで、次のメッセージが出力されます。

job "hello-pubsub-world" created

ポッドのリストを表示します。

kubectl get pods --namespace [NAMESPACE] --show-all

該当する名前空間で実行されているポッドの詳細が次のように表示されます。

NAME                       READY     STATUS      RESTARTS   AGE
hello-pubsub-world-zh8hm   0/1       Completed   0          1m

ポッドのステータスが Completed になるのを待ってから、次のコマンドを使用してポッドのログを確認します。

kubectl -n [NAMESPACE] logs [POD_NAME]

次のようなエントリが含まれる行が表示されます。

Publishing 10 messages.
Publishing done.
Subscribing 10 messages.
Got message: "hello world #9"
Got message: "hello world #0"
Got message: "hello world #1"
Got message: "hello world #2"
Got message: "hello world #3"
Got message: "hello world #4"
Got message: "hello world #5"
Got message: "hello world #6"
Got message: "hello world #7"
Got message: "hello world #8"
Subscription done.

クリーンアップ

このチュートリアルで使用するリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

  1. デモの名前空間を削除します。これにより、アプリ、サービス バインディング、サービス インスタンスが削除されます。

    kubectl delete namespace [NAMESPACE]
  2. Service Catalog のクリーンアップの詳細については、こちらのガイドをご覧ください。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のドキュメント