GKE On-Prem は、Service や Ingress のような 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 ネットワーキング
- ノード 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 アドレスにアクセスすると、アプリケーションが読み込まれます。