View a markdown version of this page

EKS Hybrid Nodes ゲートウェイの使用を開始する - Amazon EKS

このページの改善にご協力ください

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「GitHub でこのページを編集する」リンクを選択してください。

EKS Hybrid Nodes ゲートウェイの使用を開始する

このページでは、Amazon EKS Hybrid Nodes ゲートウェイの前提条件、環境の準備、インストール、検証、削除について説明します。ゲートウェイとそのアーキテクチャの概要については、「Amazon EKS Hybrid Nodes ゲートウェイ」を参照してください。

前提条件

Hybrid Nodes ゲートウェイをインストールする前に、環境が以下の要件を満たしていることを確認してください。

  • Cilium CNI と VTEP をサポートする EKS クラスター — EKS クラスターはハイブリッドノードの CNI として Cilium の EKS バージョンを使用し、Cilium VTEP を有効にする必要があります。詳細については、「ハイブリッドノードゲートウェイの CNI を設定する」を参照してください。

  • クラウドノード上の AWS VPC CNI — クラスター内のゲートウェイノードと他のクラウドノードは AWS VPC CNI を使用する必要があります。ゲートウェイは VPC ネイティブルーティングを使用して、VPC と VXLAN トンネル間でトラフィックを転送します。

  • ハイブリッド接続 — VPC とオンプレミス環境間のプライベート接続が必要です。AWS Direct Connect、AWS Site-to-Site VPN、または独自の VPN ソリューションを使用できます。詳細については、「ハイブリッドノード用のネットワークを準備する」を参照してください。

  • VXLAN トラフィック許可 — ゲートウェイ EC2 インスタンスにアタッチされたセキュリティグループは、ポート 8472 でのインバウンド UDP トラフィックとアウトバウンド UDP トラフィックを許可する必要があります。ハイブリッドノード側では、オンプレミスファイアウォールルールでゲートウェイノード IP アドレスとの間の UDP ポート 8472 トラフィックも許可する必要があります。

  • ルートテーブル管理の IAM アクセス許可 — ゲートウェイでは、VPC ルートテーブルを管理するために以下の EC2 アクションが必要です。

    • ec2:DescribeRouteTables

    • ec2:CreateRoute

    • ec2:ReplaceRoute

    • ec2:DescribeInstances

      これらのアクセス許可は、以下のいずれかの方法で付与できます。

      EKS Pod Identity (recommended)

      EKS Pod Identity を使用して、ゲートウェイポッドのサービスアカウントにのみアクセス許可を付与します。

      1. EKS Pod Identity Agent アドオンがまだインストールされていない場合は、クラスターにインストールします。

        aws eks create-addon \ --cluster-name CLUSTER_NAME \ --addon-name eks-pod-identity-agent
      2. 必要な EC2 アクセス許可と EKS Pod Identity の信頼ポリシーを持つ IAM ロールを作成します。

        cat > gateway-trust-policy.json << 'EOF' { "Version": "2012-10-17" , "Statement": [ { "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": ["sts:AssumeRole", "sts:TagSession"] } ] } EOF aws iam create-role \ --role-name EKSHybridNodesGatewayRole \ --assume-role-policy-document file://gateway-trust-policy.json aws iam put-role-policy \ --role-name EKSHybridNodesGatewayRole \ --policy-name HybridNodesGatewayRouteTable \ --policy-document '{ "Version": "2012-10-17" , "Statement": [{ "Effect": "Allow", "Action": [ "ec2:DescribeRouteTables", "ec2:CreateRoute", "ec2:ReplaceRoute", "ec2:DescribeInstances" ], "Resource": "*" }] }'
      3. IAM ロールをゲートウェイサービスアカウントにリンクする Pod Identity 関連付けを作成します。

        aws eks create-pod-identity-association \ --cluster-name CLUSTER_NAME \ --namespace eks-hybrid-nodes-gateway \ --service-account eks-hybrid-nodes-gateway \ --role-arn arn:aws:iam::ACCOUNT_ID:role/EKSHybridNodesGatewayRole
      Node IAM role

      ゲートウェイノードのインスタンスプロファイルに関連付けられた IAM ロールに必要なアクセス許可を持つインラインポリシーまたはマネージドポリシーをアタッチします。

      aws iam put-role-policy \ --role-name NODE_ROLE_NAME \ --policy-name HybridNodesGatewayRouteTable \ --policy-document '{ "Version": "2012-10-17" , "Statement": [{ "Effect": "Allow", "Action": [ "ec2:DescribeRouteTables", "ec2:CreateRoute", "ec2:ReplaceRoute", "ec2:DescribeInstances" ], "Resource": "*" }] }'

      ゲートウェイノード上のすべてのポッドには、これらのアクセス許可があります。

  • EKS Auto Mode (ゲートウェイノードに Auto Mode を使用している場合) — EKS Auto Mode を使用してゲートウェイノードをプロビジョニングする場合は、EKS クラスターで Auto Mode を有効にする必要があります。詳細については、「既存の EKS クラスターで EKS 自動モードを有効にする」を参照してください。

