

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

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

# EKS Hybrid Nodes ゲートウェイの使用を開始する
<a name="hybrid-nodes-gateway-getting-started"></a>

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

## 前提条件
<a name="hybrid-nodes-gateway-prerequisites"></a>

Hybrid Nodes ゲートウェイをインストールする前に、環境が以下の要件を満たしていることを確認してください。
+  **Cilium CNI と VTEP をサポートする EKS クラスター** — EKS クラスターはハイブリッドノードの CNI として Cilium の EKS バージョンを使用し、Cilium VTEP を有効にする必要があります。詳細については、「[ハイブリッドノードゲートウェイの CNI を設定する](hybrid-nodes-gateway-cni.md)」を参照してください。
+  **クラウドノード上の AWS VPC CNI** — クラスター内のゲートウェイノードと他のクラウドノードは AWS VPC CNI を使用する必要があります。ゲートウェイは VPC ネイティブルーティングを使用して、VPC と VXLAN トンネル間でトラフィックを転送します。
+  **ハイブリッド接続** — VPC とオンプレミス環境間のプライベート接続が必要です。AWS Direct Connect、AWS Site-to-Site VPN、または独自の VPN ソリューションを使用できます。詳細については、「[ハイブリッドノード用のネットワークを準備する](hybrid-nodes-networking.md)」を参照してください。
+  **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](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html) を使用して、ゲートウェイポッドのサービスアカウントにのみアクセス許可を付与します。

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

       ```
       aws eks create-addon \
         --cluster-name {{CLUSTER_NAME}} \
         --addon-name eks-pod-identity-agent
       ```

    1. 必要な 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": "*"
           }]
         }'
       ```

    1. 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 自動モードを有効にする](https://docs.aws.amazon.com/eks/latest/userguide/migrate-auto.html)」を参照してください。

## ゲートウェイノードを準備する
<a name="hybrid-nodes-gateway-prepare-nodes"></a>

ゲートウェイには、高可用性のために少なくとも 2 つの EC2 ノードが必要です。ゲートウェイでは、以下の 2 つのノード設定オプションがサポートされています。
+  [EKS Auto Mode (推奨)](#hybrid-nodes-gateway-auto-mode-nodes) — ノードは `NodePool` と `NodeClass` を使用して自動的にプロビジョニングされます。送信元/送信先チェック、ラベル、テイントはすべて宣言的に設定されます。
+  [マネージドノードグループ](#hybrid-nodes-gateway-mng-nodes) — マネージド型ノードグループまたはセルフマネージド型ノードを使用してノードをプロビジョニングします。ラベルはマネージド型ノードグループ API を使用して設定でき、送信元/送信先チェックはユーザーデータを含むカスタム起動テンプレートを使用して無効にできます。

### EKS Auto Mode (推奨)
<a name="hybrid-nodes-gateway-auto-mode-nodes"></a>

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

以下のリソースをクラスターに適用し、プレースホルダー値を置き換えます。
+  {{YOUR\_NODE\_ROLE}} — EKS Auto Mode がノードをプロビジョニングするために使用するノード IAM ロールの名前。これは、クラスターで Auto Mode を有効にしたときに設定した (または EKS が作成した) ロールです。詳細については、「[Amazon EKS 自動モードノードの IAM ロール](https://docs.aws.amazon.com/eks/latest/userguide/auto-create-node-role.html)」を参照してください。
+  {{YOUR\_CLUSTER\_NAME}} — EKS クラスター名。
+  {{SUBNET\_ID\_1}}、{{SUBNET\_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 送信元/送信先チェックを無効にして、ゲートウェイがそれ自体にアドレス指定されていないトラフィックを転送できるようにします。
+  `taints` — `hybrid-gateway-node: NoSchedule` テイントは、これらのノードで許容範囲スケジュールが一致するゲートウェイポッドのみを確保します。
+  `labels` — `hybrid-gateway-node: "true"` ラベルは、Helm チャートのノードセレクタによって使用され、ゲートウェイポッドをこれらのノードにターゲットにします。
+  `nodeClassRef` — NodePool を、送信元/送信先チェック設定と NodeClass にリンクします。

### マネージドノードグループ
<a name="hybrid-nodes-gateway-mng-nodes"></a>

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

#### ステップ 1: 起動テンプレートを作成する
<a name="_step_1_create_a_launch_template"></a>

インスタンスの起動時にプライマリ 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: マネージド型ノードグループを作成する
<a name="_step_2_create_the_managed_node_group"></a>

ステップ 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` を設定します。
+  `--taints` は `NoSchedule` テイントを追加して、これらのノードで許容範囲スケジュールが一致するゲートウェイポッドのみを追加します。
+  `--launch-template` は、起動時に送信元/送信先チェックを無効にする起動テンプレートをアタッチします。

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

## Helm を使用してインストールする
<a name="hybrid-nodes-gateway-install"></a>

### EKS 自動モード
<a name="hybrid-nodes-gateway-install-auto"></a>

以下のコマンドを実行して、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}}
```

### マネージド型ノードグループまたはセルフマネージド型ノード
<a name="hybrid-nodes-gateway-install-mng"></a>

マネージド型ノードグループまたはセルフマネージド型ノードの場合は、`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 値
<a name="hybrid-nodes-gateway-required-values"></a>

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


| 値 | 説明 | 
| --- | --- | 
|  `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 ゲートウェイ設定リファレンス](hybrid-nodes-gateway-configuration.md)」を参照してください。

## インストールの検証
<a name="hybrid-nodes-gateway-verify"></a>

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

### ポッドのステータスを確認する
<a name="hybrid-nodes-gateway-verify-pods"></a>

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
```

### リーダー選出を確認する
<a name="hybrid-nodes-gateway-verify-leader"></a>

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

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

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

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

### ヘルスエンドポイントを確認する
<a name="hybrid-nodes-gateway-verify-health"></a>

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

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

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

### VPC ルートテーブルエントリを検証する
<a name="hybrid-nodes-gateway-verify-routes"></a>

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

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

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

## アンインストール
<a name="hybrid-nodes-gateway-uninstall"></a>

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}}
```

## 次のステップ
<a name="hybrid-nodes-gateway-getting-started-next"></a>
+  [Amazon EKS Hybrid Nodes ゲートウェイ設定リファレンス](hybrid-nodes-gateway-configuration.md) — Helm 値、CLI フラグ、リーダー選出パラメータをカスタマイズします。
+  [Amazon EKS Hybrid Nodes ゲートウェイオペレーション](hybrid-nodes-gateway-operations.md) — ゲートウェイをモニタリングし、フェイルオーバーの動作を理解し、スケーリングを計画します。
+  [Amazon EKS Hybrid Nodes ゲートウェイのトラブルシューティング](hybrid-nodes-gateway-troubleshooting.md) — 一般的な問題を診断して解決します。