ネットワーキング

Anthos clusters on VMware(GKE On-Prem)は、ServiceIngress などの Kubernetes ネットワークのコンセプトを使用します。このドキュメントでは、すぐに使用できる Anthos clusters on VMware ネットワーキングの構成について説明します。

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

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

Pod からクラスタ外のターゲットに向かう下り(外向き)トラフィックは、すべてノード IP によって NAT 処理されます。Anthos clusters on VMware には、クラスタ内にデプロイされた 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 の NodePort を指すようにロードバランサで構成されます。

VMware 上の Anthos クラスタは、いくつかの負荷分散オプションをサポートしています。

  • Seesaw によるバンドル型負荷分散
  • F5 BIG-IP による統合負荷分散
  • F5 BIG-IP による手動負荷分散
  • Citrix による手動負荷分散

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

VMware NSX-T のサポート

バージョン 1.2.0-gke.6 以降、Anthos clusters on VMware は VMware NSX-T バージョン 2.4.2 をサポートしています。

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

Anthos clusters on VMware のアーキテクチャを説明する図 Anthos clusters on VMware ネットワーキング

ノード 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 割り振りを選択できます。
  • 統合または手動の負荷分散モードを選択できます。

インストール時に、クラスタ構成ファイルでどれを使うかを指定します。

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
  annotations:
    kubernetes.io/ingress.class: istio
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 アドレスにアクセスすると、アプリケーションが読み込まれます。