ゲートウェイノードを準備する

ゲートウェイには、高可用性のために少なくとも 2 つの EC2 ノードが必要です。ゲートウェイでは、以下の 2 つのノード設定オプションがサポートされています。

  • EKS Auto Mode (推奨) — ノードは NodePoolNodeClass を使用して自動的にプロビジョニングされます。送信元/送信先チェック、ラベル、テイントはすべて宣言的に設定されます。

  • マネージドノードグループ — マネージド型ノードグループまたはセルフマネージド型ノードを使用してノードをプロビジョニングします。ラベルはマネージド型ノードグループ API を使用して設定でき、送信元/送信先チェックはユーザーデータを含むカスタム起動テンプレートを使用して無効にできます。

EKS Auto Mode (推奨)

EKS Auto Mode を使用する場合は、Helm チャートをインストールする前に NodePoolNodeClass を作成する必要があります。NodePool は、正しいラベル、テイント、送信元/送信先チェック設定を使用して EC2 インスタンスをプロビジョニングします。ノードを手動でプロビジョニングまたは設定する必要はありません。

以下のリソースをクラスターに適用し、プレースホルダー値を置き換えます。

  • YOUR_NODE_ROLE — EKS Auto Mode がノードをプロビジョニングするために使用するノード IAM ロールの名前。これは、クラスターで Auto Mode を有効にしたときに設定した (または EKS が作成した) ロールです。詳細については、「Amazon EKS 自動モードノードの IAM ロール」を参照してください。

  • YOUR_CLUSTER_NAME — EKS クラスター名。

  • SUBNET_ID_1SUBNET_ID_2 — ゲートウェイノードがプロビジョニングされる異なるアベイラビリティーゾーンのサブネット ID。

apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: hybrid-gateway spec: advancedNetworking: sourceDestCheck: DisabledPrimaryENI role: YOUR_NODE_ROLE securityGroupSelectorTerms: - tags: aws:eks:cluster-name: YOUR_CLUSTER_NAME subnetSelectorTerms: - id: SUBNET_ID_1 - id: SUBNET_ID_2 --- apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: hybrid-gateway spec: template: metadata: labels: hybrid-gateway-node: "true" spec: expireAfter: 336h nodeClassRef: group: eks.amazonaws.com kind: NodeClass name: hybrid-gateway requirements: - key: karpenter.sh/capacity-type operator: In values: - on-demand - key: eks.amazonaws.com/instance-category operator: In values: - c - m - r - key: eks.amazonaws.com/instance-generation operator: Gt values: - "4" - key: kubernetes.io/arch operator: In values: - amd64 - key: kubernetes.io/os operator: In values: - linux taints: - key: hybrid-gateway-node effect: NoSchedule terminationGracePeriod: 24h0m0s disruption: budgets: - nodes: 10% consolidateAfter: 30s consolidationPolicy: WhenEmptyOrUnderutilized

この設定のキーフィールド:

  • advancedNetworking.sourceDestCheck: DisabledPrimaryENI — ノードのプライマリ ENI の EC2 送信元/送信先チェックを無効にして、ゲートウェイがそれ自体にアドレス指定されていないトラフィックを転送できるようにします。

  • taintshybrid-gateway-node: NoSchedule テイントは、これらのノードで許容範囲スケジュールが一致するゲートウェイポッドのみを確保します。

  • labelshybrid-gateway-node: "true" ラベルは、Helm チャートのノードセレクタによって使用され、ゲートウェイポッドをこれらのノードにターゲットにします。

  • nodeClassRef — NodePool を、送信元/送信先チェック設定と NodeClass にリンクします。

