

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定混合節點的 Kubernetes Ingress
<a name="hybrid-nodes-ingress"></a>

本主題會說明如何為在 Amazon EKS 混合節點上執行的工作負載設定 Kubernetes Ingress。[Kubernetes Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) 會將叢集外部的 HTTP 和 HTTPS 路由公開至叢集內的服務。若要利用傳入資源，需要 Kubernetes Ingress 控制器來設定可提供網路流量的聯網基礎結構和元件。

 AWS 對於在 EKS 混合節點上執行的工作負載，support AWS Application Load Balancer (ALB) 和適用於 Kubernetes Ingress 的 Cilium。使用 ALB 還是 Cilium for Ingress 的決定取決於應用程式流量的來源。如果應用程式流量來自 AWS 區域， AWS 建議使用 AWS ALB 和 AWS Load Balancer控制器。如果應用程式流量來自本機內部部署或邊緣環境， AWS 建議使用 Cilium 的內建輸入功能，可在您的環境中搭配或不搭配負載平衡器基礎設施使用。

![EKS 混合節點傳入](http://docs.aws.amazon.com/zh_tw/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 可繞過服務層網路路徑，將流量直接轉送至 Pod。若要讓 ALB 達到混合節點上的 Pod IP 目標，您的內部部署 Pod CIDR 必須在內部部署網路上可路由。此外， AWS Load Balancer控制器使用 Webhook，並且需要從 EKS 控制平面直接通訊。如需詳細資訊，請參閱[設定混合節點的 Webhook](hybrid-nodes-webhooks.md)。

### 考量事項
<a name="_considerations"></a>
+ 如需 AWS Application Load Balancer和 AWS Load Balancer控制器的詳細資訊[搭配 Helm 的 Install AWS Load Balancer 控制器](lbc-helm.md)，請參閱[透過 Application Load Balancer 路由應用程式與 HTTP 流量](alb-ingress.md)和。
+ 如需如何在 AWS Application Load Balancer[負載平衡器和網路負載平衡器之間選擇的相關資訊，請參閱負載平衡器的最佳實務](https://docs.aws.amazon.com/eks/latest/best-practices/load-balancing.html)。 AWS Load Balancer
+ 如需可以使用應用程式[AWS Load Balancer為輸入資源設定的註釋清單，請參閱負載平衡器控制器](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/ingress/annotations/)輸入註釋。 AWS Application Load Balancer

### 先決條件
<a name="_prerequisites"></a>
+ 遵循 [設定混合節點的 CNI](hybrid-nodes-cni.md) 中的指示安裝 Cilium。
+ 遵循 [設定混合節點的 Cilium BGP](hybrid-nodes-cilium-bgp.md) 中的指示啟用 Cilium BGP 控制平面。如果您不想使用 BGP，則必須使用替代方法，以讓內部部署 Pod CIDR 在內部部署網路上可路由。如果您未讓內部部署 Pod CIDR 可路由，則 ALB 將無法註冊或聯絡您的 Pod IP 目標。
+ 已在命令列環境中安裝 Helm，如需詳細資訊，請參閱[安裝 Helm 說明](helm.md)。
+ 已在命令列環境中安裝 eksctl，如需詳細資訊，請參閱[安裝 eksctl 說明](install-kubectl.md#eksctl-install-update)。

### 程序
<a name="_procedure"></a>

1. 下載 AWS Load Balancer控制器的 IAM 政策，允許其代表您呼叫 AWS APIs。

   ```
   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 Chart 儲存庫並更新您的本機 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控制器 Helm Chart 版本 (`AWS_LBC_HELM_VERSION`) 的值取代為您的設定，並執行下列命令。如果您在 AWS 雲端中同時執行混合模式叢集與混合節點和節點，則可以遵循 中的指示，在雲端節點上執行 AWS Load Balancer控制器[AWS Load Balancer 控制器](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-lbc)。
   + 您可以透過執行 `helm search repo eks/aws-load-balancer-controller --versions` 來尋找最新版本的 Helm Chart。

     ```
     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控制器。

   ```
   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. 將傳入組態套用至叢集。

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

1. 為您的傳入資源佈建 ALB 可能需要幾分鐘的時間。佈建 ALB 後，您的傳入資源將會為其指派一個與 ALB 部署的 DNS 名稱對應的地址。地址的格式為 `<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 的地址存取服務。

   ```
   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 的傳入功能內建於 Cilium 的架構中，並且可以使用 Kubernetes 傳入 API 或閘道 API 進行管理。如果您沒有現有的輸入資源， AWS 建議您從閘道 API 開始，因為它是定義和管理 Kubernetes 網路資源更明確且靈活的方法。[Kubernetes 閘道 API](https://gateway-api.sigs.k8s.io/) 旨在標準化 Kubernetes 叢集中傳入、負載平衡和服務網格的網路資源的定義和管理方式。

當您啟用 Cilium 的傳入或閘道功能時，Cilium 運算子會協調叢集中的傳入/閘道物件，而每個節點上的 Envoy 代理會處理第 7 層 (L7) 網路流量。Cilium 不會直接佈建傳入/閘道基礎結構，例如負載平衡器。如果您計劃搭配負載平衡器使用 Cilium 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 和 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 計劃在 Cilium 版本 1.18.x 中對 NodePort 服務提供支援 ([\#27273](https://github.com/cilium/cilium/pull/27273))

 2 Cilium Gateway 支援專用負載平衡器 ([\#25567](https://github.com/cilium/cilium/issues/25567))

 3 Cilium Gateway 支援 TCP/UDP ([\#21929](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 時，必須在閘道資源上設定`service.beta.kubernetes.io/aws-load-balancer-type: "external"`註釋，以防止舊版 AWS 雲端提供者為 Cilium 為閘道資源建立的 LoadBalancer 類型的服務建立 Classic Load Balancer。 LoadBalancer 
+ 在主機網路模式中使用 Cilium Gateway 時，即會停用 LoadBalancer 類型的服務模式。對於沒有負載平衡器基礎結構的環境，主機網路模式非常有用，如需詳細資訊，請參閱 [主機網路](#hybrid-nodes-ingress-cilium-host-network)。

### 先決條件
<a name="_prerequisites_2"></a>

1. 已在命令列環境中安裝 Helm，請參閱[安裝 Helm 說明](helm.md)。

1. 遵循 [設定混合節點的 CNI](hybrid-nodes-cni.md) 中的指示安裝 Cilium。

### 程序
<a name="_procedure_2"></a>

1. 安裝 Kubernetes 閘道 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 Pod 正在執行。

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

將 `gatewayClassName` 設定為 `cilium`，即可在閘道物件上啟用 Cilium Ingress。Cilium 為閘道資源建立的服務可以使用閘道物件上的欄位進行設定。閘道控制器用來設定負載平衡器基礎結構的常見註釋可以透過閘道物件的 `infrastructure` 欄位進行設定。使用 Cilium 的 LoadBalancer IPAM 時 (請參閱 [服務類型 LoadBalancer](#hybrid-nodes-ingress-cilium-loadbalancer) 中的範例)，可在閘道物件的 `addresses` 欄位中設定用於 LoadBalancer 類型的服務的 IP 位址。如需閘道組態的詳細資訊，請參閱 [Kubernetes 閘道 API 規格](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.kubernetes.io/...
  addresses:
  - type: IPAddress
    value: <LoadBalancer IP address>
  listeners:
  ...
```

Cilium 和 Kubernetes Gateway 規格支援 GatewayClass、閘道、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"`註釋，以防止舊版 AWS 雲端提供者為 Cilium 為閘道資源建立的 LoadBalancer 類型服務建立 Classic Load Balancer。 LoadBalancer 

   ```
   ---
   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. 將閘道資源套用至您的叢集。

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

1. 確認閘道資源和對應的服務已建立。在此階段，閘道資源的 `ADDRESS` 欄位預期不會填入 IP 位址或主機名稱，而且閘道資源的 LoadBalancer 類型的服務同樣不會指派 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 位址；以及使用 [服務類型 NodePort](#hybrid-nodes-ingress-cilium-nodeport) 或 [主機網路](#hybrid-nodes-ingress-cilium-host-network) 以設定閘道資源，進而使用 NodePort 或主機網路位址。

## 安裝 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 會為每個傳入資源建立專用服務。將 `ingressController.loadbalancerMode` 設定為 `shared` 時，Cilium 會為叢集中的所有傳入資源建立 LoadBalancer 類型的共用服務。使用 `shared` 負載平衡器模式時，共用服務的設定 (例如 `labels`、`annotations`、`type` 和 `loadBalancerIP`) 可在 Helm 值的 `ingressController.service` 區段中進行設定。如需詳細資訊，請參閱 [Cilium Helm 值參考](https://github.com/cilium/cilium/blob/v1.17.6/install/kubernetes/cilium/values.yaml#L887)。
+ 將 `ingressController.default` 設定 `true` 時，Cilium 會設定為叢集的預設傳入控制器，即使未在傳入資源上指定 `ingressClassName`，也會建立傳入項目。
+ Cilium Ingress 可以部署在負載平衡器 (預設)、節點連接埠或主機網路模式中。在主機網路模式下安裝 Cilium 時，會停用 LoadBalancer 類型的服務和 NodePort 類型的服務模式。如需詳細資訊，請參閱[主機網路](#hybrid-nodes-ingress-cilium-host-network)。
+ 一律在 Helm 值`service.beta.kubernetes.io/aws-load-balancer-type: "external"`中`ingressController.service.annotations`將 設定為 ，以防止舊版 AWS 雲端提供者為 [Cilium Helm Chart](https://github.com/cilium/cilium/blob/main/install/kubernetes/cilium/templates/cilium-ingress-service.yaml) 建立的預設`cilium-ingress`服務建立 Classic Load Balancer。

### 先決條件
<a name="_prerequisites_3"></a>

1. 已在命令列環境中安裝 Helm，請參閱[安裝 Helm 說明](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 Pod 正在執行。

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

將 `ingressClassName` 設定為 `cilium`，即可在 Ingress 物件上啟用 Cilium Ingress。當使用 `dedicated` 負載平衡器模式時，Cilium 為傳入資源建立的服務可藉助傳入物件上的注釋進行設定，而當使用 `shared` 負載平衡器模式時，則可在 Cilium/Helm 組態中進行設定。傳入控制器通常會使用這些註釋來設定負載平衡器基礎結構或服務的其他屬性，例如服務類型、負載平衡器模式、連接埠和 TLS 傳遞。重要註釋如下所述。如需支援的註釋的完整清單，請參閱 Cilium 文件中的 [Cilium Ingress 註釋](https://docs.cilium.io/en/stable/network/servicemesh/ingress/#supported-ingress-annotations)。


| 註釋 | Description | 
| --- | --- | 
|  `ingress.cilium.io/loadbalancer-mode`  |  `dedicated`：每個傳入資源的 LoadBalancer 類型的專用服務 (預設)。<br /> `shared`：所有傳入資源的 LoadBalancer 類型的單一服務。 | 
|  `ingress.cilium.io/service-type`  |  `LoadBalancer`：服務屬於 LoadBalancer 類型 (預設)<br /> `NodePort`：服務屬於 NodePort。 | 
|  `service.beta.kubernetes.io/aws-load-balancer-type`  |  `"external"`：防止舊版 AWS 雲端提供者為 LoadBalancer 類型的服務佈建 Classic Load Balancer。 LoadBalancer | 
|  `lbipam.cilium.io/ips`  | 要從 Cilium LoadBalancer IPAM 配置的 IP 位址的清單 | 

Cilium 和 Kubernetes Ingress 規格可支援傳入路徑的精確、字首和實作特定相符規則。Cilium 支援 regex 作為其實作專屬相符規則。如需詳細資訊，請參閱 Cilium 文件中的[傳入路徑類型和優先順序](https://docs.cilium.io/en/stable/network/servicemesh/ingress/#ingress-path-types-and-precedence)和[路徑類型範例](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.kubernetes.io/...
    service.kubernetes.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"`註釋，以防止舊版 AWS 雲端提供者為 Cilium 為輸入資源建立的 LoadBalancer 類型的服務建立 Classic Load Balancer。 LoadBalancer 

   ```
   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. 將傳入資源套用至您的叢集。

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

1. 確認傳入資源和對應的服務已建立。在此階段，傳入資源的 `ADDRESS` 欄位預期不會填入 IP 位址或主機名稱，而且傳入資源的 LoadBalancer 類型的共用或專用服務同樣不會指派 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 位址；以及使用 [服務類型 NodePort](#hybrid-nodes-ingress-cilium-nodeport) 或 [主機網路](#hybrid-nodes-ingress-cilium-host-network) 以設定傳入資源，進而使用 NodePort 或主機網路位址。

## 服務類型 LoadBalancer
<a name="hybrid-nodes-ingress-cilium-loadbalancer"></a>

### 現有的負載平衡器基礎結構
<a name="_existing_load_balancer_infrastructure"></a>

根據預設，對於 Cilium Ingress 和 Cilium Gateway，Cilium 會為傳入/閘道資源建立 LoadBalancer 類型的 Kubernetes Service。Cilium 建立的服務屬性可以透過傳入和閘道資源進行設定。當您建立傳入或閘道資源時，傳入或閘道的外部公開 IP 位址或主機名稱會從負載平衡器基礎結構進行配置，並且通常由傳入或閘道控制器進行佈建。

許多傳入和閘道控制器會使用註釋來偵測和設定負載平衡器基礎結構。如上述範例所示，這些傳入和閘道控制器的註釋會在傳入或閘道資源上設定。如需其支援的註釋，請參閱傳入或閘道控制器的文件，而如需熱門控制器的清單，則請參閱 [Kubernetes Ingress 文件](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/)和 [Kubernetes Gateway 文件](https://gateway-api.sigs.k8s.io/implementations/)。

**重要**  
Cilium Ingress 和 Gateway 不能與 EKS 混合節點的 AWS Load Balancer控制器和 AWS 網路負載平衡器 (NLBs) 搭配使用。嘗試將其一起使用會導致未註冊的目標，因為當 NLB 的 `target-type` 設定為 `ip` 時，NLB 會嘗試直接連接至支援 LoadBalancer 類型的服務的 Pod IP (要求搭配使用 NLB 與在 EKS 混合節點上執行的工作負載)。

### 沒有負載平衡器基礎結構
<a name="_no_load_balancer_infrastructure"></a>

如果您的環境中沒有負載平衡器基礎結構和對應的傳入/閘道控制器，則可以將傳入/閘道資源和對應的 LoadBalancer 類型的服務設定為使用 Cilium [Load Balancer IP 位址管理](https://docs.cilium.io/en/stable/network/lb-ipam/) (LB IPAM) 配置的 IP 位址。Cilium LB IPAM 可以使用來自您內部部署環境的已知 IP 位址範圍進行設定，並且可以使用 Cilium 的內建邊界閘道協定 (BGP) 支援或 L2 公告，從而向內部部署網路公告 LoadBalancer IP 位址。

以下範例說明如何使用 IP 位址設定 Cilium 的 LB IPAM 以用於您的傳入/閘道資源，以及如何設定 Cilium BGP 控制平面以向內部部署網路公告 LoadBalancer IP 位址。根據預設，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 位址在內部部署網路上可路由之前，您將無法存取您的傳入或閘道資源。

#### 程序
<a name="_procedure_4"></a>

1. 選擇性地修補傳入或閘道資源，以請求用於 LoadBalancer 類型的服務的特定 IP 位址。如果您未請求特定 IP 位址，Cilium 將從後續步驟中的 `CiliumLoadBalancerIPPool` 資源中設定的 IP 位址範圍配置 IP 位址。在下列命令中，使用 IP 位址取代 `LB_IP_ADDRESS`，以請求 LoadBalancer 類型的服務。

    **閘道** 

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

    **傳入** 

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

1. 使用 `CiliumLoadBalancerIPPool` 資源建立名為 `cilium-lbip-pool-ingress.yaml` 的檔案，以為您的傳入/閘道資源設定 Load Balancer IP 位址範圍。
   + 如果您使用的是 Cilium Ingress，Cilium 會自動將 `cilium.io/ingress: "true"` 標籤套用至其為傳入資源建立的服務。您可以在 `CiliumLoadBalancerIPPool` 資源定義的 `serviceSelector` 欄位中使用此標籤，以選取符合 LB IPAM 資格的服務。
   + 如果您使用的是 Cilium Gateway，則可以使用 `CiliumLoadBalancerIPPool` 資源定義的 `serviceSelector` 欄位中的 `gateway.networking.k8s.io/gateway-name` 標籤來選取符合 LB IPAM 資格的閘道資源。
   + 使用用於 Load Balancer IP 位址的 IP 位址範圍取代 `LB_IP_CIDR`。若要選取單一 IP 位址，請使用 `/32` CIDR。如需詳細資訊，請參閱 Cilium 文件中的 [LoadBalancer IP 位址管理](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. 確認已從 Cilium LB IPAM 為傳入/閘道資源配置 IP 位址。

    **閘道** 

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

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

    **傳入** 

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

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

1. 使用 `CiliumBGPAdvertisement` 資源建立名為 `cilium-bgp-advertisement-ingress.yaml` 的檔案，以為您的傳入/閘道資源公告 LoadBalancer IP 位址。如果您不使用 Cilium BGP，則可以略過此步驟。用於傳入/閘道的 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>

如果您在環境中沒有負載平衡器基礎結構和對應的傳入控制器，或者您是自我管理負載平衡器基礎結構或使用 DNS 型負載平衡，則可以將 Cilium Ingress 設定為為傳入資源建立 NodePort 類型的服務。搭配 Cilium Ingress 使用 NodePort 時，NodePort 類型的服務會在連接埠範圍 30000-32767 內每個節點的連接埠上公開。在此模式中，當流量到達 NodePort 上叢集中的任何節點時，即會轉送到可傳回服務的 Pod，而這些 Pod 可能位於相同的節點，也可能位於不同的節點。

**注意**  
Cilium Gateway 計劃在 Cilium 版本 1.18.x 中對 NodePort 服務提供支援 ([\#27273](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. 修補現有的傳入資源 `my-ingress`，以將其從 LoadBalancer 類型的服務變更為 NodePort。

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

   如果您尚未建立傳入資源，則可以將下列傳入定義套用至叢集，進而建立傳入資源。請注意，以下傳入定義會使用 [部署 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. 確認傳入資源的服務已更新為使用服務類型 NodePort。請注意輸出中的 HTTP 通訊協定的連接埠。在以下範例中，此 HTTP 連接埠是 `32353`，且在後續步驟中，將用其來查詢服務。搭配 NodePort 類型的服務使用 Cilium Ingress 的優點是，對於 Ingress 流量，您可以套用路徑和以主機為基礎的路由以及相關網路政策，而對於沒有 Ingress 的標準 NodePort 類型的服務，您則無法如此操作。

   ```
   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 類型的服務。在以下範例中，使用的節點 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 類型的服務，如果您沒有負載平衡器基礎結構和傳入或閘道控制器，或者如果您使用外部負載平衡器自我管理負載平衡，則可以將 Cilium Ingress 和 Cilium Gateway 設定為可直接在主機網路上公開傳入和閘道資源。為傳入或閘道資源啟用主機網路模式時，會自動停用 LoadBalancer 類型和 NodePort 類型的服務模式，而主機網路模式會與每個傳入或閘道資源的這些替代模式互斥。相較於 NodePort 類型的服務模式，主機網路模式能擴增可使用的連接埠範圍 (不限於 30000-32767 NodePort 範圍)，並且您可以設定 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
   ```

   如果您尚未建立閘道資源，則可以將下列閘道定義套用至叢集，進而建立閘道資源。以下閘道定義會使用 [部署 Cilium Gateway](#hybrid-nodes-ingress-cilium-gateway-deploy) 中所述的 Istio Bookinfo 範例應用程式。在以下範例中，閘道資源會設定為使用 HTTP 接聽程式的 `8111` 連接埠，而這是主機網路上執行的 Envoy 代理程式的共用接聽程式連接埠。如果您為閘道資源使用了具有特殊權限的連接埠 (低於 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` 服務的 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` 資源的接聽程式連接埠存取服務。在以下範例中，使用的節點 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 問題 ([\#34028](https://github.com/cilium/cilium/issues/34028))，主機網路模式中的 Cilium Ingress 需要使用 `loadbalancerMode: shared`，而這會為叢集中的所有傳入資源建立 ClusterIP 類型的單一服務。如果您為傳入資源使用了具有特殊權限的連接埠 (低於 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
   ```

   如果您尚未建立傳入資源，則可以將下列傳入定義套用至叢集，進而建立傳入資源。以下傳入定義會使用 [部署 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` 服務的 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` 存取服務。在以下範例中，使用的節點 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"
   }
   ```