

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

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

# ハイブリッドノード用に Kubernetes Ingress を設定する
<a name="hybrid-nodes-ingress"></a>

このトピックでは、Amazon EKS Hybrid Nodes で実行されているワークロード用に Kubernetes Ingress を設定する方法について説明します。[Kubernetes Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) は、クラスターの外部からクラスター内のサービスに至るまでの HTTP ルートと HTTPS ルートを公開します。Ingress リソースを利用するには、ネットワークトラフィックを処理するネットワークインフラストラクチャとネットワークコンポーネントをセットアップするために Kubernetes Ingress コントローラーが必要です。

 AWS は、EKS Hybrid Nodes で実行されているワークロード向けに AWS Application Load Balancer (ALB) と Cilium for Kubernetes Ingress をサポートしています。Ingress に ALB を使用するか Cilium を使用するかは、アプリケーショントラフィックのソースに基づきます。アプリケーショントラフィックの発信元が AWS リージョンである場合、AWS では AWS ALB と AWS Load Balancer Controller の使用を推奨しています。アプリケーショントラフィックの発信元がローカルのオンプレミス環境またはエッジ環境である場合、AWS では Cilium に組み込みの Ingress 機能の使用を推奨しています。この機能は、お使いの環境にロードバランサーインフラストラクチャを搭載しているかどうかにかかわらず使用できます。