マネージドノードグループ

マネージド型ノードグループを使用する場合は、必要なラベル、テイント、および起動時に送信元/送信先チェックを無効にするカスタム起動テンプレートを使用して、ゲートウェイ専用のノードグループを作成します。

ステップ 1: 起動テンプレートを作成する

インスタンスの起動時にプライマリ ENI の送信元/送信先チェックを無効にするユーザーデータを含む起動テンプレートを作成します。

# Create the launch template with user data to disable source/dest check USERDATA=$(cat <<'SCRIPT' | base64 -w 0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==BOUNDARY==" --==BOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" \ -H "X-aws-ec2-metadata-token-ttl-seconds: 60") MAC=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \ http://169.254.169.254/latest/meta-data/mac) ENI_ID=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \ "http://169.254.169.254/latest/meta-data/network/interfaces/macs/${MAC}/interface-id") REGION=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \ http://169.254.169.254/latest/meta-data/placement/region) aws ec2 modify-network-interface-attribute \ --network-interface-id "$ENI_ID" \ --no-source-dest-check \ --region "$REGION" --==BOUNDARY==-- SCRIPT ) aws ec2 create-launch-template \ --launch-template-name YOUR_CLUSTER_NAME-gateway-lt \ --launch-template-data "{\"UserData\":\"${USERDATA}\",\"MetadataOptions\":{\"HttpTokens\":\"required\",\"HttpPutResponseHopLimit\":2}}"
注記

ノードの IAM ロールには、ユーザーデータスクリプトを成功させるための ec2:ModifyNetworkInterfaceAttribute アクセス許可が必要です。MIME マルチパート形式により、ユーザーデータは EKS ブートストラップスクリプトと一緒に実行されます。

ステップ 2: マネージド型ノードグループを作成する

ステップ 1 のゲートウェイラベル、テイント、起動テンプレートを使用して、専用のマネージド型ノードグループを作成します。

aws eks create-nodegroup \ --cluster-name YOUR_CLUSTER_NAME \ --nodegroup-name YOUR_CLUSTER_NAME-gateway-nodes \ --subnets SUBNET_ID_1 SUBNET_ID_2 \ --node-role YOUR_NODE_ROLE_ARN \ --instance-types INSTANCE_TYPE \ --ami-type AL2023_x86_64_STANDARD \ --scaling-config desiredSize=2,maxSize=2,minSize=2 \ --labels hybrid-gateway-node=true \ --taints "key=hybrid-gateway-node,effect=NO_SCHEDULE" \ --launch-template "name=YOUR_CLUSTER_NAME-gateway-lt,version=1"

これにより、以下の設定を持つ 2 ノードのマネージド型ノードグループが作成されます。

  • --labels は、Helm チャートのノードセレクタがこれらのノードをターゲットにするように hybrid-gateway-node=true を設定します。

  • --taintsNoSchedule テイントを追加して、これらのノードで許容範囲スケジュールが一致するゲートウェイポッドのみを追加します。

  • --launch-template は、起動時に送信元/送信先チェックを無効にする起動テンプレートをアタッチします。

高可用性を実現するために、異なるアベイラビリティーゾーンのサブネットを使用します。

Helm を使用してインストールする

EKS 自動モード

以下のコマンドを実行して、EKS Auto Mode でゲートウェイをインストールします。

helm install eks-hybrid-nodes-gateway \ oci://public.ecr.aws/eks/eks-hybrid-nodes-gateway \ --version 1.0.0 \ --namespace eks-hybrid-nodes-gateway \ --create-namespace \ --set vpcCIDR=VPC_CIDR \ --set podCIDRs=POD_CIDRS \ --set routeTableIDs=ROUTE_TABLE_IDS

マネージド型ノードグループまたはセルフマネージド型ノード

マネージド型ノードグループまたはセルフマネージド型ノードの場合は、autoMode.enabled=false を設定します。

