web-dev-qa-db-ja.com

Google Kubernetes EngineでKubernetesロードバランサーの外部IPアドレスを選択する方法

私はGoogle Kubernetes Engineを使用してウェブアプリをデプロイしていますが、使用したいドメイン名のため、Google Cloud Platformの同じプロジェクトの一部として制御している既存の静的IPアドレスのロードバランサーを介してアクセスできるようにしたいすでにこのIPを指しています。

ポッドに使用したyamlファイルは次のとおりです。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    app: my-app
spec:
  containers:
  - name: my-container
    image: gcr.io/my-project/my-app:latest

以下を使用してロードバランサーを設定できます。

apiVersion: v1
kind: Service
metadata:
  name: my-load-balancer
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: my-app
  type: LoadBalancer

これにより、アプリにアクセスできる外部IPが提供されますが、必要なIPを使用するようにアプリを構成する方法が見つかりません。 services documentation はspec.clusterIP設定について言及していますが、これは外部IPとは関係がないようです。同様に、ロードバランサーがセットアップされると、サービスのstatus.loadBalancer.ingress.ipフィールドはその外部IPアドレスに設定されますが、これは構成可能な設定ではないようです。

別の方法として、Google Compute Engineコンソールで手動で転送ルールを作成して、静的IPアドレスからKubernetesによって設定されたターゲットプールにトラフィックを転送しようとしましたが、接続しようとすると接続が拒否されました。

選択した静的IPアドレスのGoogle KubernetesエンジンでKubernetesポッド(またはレプリケーションコントローラ)を公開する方法はありますか?

17
Ben

TL; DRKubernetesを実行するGoogle Container Enginev1.1は、loadBalancerIPのみをサポートします最初に自動割り当てIPをstaticとしてマークします。

Kubernetes v1.1は externalIPs をサポートしています:

apiVersion: v1
kind: Service
spec:
  type: LoadBalancer
  loadBalancerIP: 10.10.10.10
  ...

これまでのところ、GCEでの使用方法に関する一貫した適切なドキュメントはありません。確かに、このIPは事前に割り当てられた静的IPの1つでなければなりません。

クロスリージョン負荷分散 のドキュメントは、ほとんどがCompute Engine向けであり、Kubernetes/Container Engine向けではありませんが、特に「負荷分散サービスの構成」の部分は引き続き役立ちます。

GCEでKubernetes LoadBalancerを作成するだけの場合、クラスター上のマシンで構成されるターゲットプールを指すネットワークCompute Engine>ネットワーク>ネットワーク負荷分散>転送ルールが作成されます(通常、サービスセレクターに一致するポッドを実行するもののみ) 。名前空間を削除しても、作成されたルールが適切にクリーンアップされないようです。


更新

これは実際にサポートされています(たとえ文書化されていても):

  1. Kubernetes 1.1以降を実行していることを確認します( [〜#〜] gke [〜#〜]の下 クラスタを編集し、「ノードバージョン」を確認します)
  2. ネットワーキング>外部IPアドレス の下に、クラスターのVMインスタンスを指すEphemeralわからない、または不明な場合は、loadBalancerIPなしで1回デプロイし、kubectl get svcを実行するときに外部IPが割り当てられるまで待機し、そのページのリストでそのIPを検索します。そのうちの1つをstatic、たとえば外部アドレス10.10.10.10としましょう。
  3. LoadBalancerを編集して、上記のようにloadBalancerIP=10.10.10.10にします(Googleから提供されたIPに適応します)。

LoadBalancerまたはネームスペースを削除しても、そのクラスターで再利用するときにそのIPアドレスが保持されるはずです。クラスターを変更する必要がある場合は、手動で操作する必要があります。

  1. 「ネットワーク負荷分散」セクションの「ターゲットプール」タブ の下で、「ターゲットプールの作成」ボタンをクリックします:
    • 名前:cluster-pool(またはその他の名前)
    • リージョン:クラスターの1つのリージョンを選択します
    • ヘルスチェック:オプション、必要に応じて
    • 既存のインスタンスグループを選択します。Kubernetesクラスタ
  2. 「ネットワーク負荷分散」セクションの「転送ルール」タブ の下で、「転送ルールの作成」ボタンをクリックします:
    • 名前:http-cross-region-gfr(またはその他の名前)
    • リージョン:クラスターの1つのリージョンを選択します
    • 外部IP:予約したloadbalancer-ip-crossregionを選択します
    • ターゲットプール:作成したcluster-poolを選択します
9
Wernight

朗報です。これはKubernetes v1.1で修正されます。 service.spec.loadBalancerIPフィールドを所有しているIPに設定します。


前:

これは、亀裂から抜け出した機能です。動作するはずでしたが(ある時点で動作することもありました)、十分にテストされておらず、途中で壊れてしまい、誤って(一時的に)設計されました。

それは、1.0以降に修正するものの私の最終リストにあります。

https://github.com/GoogleCloudPlatform/kubernetes/issues/1032

8
Tim Hockin