GKE 用 Service Directory を構成する

このページでは、Google Kubernetes Engine(GKE)で Service Directory を構成し、GKE クラスタを Service Directory に自動的に登録する方法について説明します。GKE 用 Service Directory は、Autopilot GKE クラスタまたは Standard GKE クラスタで構成できます。 2 つのモードの詳細については、 GKE のオペレーションモードを選択するをご覧ください。

GKE 用 Service Directory の詳細については、 GKE 用 Service Directory の概要をご覧ください。

制限事項

GKE 用 Service Directory には次の制限があります。

  • サービスは、Service Directory と GKE の統合を使用してのみ登録できます。Ingress、ゲートウェイ、その他のリソースは、Service Directory API を使用して手動で登録する必要があります。
  • クラスタ内のサービスを Service Directory に同期するには、まず フリートを使用して GKE クラスタを登録する必要があります。GKE クラスタを登録する方法の詳細については、クラスタを登録するをご覧ください。
  • すべての Service Directory リソースは、クラスタのプロジェクトではなく、フリート プロジェクトに登録されます。
  • この統合を使用して登録された Service Directory エンティティは変更できません。Service Directory に伝播するように、GKE サービス リソース自体に変更を加える必要があります。

始める前に

  • アカウントにログインします。 Google Cloud を初めて使用する場合は、 アカウントを作成して、実際のシナリオで Google プロダクトのパフォーマンスを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  • Verify that billing is enabled for your Google Cloud project.

  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  • Verify that billing is enabled for your Google Cloud project.

GKE クラスタを設定する

GKE クラスタを設定する手順は次のとおりです。

  • Service Directory GKE フリート機能を有効にします。
  • Service Directory 登録ポリシーを構成します。
  • GKE サービスをデプロイします。

Service Directory GKE フリート機能を有効にする

Service Directory GKE フリート 機能を有効にするには、 gcloud container hub コマンドを実行します。

gcloud

gcloud alpha container hub service-directory enable

サービスの Service Directory 登録ポリシーを構成する

登録ポリシーは、GKE 内のどの種類のサービスが Service Directory に自動的にインポートされるかを定義します。このポリシーで構成可能なオプションは次のとおりです。

  • resources: インポートされる GKE リソースのタイプ。複数のリソースタイプを指定できます。リソースは GroupKind で識別されます。デフォルトでは、Groupcore です。Kind: service のみを使用できます。
  • selector: GKE リソースに適用される key:value ラベルに一致する GKE ラベルセレクタ。デフォルトでは、リソースは選択されていません。
  • annotationsToSync: Service Directory に同期されるリソースのアノテーション キー。このリストが空の場合、リソースはアノテーションなしで Service Directory に同期されます。

各 Namespace には単一のポリシーを定義する必要があります。このポリシーには name: "default" が必要です。Controller では、他の名前は許可されず、調整もされません。

ServiceDirectoryRegistrationPolicy を構成します。

次のマニフェストは、ServiceDirectoryRegistrationPolicy を記述しています。

apiVersion: networking.gke.io/v1alpha1
kind: ServiceDirectoryRegistrationPolicy
metadata:
    # Only the name "default" is allowed.
    name: default
    # The ServiceDirectoryRegistrationPolicy is a namespaced resource
    namespace: NAMESPACE
spec:
  resources:
    # Kind specifies the types of Kubernetes resources that can be synced into Service Directory.
    - kind: Service
      # Selector is a label selector for the resource types specified in Kind.
      selector:
        matchLabels:
          LABELS
      # annotationsToSync specifies the annotations that are matched and imported.
      # Any annotations that do not match this set of keys will not be imported into Service Directory.
      annotationsToSync:
      - ANNOTATIONS
      

次のように置き換えます。

  • NAMESPACE: Namespace の名前。Namespace には ServiceDirectoryRegistrationPolicy を 1 つだけ含めることができます。1 つの Namespace に複数のポリシーがある場合、GKE は 1 つのポリシーをアクティブ ポリシーとして選択し、他のポリシーを非アクティブとしてマークします。
  • LABELS: ラベルセレクタ(sd-import: "true" など)。 この値は、種類で指定されたリソースに適用されます。デフォルトでは、 リソースは選択されていません。
  • ANNOTATIONS: 一致してインポートされるアノテーションのリスト(- cloud.google.com/load-balancer-type など)。選択した GKE リソースにリスト内のアノテーションのいずれかが含まれている場合、アノテーションとその値はリソースとともに Service Directory に同期されます。このリストが空の場合、リソースは Service Directory にアノテーションなしで同期されます。

マニフェストを registration_policy.yaml として保存します。

マニフェストをクラスタに適用する

マニフェストをクラスタに適用するには、kubectl apply -f コマンドを実行します。

kubectl apply -f registration_policy.yaml

GKE サービスをデプロイする

リージョンの GKE クラスタに GKE 外部パススルー ネットワーク ロードバランサ サービスと アプリケーションをデプロイします。たとえば、リージョンが us-central1 の場合は、GKE クラスタ gke-us-central1 にデプロイします。

これにより、GKE サービスが Service Directory にインポートされます。

YAML ファイルを作成し、他の GKE リソースと同様に適用します。LoadBalancer タイプの Service のマニフェストは次のとおりです。

apiVersion: v1
kind: Service
metadata:
  name: hello-app-service
  labels:
    sd-import: "true"
  annotations:
    cloud.google.com/load-balancer-type: "Internal"
spec:
  type: LoadBalancer
  selector:
    app: hello
  ports:
  - name: tcp-port
    protocol: TCP
    port: 80
    targetPort: 8080

Deployment のマニフェストは次のとおりです。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: hello
  name: hello-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: hello
  template:
    metadata:
      labels:
        app: hello
    spec:
      containers:
      - image: gcr.io/google-samples/hello-app:1.0
        name: hello
        ports:
        - containerPort: 8080
          protocol: TCP

確認するには、サービスの Service Directory クエリを gcloud service-directory services resolve コマンドを使用して実行します。

gcloud

gcloud beta service-directory services resolve SERVICE_NAME \
  --location=LOCATION \
  --namespace=NAMESPACE

次のように置き換えます。

  • SERVICE_NAME: サービスの名前または完全修飾識別子(hello-app-service など)
  • LOCATION: サービスのリージョンの名前(us-central1 など)
  • NAMESPACE: サービスの Namespace の名前(default など)

出力にはサービスが表示されます。出力は次のようになります。

service:
  endpoints:
  - address: 10.140.0.5
    metadata:
      cloud.google.com/load-balancer-type: "Internal"
    name: projects/my-project/locations/us-central1/namespaces/default/services/hello-app-service/endpoints/my-cluster-12345
    port: 80
    network: projects/123456789/locations/global/networks/default
  name: projects/my-project/locations/us-central1/namespaces/default/services/hello-app-service

課金

Service Directory では、GKE 統合によって作成されたリソースに対して課金されません。ただし、API 呼び出しには料金がかかります。料金の詳細については、Service Directory の料金をご覧ください。

次のステップ