helm install eks-hybrid-nodes-gateway \ oci://public.ecr.aws/eks/eks-hybrid-nodes-gateway \ --version 1.0.0 \ --namespace eks-hybrid-nodes-gateway \ --create-namespace \ --set autoMode.enabled=false \ --set vpcCIDR=VPC_CIDR \ --set podCIDRs=POD_CIDRS \ --set routeTableIDs=ROUTE_TABLE_IDS

必要な Helm 値

すべてのインストールには、以下の値が必要です。

説明

vpcCIDR

EKS クラスター VPC の CIDR ブロック (例: 10.0.0.0/16)。ハイブリッドノードがゲートウェイを介して VPC バウンドトラフィックをルーティングするように Cilium VTEP 設定に使用されます。

podCIDRs

ハイブリッドノードで Cilium が使用するポッド CIDR のカンマ区切りリスト (例: 10.100.0.0/16,10.101.0.0/16)。ゲートウェイは、これらの CIDR の VPC ルートテーブルエントリと VXLAN ルートを作成します。

routeTableIDs

プログラムする VPC ルートテーブル ID のカンマ区切りリスト (例: rtb-0abc1234def567890,rtb-0fed9876cba543210)。ゲートウェイは、ハイブリッドポッド CIDR がアクティブなゲートウェイインスタンスを指すように、ルートをこれらのテーブルに作成します。

設定可能な値の完全なリストについては、「Amazon EKS Hybrid Nodes ゲートウェイ設定リファレンス」を参照してください。

インストールの検証

ゲートウェイをインストールしたら、ゲートウェイが実行中で正常であることを確認します。

ポッドのステータスを確認する

2 つのゲートウェイポッドが実行されていることを確認します。

kubectl get pods -n eks-hybrid-nodes-gateway

次のような出力が表示されます:

NAME READY STATUS RESTARTS AGE eks-hybrid-nodes-gateway-5d4f6a7b8c-abc12 1/1 Running 0 2m eks-hybrid-nodes-gateway-5d4f6a7b8c-def34 1/1 Running 0 2m

リーダー選出を確認する

1 つのポッドがリーダー選出リースを取得したことを確認します。

kubectl get lease -n eks-hybrid-nodes-gateway

出力には、HOLDER 列に現在のリーダーが表示されます。

NAME HOLDER AGE hybrid-gateway-leader eks-hybrid-nodes-gateway-5d4f6a7b8c-abc12 2m

ヘルスエンドポイントを確認する

ポート転送を使用して、ヘルスエンドポイントがリーダーポッドで応答していることを確認します。

kubectl port-forward -n eks-hybrid-nodes-gateway LEADER_POD_NAME 8088:8088 & curl -s http://localhost:8088/healthz

正常なゲートウェイは HTTP 200 レスポンスを返します。

VPC ルートテーブルエントリを検証する

Amazon VPC コンソールまたは AWS CLI を使用して、VPC ルートテーブルに、リーダーゲートウェイインスタンスの ENI を指すハイブリッドポッド CIDR のエントリが含まれていることを確認します。

aws ec2 describe-route-tables \ --route-table-ids ROUTE_TABLE_ID \ --query "RouteTables[].Routes[?DestinationCidrBlock=='[.replaceable]`POD_CIDR`']"

各ハイブリッドポッド CIDR には、リーダーインスタンスのプライマリ ENI に NetworkInterfaceId が設定されたルートが必要です。

アンインストール

Hybrid Nodes ゲートウェイを削除するには、以下を実行します。

helm uninstall eks-hybrid-nodes-gateway --namespace eks-hybrid-nodes-gateway
注記

Helm チャートをアンインストールしても、ゲートウェイによって作成された VPC ルートテーブルエントリは自動的に削除されません。アンインストール後、ハイブリッドポッド CIDR のルートを VPC ルートテーブルから手動で削除し、ゲートウェイが実行されなくなったインスタンスにトラフィックがルーティングされないようにします。AWS CLI を使用してルートを削除できます。

aws ec2 delete-route \ --route-table-id ROUTE_TABLE_ID \ --destination-cidr-block POD_CIDR

次のステップ