

 **이 페이지 개선에 도움 주기** 

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 **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 ALB(Application Load Balancer) 및 Cilium for Kubernetes Ingress를 지원합니다. ALB 또는 Cilium for Ingress 중 무엇을 사용할지는 애플리케이션 트래픽의 소스를 기반으로 합니다. 애플리케이션 트래픽이 AWS 리전에서 발생하는 경우 AWS는 AWS ALB 및 AWS Load Balancer Controller 사용을 권장합니다. 애플리케이션 트래픽이 로컬 온프레미스 또는 엣지 환경에서 발생하는 경우 AWS는 환경에서 로드 밸런서 인프라 유무와 무관하게 사용할 수 있는 Cilium의 내장 Ingress 기능을 사용할 것을 권장합니다.

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


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

하이브리드 노드에서 실행되는 워크로드의 대상 유형 `ip`에서 [AWS Load Balancer Controller](aws-load-balancer-controller.md) 및 ALB(Application Load Balancer)를 사용할 수 있습니다. 대상 유형 `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) 섹션을 참조하세요.
+ [로드 밸런싱 운영 모범 사례](https://docs.aws.amazon.com/eks/latest/best-practices/load-balacing.html) 섹션에서 AWS Application Load Balancer와 AWS Network Load Balancer 사이에서 선택하는 방법을 참조하세요.
+ [AWS Load Balancer Controller Ingress annotations](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/ingress/annotations/) 섹션에서 AWS Application Load Balancer로 Ingress 리소스에 대해 구성할 수 있는 주석 목록을 참조하세요.

### 사전 조건
<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에 대한 자세한 내용은 [Helm 설정 지침](helm.md)을 참조하세요.
+ 명령줄 환경에 설치된 eksctl에 대한 자세한 내용은 [eksctl 설정 지침](install-kubectl.md#eksctl-install-update)을 참조하세요.

### 절차
<a name="_procedure"></a>

1. 사용자 대신 AWS API를 직접 호출할 수 있는 AWS 로드 밸런서 컨트롤러의 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 로드 밸런서 컨트롤러를 설치합니다. 클러스터 이름(`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 search repo eks/aws-load-balancer-controller --versions`를 실행하여 최신 버전의 Helm 차트를 찾을 수 있습니다.

     ```
     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가 프로비저닝되면 Ingress 리소스에 NLB 배포의 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의 주소를 사용하여 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에서는 Kubernetes 네트워킹 리소스를 정의하고 관리하는 보다 표현적이고 유연한 방법이므로 Gateway API로 시작할 것을 권장합니다. [Kubernetes Gateway API](https://gateway-api.sigs.k8s.io/)는 Kubernetes 클러스터에서 Ingress, 로드 밸런싱 및 서비스 메시에 대한 네트워킹 리소스를 정의 및 관리하는 방법을 표준화하는 것을 목표로 합니다.

Cilium의 Ingress 또는 Gateway 기능을 활성화하면 Cilium 운영자는 클러스터의 Ingress/Gateway 객체를 조정하고 각 노드의 Envoy 프록시는 L7(계층 7) 네트워크 트래픽을 처리합니다. 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 및 Gateway 비교
<a name="hybrid-nodes-ingress-cilium-comparison"></a>

아래 표에는 **Cilium 버전 1.17.x**의 Cilium Ingress 및 Cilium Gateway 기능이 요약되어 있습니다.


| Feature | Ingress | 게이트웨이 | 
| --- | --- | --- | 
|  Service 유형 LoadBalancer  |  예  |  예  | 
|  Service 유형 NodePort  |  예  |  아니요1   | 
|  호스트 네트워크  |  예  |  예  | 
|  공유 로드 밸런서  |  예  |  예  | 
|  전용 로드 밸런서  |  예  |  아니요2   | 
|  네트워크 정책  |  예  |  예  | 
|  프로토콜  |  계층 7(HTTP(S), gRPC)  |  계층 7(HTTP(S), gRPC)3   | 
|  TLS 패스스루  |  예  |  예  | 
|  트래픽 관리  |  경로 및 호스트 라우팅  |  경로 및 호스트 라우팅, URL 리디렉션 및 재작성, 트래픽 분할, 헤더 수정  | 

 1 Cilium 버전 1.18.x에서 NodePort 서비스에 대한 Cilium Gateway 지원이 계획되어 있음([\$127273](https://github.com/cilium/cilium/pull/27273))

 2 전용 로드 밸런서에 대한 Cilium Gateway 지원([\$125567](https://github.com/cilium/cilium/issues/25567))

 3 TCP/UDP에 대한 Cilium Gateway 지원([\$121929](https://github.com/cilium/cilium/issues/21929))

## Cilium Gateway 설치
<a name="hybrid-nodes-ingress-cilium-gateway-install"></a>

### 고려 사항
<a name="_considerations_2"></a>
+ 아래 예시와 같이 `nodePort.enabled`가 `true`로 설정된 상태에서 Cilium을 구성해야 합니다. Cilium의 kube-proxy 대체 기능을 사용하는 경우 `nodePort.enabled`를 `true`로 설정할 필요가 없습니다.
+ 아래 예시와 같이 `envoy.enabled`가 `true`로 설정된 상태에서 Cilium을 구성해야 합니다.
+ Cilium Gateway는 로드 밸런서(기본값) 또는 호스트 네트워크 모드로 배포할 수 있습니다.
+ 로드 밸런서 모드에서 Cilium Gateway를 사용하는 경우 레거시 AWS 클라우드 공급자가 Cilium이 Gateway 리소스에 대해 생성하는 LoadBalancer 유형의 Service에 대해 Classic Load Balancer를 생성하지 못하도록 Gateway 리소스에 `service.beta.kubernetes.io/aws-load-balancer-type: "external"` 주석이 설정되어야 합니다.
+ 호스트 네트워크 모드에서 Cilium Gateway를 사용하는 경우 LoadBalancer 유형의 Service가 비활성화됩니다. 호스트 네트워크 모드는 로드 밸런서 인프라가 없는 환경에 유용합니다. 자세한 내용은 [호스트 네트워크](#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 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`이라는 파일을 생성합니다: 아래 예시에서는 기본 로드 밸런서 모드를 사용하고 하이브리드 노드에서만 실행되도록 구성된 별도의 Envoy 프록시용 `cilium-envoy` DaemonSet를 사용하도록 Cilium Gateway를 구성합니다.

   ```
   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는 `gatewayClassName`을 `cilium`으로 설정하여 Gateway 객체에서 활성화됩니다. Cilium이 Gateway 리소스에 대해 생성하는 Service는 Gateway 객체의 필드로 구성할 수 있습니다. Gateway 컨트롤러가 로드 밸런서 인프라를 구성하는 데 사용하는 일반적인 주석은 Gateway 객체의 `infrastructure` 필드를 사용하여 구성할 수 있습니다. Cilium의 LoadBalancer IPAM을 사용하는 경우([Service 유형 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"` 주석을 사용하여 레거시 AWS 클라우드 공급자가 Cilium이 Gateway 리소스에 대해 생성하는 LoadBalancer 유형의 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. [Service 유형 LoadBalancer](#hybrid-nodes-ingress-cilium-loadbalancer)에서 Cilium LoadBalancer IPAM에 의해 할당된 IP 주소를 사용하도록 Gateway 리소스를 구성하고, [Service 유형 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>
+ 아래 예시와 같이 `nodePort.enabled`가 `true`로 설정된 상태에서 Cilium을 구성해야 합니다. Cilium의 kube-proxy 대체 기능을 사용하는 경우 `nodePort.enabled`를 `true`로 설정할 필요가 없습니다.
+ 아래 예시와 같이 `envoy.enabled`가 `true`로 설정된 상태에서 Cilium을 구성해야 합니다.
+ `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)을 참조하세요.
+ 레거시 AWS 클라우드 공급자가 [Cilium Helm 차트](https://github.com/cilium/cilium/blob/main/install/kubernetes/cilium/templates/cilium-ingress-service.yaml)에서 생성된 기본 `cilium-ingress` 서비스에 대해 Classic Load Balancer를 생성하지 못하도록 항상 Helm 값에서 `ingressController.service.annotations`를 `service.beta.kubernetes.io/aws-load-balancer-type: "external"`로 설정합니다.

### 사전 조건
<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`이라는 파일을 생성합니다: 아래 예시에서는 기본 로드 밸런서 `dedicated` 모드를 사용하고 하이브리드 노드에서만 실행되도록 구성된 별도의 Envoy 프록시용 `cilium-envoy` DaemonSet를 사용하도록 Cilium Ingress를 구성합니다.

   ```
   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는 `ingressClassName`을 `cilium`으로 설정하여 Ingress 객체에서 활성화됩니다. 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) 페이지를 참조하세요.


| Annotation | 설명 | 
| --- | --- | 
|   `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"` 주석을 사용하여 레거시 AWS 클라우드 공급자가 Cilium이 Ingress 리소스에 대해 생성하는 LoadBalancer 유형의 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. [Service 유형 LoadBalancer](#hybrid-nodes-ingress-cilium-loadbalancer)에서 Cilium LoadBalancer IPAM에 의해 할당된 IP 주소를 사용하도록 Ingress 리소스를 구성하고, [Service 유형 NodePort](#hybrid-nodes-ingress-cilium-nodeport) 또는 [호스트 네트워크](#hybrid-nodes-ingress-cilium-host-network)에서 NodePort 또는 호스트 네트워크 주소를 사용하도록 Ingress 리소스를 구성합니다.

## Service 유형 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/)를 참조하세요.

**중요**  
Cilium Ingress 및 Gateway는 EKS Hybrid Nodes와 함께 AWS Load Balancer Controller 및 AWS NLB(Network Load Balancer)에서 사용할 수 없습니다. 함께 사용하려고 하면 NLB의 `target-type`이 `ip`로 설정된 경우 NLB가 LoadBalancer 유형의 Service를 지원하는 포드 IP에 직접 연결하려고 시도하므로 등록되지 않은 대상이 됩니다(ETS Hybrid Nodes에서 실행되는 워크로드에서 NLB를 사용하는 경우의 요구 사항).

### 로드 밸런서 인프라 없음
<a name="_no_load_balancer_infrastructure"></a>

환경에 로드 밸런서 인프라 및 해당 Ingress/Gateway 컨트롤러가 없는 경우 Cilium의 [LB IAM(로드 밸런서 IP 주소 관리)](https://docs.cilium.io/en/stable/network/lb-ipam/)을 사용하도록 Ingress/Gateway 리소스와 해당하는 LoadBalancer 유형의 Service를 구성할 수 있습니다. Cilium LB IPAM은 온프레미스 환경의 알려진 IP 주소 범위로 구성할 수 있고, Cilium의 기본 제공 Border Gateway Protocol(BGP) 지원 또는 L2 알림을 사용하여 LoadBalancer IP 주소를 온프레미스 네트워크에 알릴 수 있습니다.

아래 예시에서는 Ingress/Gateway 리소스에 사용할 IP 주소로 Cilium의 LB IPAM을 구성하는 방법과 온프레미스 네트워크로 LoadBalancer IP 주소를 알리도록 Cilium BGP Control Plane을 구성하는 방법을 보여줍니다. 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 주소로 바꿉니다.

    **Gateway** 

   ```
   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. Ingress/Gateway 리소스에 대한 로드 밸런서 IP 주소 범위를 구성하는 `CiliumLoadBalancerIPPool` 리소스를 포함하여 `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`을 로드 밸런서 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 리소스에 대해 Cilium LB IPAM에서 IP 주소가 할당되었는지 확인합니다.

    **Gateway** 

   ```
   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. Ingress/Gateway 리소스에 대한 LoadBalancer IP 주소를 알리는 `CiliumBGPAdvertisement` 리소스를 포함하여 `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 주소를 사용하여 Service에 액세스합니다.

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

## Service 유형 NodePort
<a name="hybrid-nodes-ingress-cilium-nodeport"></a>

환경에 로드 밸런서 인프라와 해당 Ingress 컨트롤러가 없는 경우, 또는 로드 밸런서 인프라를 자체 관리하거나 DNS 기반 로드 밸런싱을 사용하는 경우 Cilium Ingress를 구성하여 Ingress 리소스에 대해 NodePort 유형의 Service를 생성할 수 있습니다. Cilium Ingress에서 NodePort를 사용하는 경우 NodePort 유형의 Service는 포트 범위 30000-32767의 각 노드에 있는 포트에 노출됩니다. 이 모드에서 트래픽이 NodePort의 클러스터에 있는 노드에 도달하면 동일한 노드 또는 다른 노드에 있을 수 있는 서비스를 지원하는 포드로 전달됩니다.

**참고**  
Cilium 버전 1.18.x에서 NodePort 서비스에 대한 Cilium Gateway 지원이 계획되어 있음([\$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`에 패치를 적용하여 Service 유형을 LoadBalancer에서 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. Service 유형 NodePort를 사용하도록 Ingress 리소스에 대한 Service가 업데이트되었는지 확인합니다. 출력에서 HTTP 프로토콜의 포트를 기록합니다. 아래 예시에서 이 HTTP 포트는 `32353`이고, 이는 후속 단계에서 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 모드가 자동으로 비활성화되고, 호스트 네트워크 모드는 각 Ingress 또는 Gateway 리소스에 대해 이러한 대체 모드와 상호 배타적입니다. NodePort 유형의 Service에 비해 호스트 네트워크 모드는 추가로 유연하게 포트 범위를 사용할 수 있고(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
   ```

   Gateway 리소스를 생성하지 않은 경우 다음 Gateway 정의를 클러스터에 적용하여 생성할 수 있습니다. 아래 Gateway 정의는 [Cilium Gateway 배포](#hybrid-nodes-ingress-cilium-gateway-deploy)에서 설명하는 Istio Bookinfo 샘플 애플리케이션을 사용합니다. 아래 예시에서 Gateway 리소스는 호스트 네트워크에서 실행되는 Envoy 프록시의 공유 리스너 포트인 HTTP 리스너의 `8111` 포트를 사용하도록 구성됩니다. 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가 생성됩니다. 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"
   }
   ```