複数クラスタ Ingress の設定

概要

複数のリージョンに存在する複数の Google Kubernetes Engine クラスタで実行されるアプリケーションがある場合は、ユーザーに最も近いリージョンのクラスタにトラフィックをルーティングできます。

このページでは、kubemci コマンドライン ツールで Kubernetes Ingress を使用して Cloud HTTP ロードバランサを構成し、異なるリージョンにある複数のクラスタ間でトラフィックをルーティングします。

始める前に

このタスクを準備するには、次の手順を実行します。

  • Cloud SDK がインストール済みであることを確認します。
  • 次のコマンドで gcloud を初期化します。

    gcloud init
    • 使用するアカウントを選択するか、新しいアカウントでログインします。
    • プロジェクト ID を入力するか、新しいプロジェクトを作成します。
    • デフォルトのコンピューティング リージョンとコンピューティング ゾーンを構成します。
  • Google Cloud SDK を認証し、Google Cloud Platform サービス全体のデータの表示と管理を許可します。

    gcloud auth login
  • Google Auth Library を認証し、Google Cloud Platform サービス全体のデータの表示と管理を許可します。

    gcloud auth application-default login
  • kubectl コマンドライン ツールをインストールします。

    gcloud components install kubectl
  • 同じ GCP プロジェクトとネットワークで実行されている GKE クラスタが 2 つ以上存在することを確認します。

kubemci コマンドライン ツールをダウンロードする

kubemci は、複数クラスタ Ingress の作成と構成に使用する主要なコマンドライン ツールです。

いずれかのバイナリをダウンロードして、実行可能なパスに格納します。

バイナリが実行可能であることを確認します。これを行うには、バイナリのディレクトリで次のコマンドを使用します。

chmod +x ./kubemci

複数クラスタ Ingress を作成する

クラスタを準備する

複数クラスタ Ingress で使用する各サービスは、すべてのクラスタで同じように構成されている必要があります。具体的には、サービスは以下のように構成する必要があります。

  • すべてのクラスタで名前が同じであること。
  • すべてのクラスタで同じ名前空間に存在すること。
  • タイプが NodePort であること。
  • すべてのクラスタに同じポート番号が使用されていること。

    たとえば、Ingress で service-fooservice-bar の 2 つのサービスが必要である場合は、次のようにします。

    • service-foo は、すべてのクラスタでポート 30016 の nodePort とします。
    • service-bar は、すべてのクラスタでポート 30017 の nodePort とします。

詳細な手順については、各クラスタに nodePort サービスをデプロイするのセクションをご覧ください。

kubeconfig ファイルを作成する

kubemci コマンドライン ツールには、トラフィックを受信する GKE クラスタのクラスタ接続情報が格納された kubeconfig ファイルが必要です。

クラスタごとに次のコマンドを実行して、すべてのクラスタの認証情報が記載された kubeconfig ファイルを作成します。

KUBECONFIG=[PATH/TO/MCI_KUBECONFIG_FILE]
gcloud container clusters get-credentials \
    --zone=[ZONE_NAME] [CLUSTER_NAME]

例:

KUBECONFIG=~/mcikubeconfig gcloud container clusters get-credentials --zone=us-east4-a  cluster-us-east
KUBECONFIG=~/mcikubeconfig gcloud container clusters get-credentials --zone=europe-west1-c  cluster-eu-west
KUBECONFIG=~/mcikubeconfig gcloud container clusters get-credentials --zone=asia-east1-b  cluster-apac-east

各クラスタに NodePort サービスをデプロイする

サービスとアプリケーションのデプロイ マニフェスト ファイルを同じディレクトリに配置して、デプロイを容易にします。たとえば、次のファイルを両方とも app/ ディレクトリに配置します。

デプロイ マニフェスト ファイルの例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: hello-app
        image: gcr.io/google-samples/hello-app:1.0

サービス マニフェスト ファイルの例

apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-app
  name: service-foo
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
    name: http
    nodePort: 30061
  selector:
    app: my-app
  type: NodePort

次のループを実行すると、すべてのクラスタを反復的に処理して、nodePort サービスとともにアプリケーションをデプロイするコンテキストを取得できます。

KUBECONFIG=[PATH/TO/MCI_KUBECONFIG_FILE]
for ctx in $(kubectl config get-contexts -o name); do
  kubectl --context="${ctx}" create -f [PATH/TO/APP/FILES]
done

静的 IP を予約する

次のコマンドを実行して、Google Cloud Platform で複数クラスタ Ingress の静的 IP をリクエストします。

