ネットワーキング

GKE On-Prem は、ServiceIngress のような Kubernetes のネットワーキングのコンセプトを使用します。このドキュメントでは、すぐに使用可能な GKE On-Prem ネットワーキングの構成方法について説明します。

クラスタ サービスのオペレーションとアイランド モード

GKE On-Prem はアイランド モード構成を使用します。このモードでは、Pod はクラスタ内で相互に直接通信できますが、クラスタの外部から Pod へはアクセスできません。この構成により、外部ネットワークに接続されていないネットワーク内に「アイランド」が形成されます。クラスタはクラスタノード全体に完全なノード間メッシュを形成し、Pod がクラスタ内の他の Pod に直接アクセスできるようにします。

Pod からクラスタ外のターゲットに向かう下りトラフィックは、すべてノード IP によって NAT 処理されます。GKE On-Prem は、クラスタ内にデプロイされた ClusterIP Service の Ingress オブジェクト ルールを処理する Envoy ベースの Ingress コントローラを搭載した L7 ロードバランサを備えています。Ingress コントローラ自体は、クラスタ内の NodePort Service として公開されます。

Ingress NodePort Service には、L3/L4 F5 ロードバランサを介してアクセスできます。インストールにより、ロードバランサで仮想 IP アドレス(VIP)がポート 80 とポート 443 で構成されます。VIP は Ingress コントローラの NodePort Service のポートを参照します。これは外部クライアントがクラスタ内の Service にアクセスする方法です。

ユーザー クラスタは、loadBalancerIP フィールドが Service の仕様で構成されている限り、LoadBalancer のタイプの Service を実行できます。loadBalancerIP フィールドに、使用する VIP を指定する必要があります。これは、Service の NodePorts を指す F5 で構成されます。

F5 ロードバランサを使用する代わりに、手動負荷分散モードを有効にすることもできます。手動負荷分散を使用する場合、タイプ LoadBalancer の Service は実行できません。代わりに、タイプ NodePort の Service を作成し、それらをバックエンドとして使用するようにロードバランサを手動で構成できます。また、Ingress オブジェクトを使用して Service を外部クライアントに公開することもできます。

VMware NSX-T のサポート

バージョン 1.2.0-gke.6 以降の GKE On-Prem では、VMware NSX-T のバージョン 2.4.2 をサポートしています。

ネットワーキング アーキテクチャ

GKE On-Prem のアーキテクチャを説明する図 図: GKE On-Prem ネットワーキング

ノード IP アドレス
DHCP またはノードの静的に割り当てられた IP アドレス(あるいは、仮想マシンまたは VM と呼ばれる)。データセンター内部でルーティング可能であることが必要です。静的 IP を手動で割り当てることができます。
Pod CIDR ブロック
クラスタのすべての Pod にはルーティングできない CIDR ブロック。この範囲から、より小さい /24 範囲がノード単位で割り当てられます。N 個のノードを持つクラスタが必要な場合は、N 個の /24 ブロックをサポートするうえで十分な大きさが、このブロックにあることを確認します。
Service CIDR ブロック
アイランド モードでは、Pod CIDR ブロックの場合と同様に、クラスタ内でのみ使用されます。ノード、VIP、Pod の CIDR ブロックと重複しない非公開 CIDR ブロック。クラスタ間で同じブロックを共有できます。ブロックのサイズによってサービスの数が決まります。Ingress サービスには 1 つの Service IP が必要です。クラスタ DNS などの Kubernetes サービスには 10 個以上の IP が必要です。
Service VIP
Service を公開するときに、L4 Ingress の F5 に対して構成する N 個のルーティング可能な IP アドレス。これらの VIP は、LoadBalancer 型の Service の作成時に設定する loadBalancerIP 値と同じです。
コントロール プレーン VIP
Kubernetes API サーバーの F5 ロードバランサに対して構成するルーティング可能な IP アドレス。
Ingress VIP
各ノードで実行する Envoy プロキシとの関連で、L7 Ingress の F5 ロードバランサに対して構成するルーティング可能な IP アドレス。

ネットワーク構成オプション

クラスタのネットワークを構成する方法はいくつかあります。

  • 1 つのグローバル vCenter ネットワークを選択する、または管理クラスタとユーザー クラスタに別の vCenter ネットワークを使用することができます。
  • HTTP プロキシを使用し、プロキシから除外するアドレスを選択できます。
  • DHCP または静的 IP 割り振りを選択できます。
  • 統合または手動の負荷分散モードを選択できます。

インストール中に、GKE On-Prem の構成ファイルで設定を指定します。

vCenter ネットワークの構成

構成ファイルの network フィールドは、クラスタに使用する vCenter ネットワークを決定します。

  • グローバル vcenter.network フィールドは、1 つの特定のネットワークを指定します。
  • admincluster.vcenter.network はグローバル フィールドをオーバーライドし、管理クラスタに使用するネットワークを指定します。
  • usercluster.vcenter.network はグローバル フィールドをオーバーライドし、ユーザー クラスタに使用するネットワークを指定します。

例: URL 経由でウェブ アプリケーションにアクセスする

ゲストブック ウェブ アプリケーションが、frontend という名前の Deployment としてクラスタで実行されているとします。URL www.guestbook.com を使用してアプリケーションに接続することを必要としています。クラスタで実行されている Deployment に URL をマッピングする方法が必要です。これには Kubernetes Ingress オブジェクトを使用します。

まず、クラスタの既存の Ingress VIP を指定する *.guestbook.com のワイルドカード DNS エントリを作成します。

*.guestbook.com    A   [INGRESS_VIP]

続いて、フロントエンド Deployment の Service を作成する必要があります。kubectl expose を実行すると、Deployment の Pod を論理的にグループ化する Service が作成され、クラスタ内の共通の IP アドレスが指定されます。

kubectl expose deployment frontend

これで、次のような ClusterIP タイプの Service が作成されます。

apiVersion: v1
kind: Service
metadata:
  labels:
    app: guestbook
  name: frontend
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: guestbook
  type: ClusterIP

URL www.guestbook.com を先ほど作成したフロントエンド Service にマッピングする必要があります。以下の Ingress を適用すると、次のようにマッピングが作成されます。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: frontend
  labels:
    app: guestbook
spec:
  rules:
    - host: www.guestbook.com
      http:
        paths:
          - backend:
              serviceName: frontend   # name of the frontend Service
              servicePort: 80

次に www.guestbook.com にアクセスすると、ブラウザでウェブ アプリケーションが開きます。

この仕組みは次のとおりです。

  • ワイルドカード DNS エントリを作成したため、URL にアクセスするとクラスタの Ingress VIP にアクセスすることになります。
  • クラスタはホスト名に基づいて適切な Ingress オブジェクトを探します。この場合は www.guestbook.com です。
  • トラフィックはフロントエンド Pod にポート転送されます。

例: IP アドレス経由でウェブ アプリケーションにアクセスする

アプリケーションがウェブ アプリケーションでない場合や、ネットワークの制約がある場合は、Service 専用の VIP を作成することをおすすめします。これは、LoadBalancer タイプの Kubernetes Service を使用して行うことができます。

以下の Service は、guestbook アプリケーション専用の VIP を作成します。

apiVersion: v1
kind: Service
metadata:
  labels:
    app: guestbook
  name: frontend
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: guestbook
  type: LoadBalancer
  loadBalancerIP: [IP_ADDRESS]
  

この Service を適用すると、F5 コンソールに VIP が表示され、コンソールの [Pools] メニューにノードの IP アドレスが表示されます。IP アドレスにアクセスすると、アプリケーションが読み込まれます。