ロードバランサのサブネット

このページでは、GKE on AWS が AWS と連携して、サービス ロードバランサのサブネットを選択する方法と、サービス ロードバランサの作成時に自動検出されるようにサブネットにタグを付ける方法について説明します。

サブネットの指定が必要な理由

AWS は、クラウド ロードバランサの作成時に作成したクラウド ロードバランサを配置するサブネットを把握する必要があります。サブネットは、ロードバランサのアベイラビリティ ゾーン、IP アドレス、エンドポイントを決定します。

通常、ロードバランサは、ノードプールを含むアベイラビリティ ゾーンごとに 1 つのサブネットに割り当てられます。AWS では、ネットワーク ロードバランサ(NLB)の作成用に少なくとも 1 つのサブネットが必要で、アプリケーション ロードバランサ(ALB)用に少なくとも 2 つのサブネットが必要です。

すべての AWS サブネットは、パブリック(パブリック IP を持ち、VPC のインターネット ゲートウェイへのルートを持つ)、プライベート(これらの機能を持たない)のいずれかです。インターネットに接続するロードバランサは、パブリック サブネット上に配置する必要があります。内部ロードバランサは、パブリック サブネットまたはプライベート サブネットのいずれかに配置できます。

タグ付けされた利用可能なサブネットがない場合

GKE on AWS でロードバランサを作成する必要があり、タグ付けされたサブネットが使用できないか、容量がない場合は、別のサブネットにロードバランサが作成されることがあります。この問題を回避し、ロードバランサが配置されるサブネットを制御するには、すべてのサブネットにタグを付ける必要があります。

サブネットの自動検出

GKE on AWS は、VPC 内のすべてのサブネットをリストし、各アベイラビリティ ゾーンから最大 1 つのサブネットを選択して、ロードバランサに使用するサブネットを自動検出します。

GKE on AWS でサブネットを自動検出するには、サブネットが次の条件を満たしている必要があります。

  • kubernetes.io/role/elb でタグ付けされている(インターネットに接続するロードバランサの場合)
  • kubernetes.io/role/internal-elb でタグ付けされている(内部ロードバランサの場合)
  • 接頭辞 kubernetes.io/cluster/ 付きのタグが含まれていないか、タグ kubernetes.io/cluster/CLUSTER_UID が含まれている。CLUSTER_UID は現在のクラスタの UID。

また、インターネットに接続するロードバランサでの使用を想定したサブネットには、VPC のインターネット ゲートウェイへのルートが必要です。

アベイラビリティ ゾーンにロードバランサの要件を満たす複数のサブネットがある場合、GKE on AWS はサブネット ID の順序でサブネットをランク付けします。

サブネットに用途でタグ付けする

GKE on AWS がロードバランサのサブネットを自動検出するには、2 つのタグのいずれかをサブネットに適用して、可用性について通知する必要があります。それらは次のとおりです。

  • kubernetes.io/role/elb: このタグをサブネットに適用し、インターネットに接続するロードバランサで使用できるように設定します。これは、VPC のインターネット ゲートウェイへのルートを持つパブリック サブネットである必要があります。タグを 1 に設定します。このタグを適用するには、次のコマンドを実行します。

    aws ec2 create-tags \
      --resources SUBNET_ID \
      --tags "Key=kubernetes.io/role/elb,Value=1"
    
  • kubernetes.io/role/internal-elb: このタグをサブネットに適用し、内部ロードバランサで使用できるように設定します。タグの値を 1 に設定します。このタグを適用するには、次のコマンドを実行します。

    aws ec2 create-tags \
      --resources SUBNET_ID \
      --tags Key=kubernetes.io/role/internal-elb,Value=1
    

次のように置き換えます。

  • SUBNET_ID: タグを付けるサブネットの ID

サブネットに kubernetes.io/role をタグ付けしたら、1 つ以上の kubernetes.io/cluster/CLUSTER_UID タグを使用してタグ付けすることもできます。ここで、CLUSTER_UID は GKE on AWS クラスタの UID です。これにより、これらのタグで指定されていないクラスタでは、ロードバランサで使用するサブネットが自動検出されなくなります。

aws ec2 create-tags コマンドの詳細については、Amazon の aws ec2 create-tags のドキュメントをご覧ください。

トラブルシューティング

ロードバランサの構成で最も一般的な問題は、サブネットのタグ付けが誤っていることです。これにより、自動検出アルゴリズムで間違ったサブネットが選択されることがあります。この問題を診断して解決するには:

  • インターネットに接続するロードバランサを作成する場合は、ノードプールを含む各アベイラビリティ ゾーンに少なくとも 1 つのパブリック サブネットが存在し、サブネットに kubernetes.io/role/elb のタグが付けられていることを確認します。

  • 内部ロードバランサを作成する場合は、ノードプールを含む各アベイラビリティ ゾーンに少なくとも 1 つのサブネットがあり、サブネットが kubernetes.io/role/internal-elb でタグ付けされていることを確認してください。

  • 自動検出するサブネットに kubernetes.io/cluster/CLUSTER_UID 形式のタグがあるかどうかを確認します。サブネットにクラスタを指定するこのようなタグがある場合、サブネットは名前付きクラスタによってのみ自動検出されます。この問題を解決するには、(サブネットを任意のクラスタから自動検出できるように)すべてのクラスタ名タグを削除するか、または GKE on AWS クラスタの UID を持つクラスタ名タグと、shared の値を追加します。

  • 次のコマンドを使用して、Kubernetes のイベント履歴を確認します。

    kubectl get events -A | grep LoadBalancer
    

    たとえば、イベント メッセージ could not find any suitable subnets for creating the ELB は、サブネットを自動検出できないことを示しています。この警告が表示された場合は、サブネットとサブネットのタグが正しく、完全な状態であることを確認してください。

  • インターネットに接続するロードバランサ用に自動検出できるサブネットを一覧表示するには、次のコマンドを実行します。

    aws ec2 describe-subnets \
      --filters "Name=vpc-id,Values=VPC_ID" "Name=tag:kubernetes.io/role/elb,Values=*"
    

    VPC_ID を VPC の ID に置き換えます。

  • 内部ロードバランサ用に自動検出できるサブネットを一覧表示するには、次のコマンドを実行します。

    aws ec2 describe-subnets \
      --filters "Name=vpc-id,Values=VPC_ID" "Name=tag:kubernetes.io/role/internal-elb,Values=*"
    

次のステップ