gcloud compute addresses create --global [IP_RESOURCE_NAME]

たとえば、IP リソースに my-mci-ip という名前を付けた場合は、次のようになります。

gcloud compute addresses create --global my-mci-ip

Ingress リソースを準備する

各クラスタの Ingress リソースの仕様では、メタデータの annotations フィールドと backend フィールドに複数クラスタ Ingress の値が構成されている必要があります。

Ingress リソース ファイル mcingress.yaml の例を次に示します。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-foo
  annotations:
    kubernetes.io/ingress.global-static-ip-name: my-mci-ip
    kubernetes.io/ingress.class: gce-multi-cluster
spec:
  backend:
    serviceName: service-foo
    servicePort: 80

annotations を追加または変更する

  • kubernetes.io/ingress.global-static-ip-name の値を [IP_RESOURCE_NAME] に設定します。
  • kubernetes.io/ingress.class の値を gce-multi-cluster に設定します。

backend サービスを設定する

  • serviceName の値をデフォルトのサービスの名前に設定します。
  • servicePort の値をデフォルトのサービスのポートに設定します。

複数クラスタ Ingress をデプロイする

kubemci で次のコマンドを使用して複数クラスタ Ingress を作成します。

kubemci create [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[optional PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE]
例:
kubemci create my-mci \
    --ingress=mcingress.yaml \
    --gcp-project=my-gcp-project \
    --kubeconfig=~/mcikubeconfig

作成プロセスを確認する一連のメッセージが出力されます。次に例を示します。

Ensuring health checks
...
Health check mci1-hc-30061--my-mci created successfully
...
Backend service mci1-be-30061--my-mci created successfully
...
URL Map mci1-um--my-mci created successfully
...
Target http proxy mci1-tp--my-mci created successfully
...
Forwarding rule mci1-fw--my-mci created successfully
...
Firewall rule mci1-fr--my-mci created successfully

Success.

複数クラスタ Ingress のステータスを取得する

次のコマンドを実行すると、kubemci を使用して作成された既存の複数クラスタ Ingress をすべてリストできます。

kubemci list --gcp-project=[PROJECT_ID]

次のような複数クラスタ Ingress のリストが出力されます。

NAME           IP              CLUSTERS
my-mci   1.2.3.4   gke_my-gcp-project_asia-east1-b_cluster-asia-east, gke_my-gcp-project_europe-west1-c_cluster-eu-west, gke_my-gcp-project_us-east4-a_cluster-us-east

次のコマンドを使用すると、特定の複数クラスタ Ingress のステータスを取得できます。

kubemci get-status [INGRESS_NAME] --gcp-project=[PROJECT_ID]

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

Load balancer my-mci has IPAddress 1.2.3.4 and is spread across 3 clusters
(gke_project-name_asia-east1-b_cluster-asia-east, gke_project-name_europe-west1-c_cluster-eu-west,
gke_project-name_us-east4-a_cluster-us-east)

既存の複数クラスタ Ingress を更新する

--force フラグを使用する

既存の複数クラスタ Ingress を更新するには、--force フラグを指定して kubemci create コマンドを実行します。

kubemci create [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE] \
    --force

削除して再作成する

複数クラスタ Ingress を更新するには、削除してから再作成する方法もあります。

kubemci delete [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE]
kubemci create [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE]

既存の複数クラスタ Ingress からクラスタを削除する

既存の複数クラスタ Ingress からクラスタを削除するには、まずクラスタから削除するクラスタのリストが記載された kubeconfig を作成し、次に kubemci remove-clusters コマンドを実行します。

kubemci remove-clusters [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/REMOVAL_KUBECONFIG_FILE]

複数クラスタ Ingress を削除する

複数クラスタ Ingress を削除するには、kubemci delete コマンドを使用します。

kubemci delete [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE]

削除プロセスを確認する一連のメッセージが出力されます。たとえば、次のようになります。

Deleting Ingress from cluster: gke_project-name_asia-east1-b_cluster-asia-east...
...
firewall rule mci1-fr--my-mci deleted successfully
...
http forwarding rule mci1-fw--my-mci deleted successfully
...
target HTTPS proxy mci1-tps--my-mci deleted successfully
...
ssl cert mci1-ssl--my-mci deleted successfully
...
url map mci1-um--my-mci deleted successfully
...
Successfully deleted all backend services
...
Successfully deleted all health checks

次のステップ

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

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

Kubernetes Engine のドキュメント