![\[EKS Hybrid Nodes の Ingress\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/images/hybrid-nodes-ingress.png)


## AWS Application Load Balancer
<a name="hybrid-nodes-ingress-alb"></a>

ハイブリッドノード上で実行されているワークロードのターゲットタイプが `ip` の場合、[AWS Load Balancer](aws-load-balancer-controller.md) と Application Load Balancer (ALB) を使用できます。ターゲットタイプ `ip` を使用している場合、ALB はトラフィックをポッドに直接転送して、Service レイヤーネットワークパスをバイパスします。ALB がハイブリッドノード上のポッド IP ターゲットに到達するためには、オンプレミスネットワークでオンプレミスポッド CIDR をルーティング可能である必要があります。また、AWS Load Balancer Controller はウェブフックを使用し、EKS コントロールプレーンからの直接通信が必要です。詳細については、「[ハイブリッドノード用のウェブフックを設定する](hybrid-nodes-webhooks.md)」を参照してください。

### 考慮事項
<a name="_considerations"></a>
+ AWS Application Load Balancer と AWS Load Balancer Controller の詳細については、「[Application Load Balancer を使用してアプリケーションと HTTP トラフィックをルーティングする](alb-ingress.md)」と「[Helm による AWS Load Balancer Controller のインストール](lbc-helm.md)」を参照してください。
+ AWS Application Load Balancer と AWS Network Load Balancer のどちらかを選択する方法については、「[Best Practices for Load Balancing](https://docs.aws.amazon.com/eks/latest/best-practices/load-balacing.html)」を参照してください。
+ AWS Application Load Balancer で Ingress リソース用に設定できる注釈のリストについては、「[AWS Load Balancer Controller Ingress annotations](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/ingress/annotations/)」を参照してください。

### 前提条件
<a name="_prerequisites"></a>
+ 「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」の手順に従って Cilium がインストールされていること。
+ 「[ハイブリッドノード向けに Cilium BGP を設定する](hybrid-nodes-cilium-bgp.md)」の手順に従って Cilium BGP コントロールプレーンを有効にしていること。BGP を使用しない場合は、別の方法を使用して、オンプレミスネットワークでオンプレミスポッド CIDR をルーティング可能にする必要があります。オンプレミスポッド CIDR をルーティング可能にしないと、ALB はポッド IP ターゲットの登録も接続もできません。
+ コマンドライン環境に Helm がインストールされていること。詳細については、「[Setup Helm instructions](helm.md)」を参照してください。
+ コマンドライン環境に eksctl がインストールされていること。詳細については、「[eksctl install instructions](install-kubectl.md#eksctl-install-update)」を参照してください。

### 手順
<a name="_procedure"></a>

1. ユーザーに代わって AWS API を呼び出すことを許可する、AWS Load Balancer Controller 用の IAM ポリシーをダウンロードします。

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/refs/heads/main/docs/install/iam_policy.json
   ```

1. 前のステップでダウンロードしたポリシー を使用して、IAM ポリシーを作成します。

   ```
   aws iam create-policy \
       --policy-name AWSLoadBalancerControllerIAMPolicy \
       --policy-document file://iam_policy.json
   ```

1. クラスター名 (`CLUSTER_NAME`)、AWS リージョン (`AWS_REGION`)、AWS アカウント ID (`AWS_ACCOUNT_ID`) の各値を自分の設定値に置き換えて、次のコマンドを実行します。

   ```
   eksctl create iamserviceaccount \
       --cluster=CLUSTER_NAME \
       --namespace=kube-system \
       --name=aws-load-balancer-controller \
       --attach-policy-arn=arn:aws:iam::AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \
       --override-existing-serviceaccounts \
       --region AWS_REGION \
       --approve
   ```

1. eks-charts Helm チャートリポジトリを追加し、ローカル Helm リポジトリを更新して、チャートを最新の状態にします。

   ```
   helm repo add eks https://aws.github.io/eks-charts
   ```

   ```
   helm repo update eks
   ```

1. AWS Load Balancer コントローラをインストールします。クラスター名 (`CLUSTER_NAME`)、AWS リージョン (`AWS_REGION`)、VPC ID (`VPC_ID`)、AWS Load Balancer Controller Helm チャートバージョン (`AWS_LBC_HELM_VERSION`) の各値を自分の設定値に置き換えて、次のコマンドを実行します。ハイブリッドノードと AWS クラウド内のノードの両方を使用して混合モードクラスターを実行している場合は、「[AWS ロードバランサーコントローラー](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-lbc)」の手順に従ってクラウドノード上で AWS Load Balancer Controller を実行できます。
   + Helm チャートの最新バージョンを確認するには、`helm search repo eks/aws-load-balancer-controller --versions` を実行します。

     ```
     helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
       -n kube-system \
       --version AWS_LBC_HELM_VERSION \
       --set clusterName=CLUSTER_NAME \
       --set region=AWS_REGION \
       --set vpcId=VPC_ID \
       --set serviceAccount.create=false \
       --set serviceAccount.name=aws-load-balancer-controller
     ```

1. AWS Load Balancer Controller が正常にインストールされたことを確認します。

   ```
   kubectl get -n kube-system deployment aws-load-balancer-controller
   ```

   ```
   NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
   aws-load-balancer-controller   2/2     2            2           84s
   ```

1. サンプルアプリケーションを作成します。以下の例では、[Istio Bookinfo](https://istio.io/latest/docs/examples/bookinfo/) サンプルマイクロサービスアプリケーションを使用しています。

   ```
   kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
   ```

1. 次の内容で、`my-ingress-alb.yaml` という名前のファイルを作成します。

   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: my-ingress
     namespace: default
     annotations:
       alb.ingress.kubernetes.io/load-balancer-name: "my-ingress-alb"
       alb.ingress.kubernetes.io/target-type: "ip"
       alb.ingress.kubernetes.io/scheme: "internet-facing"
       alb.ingress.kubernetes.io/healthcheck-path: "/details/1"
   spec:
     ingressClassName: alb
     rules:
     - http:
         paths:
         - backend:
             service:
               name: details
               port:
                 number: 9080
           path: /details
           pathType: Prefix
   ```

1. Ingress 設定をクラスターに適用します。

   ```
   kubectl apply -f my-ingress-alb.yaml
   ```

1. Ingress リソース用に ALB をプロビジョニングするには、数分かかる場合があります。ALB がプロビジョニングされると、ALB デプロイの DNS 名に対応するアドレスが Ingress リソースに割り当てられます。アドレスの形式は `<alb-name>-<random-string>.<region>.elb.amazonaws.com` です。

   ```
   kubectl get ingress my-ingress
   ```

   ```
   NAME         CLASS   HOSTS   ADDRESS                                                     PORTS   AGE
   my-ingress   alb     *       my-ingress-alb-<random-string>.<region>.elb.amazonaws.com   80      23m
   ```

1. ALB のアドレスを使用して Service にアクセスします。

   ```
   curl -s http//my-ingress-alb-<random-string>.<region>.elb.amazonaws.com:80/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
     "details": "This is the details page"
   }
   ```

## Cilium Ingress および Cilium Gateway の概要
<a name="hybrid-nodes-ingress-cilium"></a>

Cilium Ingress は、Cilium のアーキテクチャに組み込みの機能であり、Kubernetes Ingress API または Gateway API を使用して管理できます。既存の Ingress リソースがない場合、AWS では Gateway API から始めることを推奨しています。Kubernetes ネットワークリソースを柔軟かつ表現力豊かに定義および管理できるためです。[Kubernetes Gateway API](https://gateway-api.sigs.k8s.io/) の目的は、Kubernetes クラスターに Ingress、Load Balancing、Service Mesh のネットワークリソースを定義および管理する方法を標準化することにあります。

Cilium の Ingress 機能または Gateway 機能を有効にすると、Cilium オペレーターがクラスター内の Ingress/Gateway オブジェクトを照合し、各ノードの Envoy プロキシがレイヤー 7 (L7) ネットワークトラフィックを処理します。Cilium は、ロードバランサーなどの Ingress/Gateway インフラストラクチャを直接にはプロビジョニングしません。ロードバランサーと共に Cilium Ingress/Gateway を使用する場合は、ロードバランサーのツール (通常は Ingress コントローラーや Gateway コントローラー) を使用して、ロードバランサーのインフラストラクチャをデプロイおよび管理する必要があります。

Ingress/Gateway トラフィックの場合、Cilium がコアネットワークトラフィックと L3/L4 ポリシー適用を処理し、統合 Envoy プロキシが L7 ネットワークトラフィックを処理します。Cilium Ingress/Gateway の場合、Envoy が L7 ルーティングルール、ポリシー、リクエスト操作の適用、高度なトラフィック管理 (トラフィックの分割やミラーリングなど)、TLS の終了と発信を行います。Cilium の Envoy プロキシは、デフォルトでは独立した DaemonSet (`cilium-envoy`) としてデプロイされます。これにより、Envoy と Cilium エージェントを個別に更新、スケール、管理できます。

Cilium Ingress と Cilium Gateway の仕組みの詳細については、Cilium のドキュメントの「[Cilium Ingress](https://docs.cilium.io/en/stable/network/servicemesh/ingress/)」ページと「[Cilium Gateway](https://docs.cilium.io/en/stable/network/servicemesh/gateway-api/gateway-api/)」ページを参照してください。

## Cilium Ingress と Cilium Gateway の比較
<a name="hybrid-nodes-ingress-cilium-comparison"></a>

以下の表に、Cilium **バージョン 1.17.x** の Cilium Ingress 機能と Cilium Gateway 機能をまとめます。


| 機能 | Ingress | ゲートウェイ | 
| --- | --- | --- | 
|  サービスタイプ LoadBalancer  |  はい  |  あり  | 
|  サービスタイプ NodePort  |  あり  |  いいえ1   | 
|  ホストネットワーク  |  はい  |  あり  | 
|  共有ロードバランサー  |  はい  |  あり  | 
|  専用ロードバランサー  |  あり  |  なし2   | 
|  ネットワークポリシー  |  はい  |  あり  | 
|  プロトコル  |  レイヤー 7 (HTTP(S)、gRPC)  |  レイヤー 7 (HTTP(S)、gRPC)3   | 
|  TLS パススルー  |  はい  |  あり  | 
|  トラフィック管理  |  パスおよびホストのルーティング  |  パスおよびホストのルーティング、URL のリダイレクトと書き換え、トラフィックの分割、ヘッダーの変更  | 

 1 Cilium Gateway による NodePort サービスのサポートは、Cilium バージョン 1.18.x ([\$127273](https://github.com/cilium/cilium/pull/27273)) で予定されています

 2 Cilium Gateway による専用ロードバランサーのサポート ([\$125567](https://github.com/cilium/cilium/issues/25567))

 3 Cilium Gateway による TCP/UDP のサポート ([\$121929](https://github.com/cilium/cilium/issues/21929))

## Cilium Gateway をインストールする
<a name="hybrid-nodes-ingress-cilium-gateway-install"></a>

### 考慮事項
<a name="_considerations_2"></a>
+ Cilium では、以下の例に示すように、`nodePort.enabled` を `true` に設定する必要があります。Cilium の kube-proxy 置換機能を使用している場合は、`nodePort.enabled` を `true` に設定する必要はありません。
+ Cilium では、以下の例に示すように、`envoy.enabled` を `true` に設定する必要があります。
+ Cilium Gateway は、ロードバランサーモード (デフォルト) またはホストネットワークモードでデプロイできます。
+ Cilium Gateway をロードバランサーモードで使用する場合は、Gateway リソースに `service.beta.kubernetes.io/aws-load-balancer-type: "external"` 注釈を設定する必要があります。これにより、Cilium が Gateway リソース用にタイプ LoadBalancer の Service を作成する際に、レガシー AWS クラウドプロバイダーがその Service 用に Classic Load Balancer を作成しなくなります。
+ Cilium Gateway をホストネットワークモードで使用する場合、タイプ LoadBalancer の Service は無効になります。ホストネットワークモードは、ロードバランサーインフラストラクチャがない環境に有用です。詳細については、「[ホストネットワーク](#hybrid-nodes-ingress-cilium-host-network)」を参照してください。

### 前提条件
<a name="_prerequisites_2"></a>

1. コマンドライン環境に Helm がインストールされていること。「[Setup Helm instructions](helm.md)」を参照してください。

1. 「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」の手順に従って Cilium がインストールされていること。

### 手順
<a name="_procedure_2"></a>

1. Kubernetes Gateway API カスタムリソース定義 (CRD) をインストールします。

   ```
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_gatewayclasses.yaml
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_gateways.yaml
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_httproutes.yaml
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_referencegrants.yaml
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_grpcroutes.yaml
   ```

1. `cilium-gateway-values.yaml` というファイルを次の内容で作成します。以下の例では、デフォルトのロードバランサーモードを使用するように Cilium Gateway を設定しています。また、Envoy プロキシをハイブリッドノードでのみ実行するように設定している場合には、そのプロキシに別の `cilium-envoy` DaemonSet を使用するように設定しています。

   ```
   gatewayAPI:
     enabled: true
     # uncomment to use host network mode
     # hostNetwork:
     #   enabled: true
   nodePort:
     enabled: true
   envoy:
     enabled: true
     affinity:
       nodeAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: eks.amazonaws.com/compute-type
               operator: In
               values:
               - hybrid
   ```

1. Helm 値ファイルをクラスターに適用します。

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     --values cilium-gateway-values.yaml
   ```

1. Cilium オペレーター、エージェント、Envoy ポッドが動作していることを確認します。

   ```
   kubectl -n kube-system get pods --selector=app.kubernetes.io/part-of=cilium
   ```

   ```
   NAME                               READY   STATUS    RESTARTS   AGE
   cilium-envoy-5pgnd                 1/1     Running   0          6m31s
   cilium-envoy-6fhg4                 1/1     Running   0          6m30s
   cilium-envoy-jskrk                 1/1     Running   0          6m30s
   cilium-envoy-k2xtb                 1/1     Running   0          6m31s
   cilium-envoy-w5s9j                 1/1     Running   0          6m31s
   cilium-grwlc                       1/1     Running   0          4m12s
   cilium-operator-68f7766967-5nnbl   1/1     Running   0          4m20s
   cilium-operator-68f7766967-7spfz   1/1     Running   0          4m20s
   cilium-pnxcv                       1/1     Running   0          6m29s
   cilium-r7qkj                       1/1     Running   0          4m12s
   cilium-wxhfn                       1/1     Running   0          4m1s
   cilium-z7hlb                       1/1     Running   0          6m30s
   ```

## Cilium Gateway を設定する
<a name="hybrid-nodes-ingress-cilium-gateway-configure"></a>

Cilium Gateway を Gateway オブジェクトで有効にするには、`gatewayClassName` を `cilium` に設定します。Cilium が Gateway リソース用に作成する Service を設定するには、Gateway オブジェクトの各種フィールドを使用します。ロードバランサーインフラストラクチャを設定するために Gateway コントローラーでよく使用される注釈を設定するには、Gateway オブジェクトの `infrastructure` フィールドを使用します。Cilium の LoadBalancer IPAM を使用する場合(「[サービスタイプ LoadBalancer](#hybrid-nodes-ingress-cilium-loadbalancer)」の例を参照)に、タイプ LoadBalancer の Service に使用する IP アドレスを設定するには、Gateway オブジェクトの `addresses` フィールドを使用します。Gateway 設定の詳細については、「[Kubernetes Gateway API specification](https://gateway-api.sigs.k8s.io/reference/spec/#gateway)」を参照してください。

```
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: my-gateway
spec:
  gatewayClassName: cilium
  infrastructure:
    annotations:
      service.beta.kubernetes.io/...
      service.kuberentes.io/...
  addresses:
  - type: IPAddress
    value: <LoadBalancer IP address>
  listeners:
  ...
```

Cilium と Kubernetes Gateway の仕様では、GatewayClass、Gateway、HTTPRoute、GRPCRoute、ReferenceGrant の各リソースがサポートされています。
+ 使用可能なフィールドのリストについては、「[HTTPRoute](https://gateway-api.sigs.k8s.io/api-types/httproute/HTTPRoute)」と「[GRPCRoute](https://gateway-api.sigs.k8s.io/api-types/grpcroute/GRPCRoute)」の仕様を参照してください。
+ これらのリソースの使用と設定方法については、以下の「[Cilium Gateway をデプロイする](#hybrid-nodes-ingress-cilium-gateway-deploy)」セクションの例と[Cilium のドキュメント](https://docs.cilium.io/en/stable/network/servicemesh/gateway-api/gateway-api/#examples)の例を参照してください。

## Cilium Gateway をデプロイする
<a name="hybrid-nodes-ingress-cilium-gateway-deploy"></a>

1. サンプルアプリケーションを作成します。以下の例では、[Istio Bookinfo](https://istio.io/latest/docs/examples/bookinfo/) サンプルマイクロサービスアプリケーションを使用しています。

   ```
   kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
   ```

1. アプリケーションが正常に動作していることを確認します。

   ```
   kubectl get pods
   ```

   ```
   NAME                              READY   STATUS    RESTARTS   AGE
   details-v1-766844796b-9965p       1/1     Running   0          81s
   productpage-v1-54bb874995-jmc8j   1/1     Running   0          80s
   ratings-v1-5dc79b6bcd-smzxz       1/1     Running   0          80s
   reviews-v1-598b896c9d-vj7gb       1/1     Running   0          80s
   reviews-v2-556d6457d-xbt8v        1/1     Running   0          80s
   reviews-v3-564544b4d6-cpmvq       1/1     Running   0          80s
   ```

1. 次の内容で、`my-gateway.yaml` という名前のファイルを作成します。以下の例では、`service.beta.kubernetes.io/aws-load-balancer-type: "external"` 注釈を使用して、Cilium が Gateway リソース用にタイプ LoadBalancer の Service を作成する際に、レガシー AWS クラウドプロバイダーがその Service 用に Classic Load Balancer を作成しないようにしています。

   ```
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: Gateway
   metadata:
     name: my-gateway
   spec:
     gatewayClassName: cilium
     infrastructure:
       annotations:
         service.beta.kubernetes.io/aws-load-balancer-type: "external"
     listeners:
     - protocol: HTTP
       port: 80
       name: web-gw
       allowedRoutes:
         namespaces:
           from: Same
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: HTTPRoute
   metadata:
     name: http-app-1
   spec:
     parentRefs:
     - name: my-gateway
       namespace: default
     rules:
     - matches:
       - path:
           type: PathPrefix
           value: /details
       backendRefs:
       - name: details
         port: 9080
   ```

1. クラスターに Gateway リソースを適用します。

   ```
   kubectl apply -f my-gateway.yaml
   ```

1. Gateway リソースとその対応する Service が作成されたことを確認します。この段階では、Gateway リソースの `ADDRESS` フィールドに IP アドレスもホスト名も入力されておらず、Gateway リソースのタイプ LoadBalancer の Service にも同じく IP アドレスもホスト名も割り当てられていないはずです。

   ```
   kubectl get gateway my-gateway
   ```

   ```
   NAME         CLASS    ADDRESS   PROGRAMMED   AGE
   my-gateway   cilium             True         10s
   ```

   ```
   kubectl get svc cilium-gateway-my-gateway
   ```

   ```
   NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
   cilium-gateway-my-gateway   LoadBalancer   172.16.227.247   <pending>     80:30912/TCP   24s
   ```

1. [サービスタイプ LoadBalancer](#hybrid-nodes-ingress-cilium-loadbalancer) に進み、Cilium Load Balancer IPAM によって割り当てられた IP アドレスを使用するように Gateway リソースを設定します。さらに、[サービスタイプ NodePort](#hybrid-nodes-ingress-cilium-nodeport) または [ホストネットワーク](#hybrid-nodes-ingress-cilium-host-network) に進み、NodePort またはホストネットワークアドレスを使用するように Gateway リソースを設定します。

## Cilium Ingress をインストールする
<a name="hybrid-nodes-ingress-cilium-ingress-install"></a>

### 考慮事項
<a name="_considerations_3"></a>
+ Cilium では、以下の例に示すように、`nodePort.enabled` を `true` に設定する必要があります。Cilium の kube-proxy 置換機能を使用している場合は、`nodePort.enabled` を `true` に設定する必要はありません。
+ Cilium では、以下の例に示すように、`envoy.enabled` を `true` に設定する必要があります。
+ `ingressController.loadbalancerMode` を `dedicated` に設定した場合、Cilium は Ingress リソースごとに専用の Service を作成します。`ingressController.loadbalancerMode` を `shared` に設定した場合、Cilium はクラスター内のすべての Ingress リソースに対してタイプ LoadBalancer の共有 Service を作成します。`shared` ロードバランサーモードを使用する場合、`labels`、`annotations`、`type`、`loadBalancerIP` などの共有 Service の設定を Helm 値の `ingressController.service` セクションで行います。詳細については、「[Cilium Helm values reference](https://github.com/cilium/cilium/blob/v1.17.6/install/kubernetes/cilium/values.yaml#L887)」を参照してください。
+ `ingressController.default` を `true` に設定した場合、Cilium はクラスターのデフォルトの Ingress コントローラーとして設定され、`ingressClassName` が Ingress リソースに指定されていない場合でも Ingress エントリを作成します。
+ Cilium Ingress は、ロードバランサー (デフォルト)、ノードポート、ホストネットワークモードのいずれかでデプロイできます。Cilium をホストネットワークモードでインストールすると、タイプ LoadBalancer の Service およびタイプ NodePort モードの Service が無効になります。詳細については「[ホストネットワーク](#hybrid-nodes-ingress-cilium-host-network)」を参照してください。
+ Helm 値では常に `ingressController.service.annotations` を `service.beta.kubernetes.io/aws-load-balancer-type: "external"` に設定します。これにより、レガシー AWS クラウドプロバイダーは、[Cilium Helm チャート](https://github.com/cilium/cilium/blob/main/install/kubernetes/cilium/templates/cilium-ingress-service.yaml)によって作成されたデフォルトの `cilium-ingress` Service 用に Classic Load Balancer を作成しなくなります。

### 前提条件
<a name="_prerequisites_3"></a>

1. コマンドライン環境に Helm がインストールされていること。「[Setup Helm instructions](helm.md)」を参照してください。

1. 「[ハイブリッドノードの CNI を設定する](hybrid-nodes-cni.md)」の手順に従って Cilium がインストールされていること。

### 手順
<a name="_procedure_3"></a>

1. `cilium-ingress-values.yaml` というファイルを次の内容で作成します。以下に、Cilium Ingress の設定例を示します。デフォルトのロードバランサー `dedicated` モードを使用すること、および Envoy プロキシに個別の `cilium-envoy` DaemonSet を使用してプロキシがハイブリッドノードでのみ動作することを設定しています。

   ```
   ingressController:
     enabled: true
     loadbalancerMode: dedicated
     service:
       annotations:
         service.beta.kubernetes.io/aws-load-balancer-type: "external"
   nodePort:
     enabled: true
   envoy:
     enabled: true
     affinity:
       nodeAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: eks.amazonaws.com/compute-type
               operator: In
               values:
               - hybrid
   ```

1. Helm 値ファイルをクラスターに適用します。

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     --values cilium-ingress-values.yaml
   ```

1. Cilium オペレーター、エージェント、Envoy ポッドが動作していることを確認します。

   ```
   kubectl -n kube-system get pods --selector=app.kubernetes.io/part-of=cilium
   ```

   ```
   NAME                               READY   STATUS    RESTARTS   AGE
   cilium-envoy-5pgnd                 1/1     Running   0          6m31s
   cilium-envoy-6fhg4                 1/1     Running   0          6m30s
   cilium-envoy-jskrk                 1/1     Running   0          6m30s
   cilium-envoy-k2xtb                 1/1     Running   0          6m31s
   cilium-envoy-w5s9j                 1/1     Running   0          6m31s
   cilium-grwlc                       1/1     Running   0          4m12s
   cilium-operator-68f7766967-5nnbl   1/1     Running   0          4m20s
   cilium-operator-68f7766967-7spfz   1/1     Running   0          4m20s
   cilium-pnxcv                       1/1     Running   0          6m29s
   cilium-r7qkj                       1/1     Running   0          4m12s
   cilium-wxhfn                       1/1     Running   0          4m1s
   cilium-z7hlb                       1/1     Running   0          6m30s
   ```

## Cilium Ingress を設定する
<a name="hybrid-nodes-ingress-cilium-ingress-configure"></a>

Cilium Ingress を Ingress オブジェクトで有効にするには、`ingressClassName` を `cilium` に設定します。Cilium が Ingress リソース用に作成した Service を設定するには、`dedicated` ロードバランサーモードを使用している場合には Ingress オブジェクトを使用し、`shared` ロードバランサーモードを使用している場合には Cilium/Helm 設定を使用します。こうした注釈は、Ingress コントローラーがロードバランサーインフラストラクチャを設定するときや、サービスタイプ、ロードバランサーモード、ポート、TLS パススルーといった Service のその他の属性を設定するときによく使用されます。以下に、主な注釈を示します。サポートされている注釈の完全なリストについては、Cilium のドキュメントの「[Cilium Ingress annotations](https://docs.cilium.io/en/stable/network/servicemesh/ingress/#supported-ingress-annotations)」を参照してください。


| 注釈 | 説明 | 
| --- | --- | 
|   `ingress.cilium.io/loadbalancer-mode`   |   `dedicated`: 各 Ingress リソースのタイプ LoadBalancer の専用 Service (デフォルト)。  `shared`: すべての Ingress リソースのタイプ LoadBalancer の単一の Service。  | 
|   `ingress.cilium.io/service-type`   |   `LoadBalancer`: Service は、タイプ LoadBalancer になります (デフォルト)。  `NodePort`: Service は、タイプ NodePort になります。  | 
|   `service.beta.kubernetes.io/aws-load-balancer-type`   |   `"external"`: レガシー AWS クラウドプロバイダーは、タイプ LoadBalancer の Service に対して Classic Load Balancer をプロビジョニングしなくなります。  | 
|   `lbipam.cilium.io/ips`   |  Cilium LoadBalancer IPAM から割り当てる IP アドレスのリスト  | 

Cilium と Kubernetes Ingress の仕様は、Ingress パスのマッチングルールとして完全一致、プレフィックス一致、実装固有一致をサポートしています。Cilium は、実装固有マッチングルールとして正規表現をサポートしています。詳細については、Cilium のドキュメントの「[Ingress path types and precedence](https://docs.cilium.io/en/stable/network/servicemesh/ingress/#ingress-path-types-and-precedence)」と「[Path types examples](https://docs.cilium.io/en/stable/network/servicemesh/path-types/)」、さらにこのページの「[Cilium Ingress をデプロイする](#hybrid-nodes-ingress-cilium-ingress-deploy)」セクションの例を参照してください。

以下に、Cilium Ingress オブジェクトの例を示します。

```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    service.beta.kuberentes.io/...
    service.kuberentes.io/...
spec:
  ingressClassName: cilium
  rules:
  ...
```

## Cilium Ingress をデプロイする
<a name="hybrid-nodes-ingress-cilium-ingress-deploy"></a>

1. サンプルアプリケーションを作成します。以下の例では、[Istio Bookinfo](https://istio.io/latest/docs/examples/bookinfo/) サンプルマイクロサービスアプリケーションを使用しています。

   ```
   kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
   ```

1. アプリケーションが正常に動作していることを確認します。

   ```
   kubectl get pods
   ```

   ```
   NAME                              READY   STATUS    RESTARTS   AGE
   details-v1-766844796b-9965p       1/1     Running   0          81s
   productpage-v1-54bb874995-jmc8j   1/1     Running   0          80s
   ratings-v1-5dc79b6bcd-smzxz       1/1     Running   0          80s
   reviews-v1-598b896c9d-vj7gb       1/1     Running   0          80s
   reviews-v2-556d6457d-xbt8v        1/1     Running   0          80s
   reviews-v3-564544b4d6-cpmvq       1/1     Running   0          80s
   ```

1. 次の内容で、`my-ingress.yaml` という名前のファイルを作成します。以下の例では、`service.beta.kubernetes.io/aws-load-balancer-type: "external"` 注釈を使用して、Cilium が Ingress リソース用にタイプ LoadBalancer の Service を作成する際に、レガシー AWS クラウドプロバイダーがその Service 用に Classic Load Balancer を作成しないようにしています。

   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: my-ingress
     namespace: default
     annotations:
       service.beta.kubernetes.io/aws-load-balancer-type: "external"
   spec:
     ingressClassName: cilium
     rules:
     - http:
         paths:
         - backend:
             service:
               name: details
               port:
                 number: 9080
           path: /details
           pathType: Prefix
   ```

1. Ingress リソースをクラスターに適用します。

   ```
   kubectl apply -f my-ingress.yaml
   ```

1. Ingress リソースおよびその対応する Service が作成されたことを確認します。この段階では、Ingress リソースの `ADDRESS` フィールドに IP アドレスもホスト名も入力されておらず、Ingress リソースのタイプ LoadBalancer の共有または専用 Service にも同じく IP アドレスもホスト名も割り当てられていないはずです。

   ```
   kubectl get ingress my-ingress
   ```

   ```
   NAME         CLASS    HOSTS   ADDRESS   PORTS   AGE
   my-ingress   cilium   *                 80      8s
   ```

   ロードバランサーモード `shared` の場合 

   ```
   kubectl -n kube-system get svc cilium-ingress
   ```

   ```
   NAME             TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
   cilium-ingress   LoadBalancer   172.16.217.48   <pending>     80:32359/TCP,443:31090/TCP   10m
   ```

   ロードバランサーモード `dedicated` の場合 

   ```
   kubectl -n default get svc cilium-ingress-my-ingress
   ```

   ```
   NAME                        TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
   cilium-ingress-my-ingress   LoadBalancer   172.16.193.15   <pending>     80:32088/TCP,443:30332/TCP   25s
   ```

1. [サービスタイプ LoadBalancer](#hybrid-nodes-ingress-cilium-loadbalancer) に進み、Cilium Load Balancer IPAM によって割り当てられた IP アドレスを使用するように Ingress リソースを設定します。さらに、[サービスタイプ NodePort](#hybrid-nodes-ingress-cilium-nodeport) または [ホストネットワーク](#hybrid-nodes-ingress-cilium-host-network) に進み、NodePort またはホストネットワークアドレスを使用するように Ingress リソースを設定します。

## サービスタイプ LoadBalancer
<a name="hybrid-nodes-ingress-cilium-loadbalancer"></a>

### 既存のロードバランサーインフラストラクチャ
<a name="_existing_load_balancer_infrastructure"></a>

デフォルトでは、Cilium Ingress の場合も Cilium Gateway の場合も、Cilium は Ingress/Gateway リソース用にタイプ LoadBalancer の Kubernetes Service を作成します。Cilium が作成した Service の属性を設定するには、Ingress リソースと Gateway リソースを使用します。Ingress リソースまたは Gateway リソースを作成すると、Ingress または Gateway 用に外部公開された IP アドレスまたはホスト名がロードバランサーインフラストラクチャから割り当てられます。このインフラストラクチャは通常、Ingress コントローラーまたは Gateway コントローラーによってプロビジョニングされます。

Ingress コントローラーと Gateway コントローラーの多くが、ロードバランサーインフラストラクチャを検出および設定する際に注釈を使用します。Ingress コントローラーと Gateway コントローラーのこうした注釈は、上記の例に示すように、Ingress リソースまたは Gateway リソースに設定します。サポートされている注釈については、Ingress コントローラーまたは Gateway コントローラーのドキュメントを参照してください。また、よく使用されるコントローラーのリストについては、[Kubernetes Ingress のドキュメント](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/)と [Kubernetes Gateway のドキュメント](https://gateway-api.sigs.k8s.io/implementations/)を参照してください。

**重要**  
EKS Hybrid Nodes では、Cilium Ingress と Gateway を AWS Load Balancer Controller および AWS Network Load Balancer (NLB) と共に使用することはできません。これらを一緒に使用しようとすると、ターゲットが未登録になります。NLB の `target-type` が `ip` に設定されている場合 (EKS Hybrid Nodes で実行されるワークロードで NLB を使用するための要件)、NLB はタイプ LoadBalancer の Service を支援する Pod IP に直接接続しようとするためです。

### ロードバランサーインフラストラクチャなし
<a name="_no_load_balancer_infrastructure"></a>

環境にロードバランサーインフラストラクチャおよびその対応する Ingress/Gateway コントローラーがない場合、Ingress/Gateway リソースおよびその対応するタイプ LoadBalancer の Service を設定するには、Cilium の [Load Balancer IP Address Management](https://docs.cilium.io/en/stable/network/lb-ipam/) (LB IPAM) によって割り当てられた IP アドレスを使用します。Cilium LB IPAM は、オンプレミス環境の既知の IP アドレス範囲と共に設定できます。また、Cilium に組み込みのボーダーゲートウェイプロトコル (BGP) サポートまたは L2 のお知らせを使用して、LoadBalancer IP アドレスをオンプレミスネットワークにアドバタイズできます。

以下の例では、Ingress/Gateway リソースに使用する IP アドレスと共に Cilium の LB IPAM を設定する方法と、オンプレミスネットワークで LoadBalancer IP アドレスをアドバタイズするように Cilium BGP コントロールプレーンを設定する方法を示します。Cilium の LB IPAM 機能は、デフォルトで有効になっていますが、`CiliumLoadBalancerIPPool` リソースが作成されるまではアクティブ化されません。

#### 前提条件
<a name="_prerequisites_4"></a>
+ 「[Cilium Ingress をインストールする](#hybrid-nodes-ingress-cilium-ingress-install)」または「[Cilium Gateway をインストールする](#hybrid-nodes-ingress-cilium-gateway-install)」の手順に従って Cilium Ingress または Gateway がインストールされていること。
+ 「[Cilium Ingress をデプロイする](#hybrid-nodes-ingress-cilium-ingress-deploy)」または「[Cilium Gateway をデプロイする](#hybrid-nodes-ingress-cilium-gateway-deploy)」の手順に従って、Cilium Ingress リソースまたは Gateway リソースがサンプルアプリケーションと共にデプロイされていること。
+ 「[ハイブリッドノード向けに Cilium BGP を設定する](hybrid-nodes-cilium-bgp.md)」の手順に従って Cilium BGP コントロールプレーンを有効にしていること。BGP を使用しない場合にはこの前提条件をスキップできますが、Cilium LB IPAM によって割り当てられた LoadBalancer IP アドレスがオンプレミスネットワークでルーティング可能になるまで、Ingress リソースと Gateway リソースにアクセスできなくなります。

#### 手順
<a name="_procedure_4"></a>

1. 必要に応じて、Ingress リソースまたは Gateway リソースにパッチを適用してタイプ LoadBalancer の Service に特定の IP アドレスを使用するようにリクエストしてください。特定の IP アドレスをリクエストしないと、Cilium は後続のステップで `CiliumLoadBalancerIPPool` リソースに設定する IP アドレス範囲から IP アドレスを割り当てます。以下のコマンドでは、`LB_IP_ADDRESS` をタイプ LoadBalancer の Service 用にリクエストする IP アドレスに置き換えます。

    **ゲートウェイ** 

   ```
   kubectl patch gateway -n default my-gateway --type=merge -p '{
     "spec": {
       "addresses": [{"type": "IPAddress", "value": "LB_IP_ADDRESS"}]
     }
   }'
   ```

    **Ingress** 

   ```
   kubectl patch ingress my-ingress --type=merge -p '{
     "metadata": {"annotations": {"lbipam.cilium.io/ips": "LB_IP_ADDRESS"}}
   }'
   ```

1. `CiliumLoadBalancerIPPool` リソースを使用して Ingress/Gateway リソースの Load Balancer IP アドレス範囲を設定するファイルを `cilium-lbip-pool-ingress.yaml` という名前で作成します。
   + Cilium Ingress を使用している場合、Cilium は Ingress リソース用に作成する Service に `cilium.io/ingress: "true"` ラベルを自動的に適用します。`CiliumLoadBalancerIPPool` リソース定義の `serviceSelector` フィールドでこのラベルを使用すると、LB IPAM の対象となる Service を選択できます。
   + Cilium Gateway を使用している場合は、`CiliumLoadBalancerIPPool` リソース定義の `serviceSelector` フィールドで `gateway.networking.k8s.io/gateway-name` ラベルを使用して、LB IPAM の対象となる Gateway リソースを選択できます。
   + `LB_IP_CIDR` を Load Balancer の IP アドレスに使用する IP アドレス範囲に置き換えます。単一の IP アドレスを選択するには、`/32` CIDR を使用します。詳細については、Cilium のドキュメントの「[LoadBalancer IP Address Management](https://docs.cilium.io/en/stable/network/lb-ipam/)」を参照してください。

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumLoadBalancerIPPool
     metadata:
       name: bookinfo-pool
     spec:
       blocks:
       - cidr: "LB_IP_CIDR"
       serviceSelector:
         # if using Cilium Gateway
         matchExpressions:
           - { key: gateway.networking.k8s.io/gateway-name, operator: In, values: [ my-gateway ] }
         # if using Cilium Ingress
         matchLabels:
           cilium.io/ingress: "true"
     ```

1. `CiliumLoadBalancerIPPool` リソースをクラスターに適用します。

   ```
   kubectl apply -f cilium-lbip-pool-ingress.yaml
   ```

1. Ingress/Gateway リソースの IP アドレスが Cilium LB IPAM から割り当てられたことを確認します。

    **ゲートウェイ** 

   ```
   kubectl get gateway my-gateway
   ```

   ```
   NAME         CLASS    ADDRESS        PROGRAMMED   AGE
   my-gateway   cilium   LB_IP_ADDRESS    True         6m41s
   ```

    **Ingress** 

   ```
   kubectl get ingress my-ingress
   ```

   ```
   NAME         CLASS    HOSTS   ADDRESS        PORTS   AGE
   my-ingress   cilium   *       LB_IP_ADDRESS   80      10m
   ```

1. `CiliumBGPAdvertisement` リソースを使用して Ingress/Gateway リソースの LoadBalancer IP アドレスをアドバタイズするファイルを `cilium-bgp-advertisement-ingress.yaml` という名前で作成します。Cilium BGP を使用していない場合は、このステップをスキップできます。Ingress/Gateway リソースに使用する LoadBalancer IP アドレスは、次のステップでサービスをクエリできるように、オンプレミスネットワークでルーティング可能である必要があります。

   ```
   apiVersion: cilium.io/v2alpha1
   kind: CiliumBGPAdvertisement
   metadata:
     name: bgp-advertisement-lb-ip
     labels:
       advertise: bgp
   spec:
     advertisements:
       - advertisementType: "Service"
         service:
           addresses:
             - LoadBalancerIP
         selector:
           # if using Cilium Gateway
           matchExpressions:
             - { key: gateway.networking.k8s.io/gateway-name, operator: In, values: [ my-gateway ] }
           # if using Cilium Ingress
           matchLabels:
             cilium.io/ingress: "true"
   ```

1. `CiliumBGPAdvertisement` リソースをクラスターに適用します。

   ```
   kubectl apply -f cilium-bgp-advertisement-ingress.yaml
   ```

1. Cilium LB IPAM から割り当てられた IP アドレスを使用して、サービスにアクセスします。

   ```
   curl -s http://LB_IP_ADDRESS:80/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
   }
   ```

## サービスタイプ NodePort
<a name="hybrid-nodes-ingress-cilium-nodeport"></a>

環境にロードバランサーインフラストラクチャおよびその対応する Ingress コントローラーがない場合、ロードバランサーインフラストラクチャを自己管理している場合、または DNS ベースのロードバランシングを使用している場合は、Ingress リソース用にタイプ NodePort の Service を作成するように Cilium Ingress を設定できます。Cilium Ingress と共に NodePort を使用する場合、タイプ NodePort の Service は各ノード上でポート範囲 30000～32767 のポートに公開されます。このモードでは、トラフィックは NodePort 上のクラスター内にあるノードに到達すると、サービスを支援するポッドに転送されます。このポッドは、同じノードにあることもあれば、別のノードにあることもあります。

**注記**  
Cilium Gateway による NodePort サービスのサポートは、Cilium バージョン 1.18.x ([\$127273](https://github.com/cilium/cilium/pull/27273)) で予定されています

### 前提条件
<a name="_prerequisites_5"></a>
+ 「[Cilium Ingress をインストールする](#hybrid-nodes-ingress-cilium-ingress-install)」の手順に従って Cilium Ingress がインストールされていること。
+ 「[Cilium Ingress をデプロイする](#hybrid-nodes-ingress-cilium-ingress-deploy)」の手順に従って、Cilium Ingress リソースがサンプルアプリケーションと共にデプロイされていること。

### 手順
<a name="_procedure_5"></a>

1. 既存の Ingress リソース `my-ingress` にパッチを適用して、そのリソースをタイプ LoadBalancer の Service から NodePort に変更します。

   ```
   kubectl patch ingress my-ingress --type=merge -p '{
       "metadata": {"annotations": {"ingress.cilium.io/service-type": "NodePort"}}
   }'
   ```

   Ingress リソースをまだ作成していない場合は、次の Ingress 定義をクラスターに適用することで作成できます。以下の Ingress 定義では、「[Cilium Ingress をデプロイする](#hybrid-nodes-ingress-cilium-ingress-deploy)」で説明されている Istio Bookinfo サンプルアプリケーションを使用していることに注意してください。

   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: my-ingress
     namespace: default
     annotations:
       service.beta.kubernetes.io/aws-load-balancer-type: "external"
       "ingress.cilium.io/service-type": "NodePort"
   spec:
     ingressClassName: cilium
     rules:
     - http:
         paths:
         - backend:
             service:
               name: details
               port:
                 number: 9080
           path: /details
           pathType: Prefix
   ```

1. Ingress リソース用の Service が、タイプ NodePort の Service を使用するように更新されたことを確認します。出力にある HTTP プロトコルのポートを書き留めます。以下の例では `32353` がこの HTTP ポートであり、後続のステップではこのポートを使用して Service をクエリします。タイプ NodePort の Service と共に Cilium Ingress を使用する利点は、パスとホストベースのルーティングを適用できるだけでなく、Ingress トラフィック用のネットワークポリシーも適用できることです。これは、Ingress のないタイプ NodePort の標準の Service ではできないことです。

   ```
   kubectl -n default get svc cilium-ingress-my-ingress
   ```

   ```
   NAME                        TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
   cilium-ingress-my-ingress   NodePort   172.16.47.153   <none>        80:32353/TCP,443:30253/TCP   27m
   ```

1. クラスター内のノードの IP アドレスを取得します。

   ```
   kubectl get nodes -o wide
   ```

   ```
   NAME                   STATUS   ROLES    AGE   VERSION               INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
   mi-026d6a261e355fba7   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.150   <none>        Ubuntu 22.04.5 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-082f73826a163626e   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.32    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-09183e8a3d755abf6   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.33    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0d78d815980ed202d   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.97    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0daa253999fe92daa   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.100   <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   ```

1. ノードの IP アドレスと上記でキャプチャした NodePort を使用して、タイプ NodePort の Service にアクセスします。以下の例では、使用されるノード IP アドレスは `10.80.146.32` で、NodePort は `32353` です。これらをお使いの環境の値で置き換えます。

   ```
   curl -s http://10.80.146.32:32353/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
   }
   ```

## ホストネットワーク
<a name="hybrid-nodes-ingress-cilium-host-network"></a>

タイプ NodePort の Service と同様に、ロードバランサーインフラストラクチャと Ingress または Gateway コントローラーがない場合や、外部ロードバランサーでロードバランシングを自己管理している場合は、ホストネットワークに Ingress リソースと Gateway リソースを直接公開するように Cilium Ingress および Cilium Gateway を設定できます。ホストネットワークモードが Ingress リソースまたは Gateway リソースに対して有効になっている場合、タイプ LoadBalancer の Service とタイプ NodePort モードの Service は自動的に無効になり、ホストネットワークモードは Ingress リソースまたは Gateway リソースごとにこれらの代替モードと相互に排他的になります。タイプ NodePort モードの Service と比較して、ホストネットワークモードは使用できるポート範囲の柔軟性が高く (NodePort の 30000～32767 という範囲に制限されません)、ホストネットワーク上で Envoy プロキシが動作するノードのサブセットを設定できます。

### 前提条件
<a name="_prerequisites_6"></a>
+ 「[Cilium Ingress をインストールする](#hybrid-nodes-ingress-cilium-ingress-install)」または「[Cilium Gateway をインストールする](#hybrid-nodes-ingress-cilium-gateway-install)」の手順に従って Cilium Ingress または Gateway がインストールされていること。

### 手順
<a name="_procedure_6"></a>

#### ゲートウェイ
<a name="_gateway"></a>

1. `cilium-gateway-host-network.yaml` という名前のファイルを作成し、次の内容を記述します。

   ```
   gatewayAPI:
     enabled: true
     hostNetwork:
       enabled: true
       # uncomment to restrict nodes where Envoy proxies run on the host network
       # nodes:
       #   matchLabels:
       #     role: gateway
   ```

1. クラスターにホストネットワーク Cilium Gateway 設定を適用します。

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     -f cilium-gateway-host-network.yaml
   ```

   Gateway リソースをまだ作成していない場合は、次の Gateway 定義をクラスターに適用することで作成できます。以下の Gateway 定義では、「[Cilium Gateway をデプロイする](#hybrid-nodes-ingress-cilium-gateway-deploy)」で説明されている Istio Bookinfo サンプルアプリケーションを使用しています。以下の例では、Gateway リソースは HTTP リスナーに `8111` ポートを使用するように設定されています。ホストネットワークで動作する Envoy プロキシの共有リスナーポートです。Gateway リソースに特権ポート (1023 未満) を使用する場合は、その手順を [Cilium のドキュメント](https://docs.cilium.io/en/stable/network/servicemesh/gateway-api/gateway-api/#bind-to-privileged-port)で確認してください。

   ```
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: Gateway
   metadata:
     name: my-gateway
   spec:
     gatewayClassName: cilium
     listeners:
     - protocol: HTTP
       port: 8111
       name: web-gw
       allowedRoutes:
         namespaces:
           from: Same
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: HTTPRoute
   metadata:
     name: http-app-1
   spec:
     parentRefs:
     - name: my-gateway
       namespace: default
     rules:
     - matches:
       - path:
           type: PathPrefix
           value: /details
       backendRefs:
       - name: details
         port: 9080
   ```

   適用した Cilium Envoy 設定を確認するには、次のコマンドを使用します。

   ```
   kubectl get cec cilium-gateway-my-gateway -o yaml
   ```

   `cilium-gateway-my-gateway` Service の Envoy リスナーポートを取得するには、次のコマンドを使用します。この例では、`8111` が共有リスナーポートです。

   ```
   kubectl get cec cilium-gateway-my-gateway -o jsonpath={.spec.services[0].ports[0]}
   ```

1. クラスター内のノードの IP アドレスを取得します。

   ```
   kubectl get nodes -o wide
   ```

   ```
   NAME                   STATUS   ROLES    AGE   VERSION               INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
   mi-026d6a261e355fba7   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.150   <none>        Ubuntu 22.04.5 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-082f73826a163626e   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.32    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-09183e8a3d755abf6   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.33    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0d78d815980ed202d   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.97    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0daa253999fe92daa   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.100   <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   ```

1. ノードの IP アドレスと `cilium-gateway-my-gateway` リソースのリスナーポートを使用して、Service にアクセスします。以下の例では、使用されるノード IP アドレスは `10.80.146.32` であり、リスナーポートは `8111` です。これらをお使いの環境の値で置き換えます。

   ```
   curl -s http://10.80.146.32:8111/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
   }
   ```

#### Ingress
<a name="_ingress"></a>

アップストリームの Cilium の問題 ([\$134028](https://github.com/cilium/cilium/issues/34028)) により、ホストネットワークモードの Cilium Ingress では `loadbalancerMode: shared` を使用する必要があります。これにより、クラスター内のすべての Ingress リソースに対してタイプ ClusterIP の Service が 1 つだけ作成されます。Ingress リソースに特権ポート (1023 未満) を使用する場合は、その手順を [Cilium のドキュメント](https://docs.cilium.io/en/stable/network/servicemesh/ingress/#bind-to-privileged-port)で確認してください。

1. `cilium-ingress-host-network.yaml` という名前のファイルを作成し、次の内容を記述します。

   ```
   ingressController:
     enabled: true
     loadbalancerMode: shared
     # This is a workaround for the upstream Cilium issue
     service:
       externalTrafficPolicy: null
       type: ClusterIP
     hostNetwork:
       enabled: true
       # ensure the port does not conflict with other services on the node
       sharedListenerPort: 8111
       # uncomment to restrict nodes where Envoy proxies run on the host network
       # nodes:
       #   matchLabels:
       #     role: ingress
   ```

1. クラスターにホストネットワーク Cilium Ingress 設定を適用します。

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     -f cilium-ingress-host-network.yaml
   ```

   Ingress リソースをまだ作成していない場合は、次の Ingress 定義をクラスターに適用することで作成できます。以下の Ingress 定義では、「[Cilium Ingress をデプロイする](#hybrid-nodes-ingress-cilium-ingress-deploy)」で説明されている Istio Bookinfo サンプルアプリケーションを使用しています。

   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: my-ingress
     namespace: default
   spec:
     ingressClassName: cilium
     rules:
     - http:
         paths:
         - backend:
             service:
               name: details
               port:
                 number: 9080
           path: /details
           pathType: Prefix
   ```

   適用した Cilium Envoy 設定を確認するには、次のコマンドを使用します。

   ```
   kubectl get cec -n kube-system cilium-ingress -o yaml
   ```

   `cilium-ingress` Service の Envoy リスナーポートを取得するには、次のコマンドを使用します。この例では、`8111` が共有リスナーポートです。

   ```
   kubectl get cec -n kube-system cilium-ingress -o jsonpath={.spec.services[0].ports[0]}
   ```

1. クラスター内のノードの IP アドレスを取得します。

   ```
   kubectl get nodes -o wide
   ```

   ```
   NAME                   STATUS   ROLES    AGE   VERSION               INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
   mi-026d6a261e355fba7   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.150   <none>        Ubuntu 22.04.5 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-082f73826a163626e   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.32    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-09183e8a3d755abf6   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.33    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0d78d815980ed202d   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.97    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0daa253999fe92daa   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.100   <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   ```

1. ノードの IP アドレスと `cilium-ingress` リソースの `sharedListenerPort` を使用して、Service にアクセスします。以下の例では、使用されるノード IP アドレスは `10.80.146.32` であり、リスナーポートは `8111` です。これらをお使いの環境の値で置き換えます。

   ```
   curl -s http://10.80.146.32:8111/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
   }
   ```