하이브리드 노드에 대한 Kubernetes Ingress 구성 - Amazon EKS

이 페이지 개선에 도움 주기

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 GitHub에서 이 페이지 편집 링크를 선택합니다.

하이브리드 노드에 대한 Kubernetes Ingress 구성

이 주제에서는 Amazon EKS Hybrid Nodes에서 실행되는 워크로드에 대해 Kubernetes Ingress를 구성하는 방법을 설명합니다. Kubernetes 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

AWS Application Load Balancer

하이브리드 노드에서 실행되는 워크로드의 대상 유형 ip에서 AWS Load Balancer Controller 및 ALB(Application Load Balancer)를 사용할 수 있습니다. 대상 유형 ip를 사용하는 경우 ALB는 Service 계층 네트워크 경로를 우회하여 트래픽을 포드로 직접 전달합니다. ALB가 하이브리드 노드의 포드 IP 대상에 도달하려면 온프레미스 포드 CIDR이 온프레미스 네트워크에서 라우팅 가능해야 합니다. 추가로 AWS Load Balancer Controller는 웹후크를 사용하며 EKS 컨트롤 플레인과의 직접 통신이 필요합니다. 자세한 내용은 하이브리드 노드용 웹후크 구성 섹션을 참조하세요.

고려 사항

사전 조건

  • 하이브리드 노드에 대한 CNI 구성의 지침에 따라 Cilium이 설치되어 있습니다.

  • 하이브리드 노드에 대한 Cilium BGP 구성의 지침에 따라 Cilium BGP 컨트롤 플레인이 활성화되어 있습니다. BGP를 사용하지 않으려면 다른 방법을 사용하여 온프레미스 포드 CIDR이 온프레미스 네트워크에서 라우팅할 수 있도록 해야 합니다. 온프레미스 포드 CIDR을 라우팅할 수 있도록 하지 않으면 ALB가 포드 IP 대상을 등록하거나 연결할 수 없습니다.

  • 명령줄 환경에 설치된 Helm에 대한 자세한 내용은 Helm 설정 지침을 참조하세요.

  • 명령줄 환경에 설치된 eksctl에 대한 자세한 내용은 eksctl 설정 지침을 참조하세요.

절차

  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
  2. 이전 단계에서 다운로드한 정책을 사용하여 IAM 정책을 만듭니다.

    aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
  3. 클러스터 이름(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
  4. eks-charts Helm 차트 리포지토리를 추가하고 최신 차트가 적용되도록 로컬 Helm 리포지토리를 업데이트합니다.

    helm repo add eks https://aws.github.io/eks-charts
    helm repo update eks
  5. AWS 로드 밸런서 컨트롤러를 설치합니다. 클러스터 이름(CLUSTER_NAME), AWS 리전(AWS_REGION), VPC ID(VPC_ID) 및 AWS Load Balancer Controller Helm 차트 버전(AWS_LBC_HELM_VERSION)의 값을 사용자 설정에 맞춰 바꾸고 다음 명령을 실행합니다. 하이브리드 노드와 AWS 클라우드의 노드가 모두 있는 혼합 모드 클러스터를 실행하는 경우 AWS 로드 밸런서 컨트롤러의 지침에 따라 클라우드 노드에서 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
  6. 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
  7. 샘플 애플리케이션을 생성합니다. 아래 예시에서는 Istio Bookinfo 샘플 마이크로서비스 애플리케이션을 사용합니다.

    kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
  8. 다음 콘텐츠를 가진 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
  9. 클러스터에 Ingress 구성을 적용합니다.

    kubectl apply -f my-ingress-alb.yaml
  10. 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
  11. 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 개요

Cilium의 Ingress 기능은 Cilium의 아키텍처에 내장되어 있으며 Kubernetes Ingress API 또는 Gateway API로 관리할 수 있습니다. 기존 Ingress 리소스가 없는 경우 AWS에서는 Kubernetes 네트워킹 리소스를 정의하고 관리하는 보다 표현적이고 유연한 방법이므로 Gateway API로 시작할 것을 권장합니다. Kubernetes Gateway API는 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 IngressCilium Gateway 페이지를 참조하세요.

Cilium Ingress 및 Gateway 비교

아래 표에는 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 지원이 계획되어 있음(#27273)

2 전용 로드 밸런서에 대한 Cilium Gateway 지원(#25567)

3 TCP/UDP에 대한 Cilium Gateway 지원(#21929)

Cilium Gateway 설치

고려 사항

  • 아래 예시와 같이 nodePort.enabledtrue로 설정된 상태에서 Cilium을 구성해야 합니다. Cilium의 kube-proxy 대체 기능을 사용하는 경우 nodePort.enabledtrue로 설정할 필요가 없습니다.

  • 아래 예시와 같이 envoy.enabledtrue로 설정된 상태에서 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가 비활성화됩니다. 호스트 네트워크 모드는 로드 밸런서 인프라가 없는 환경에 유용합니다. 자세한 내용은 호스트 네트워크 섹션을 참조하세요.

사전 조건

  1. 명령줄 환경에 Helm이 설치되어 있습니다. Helm 설정 지침을 참조하세요.

  2. 하이브리드 노드에 대한 CNI 구성의 지침에 따라 Cilium이 설치되어 있습니다.

절차

  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
  2. 다음 콘텐츠를 가진 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
  3. 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
  4. 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 구성

Cilium Gateway는 gatewayClassNamecilium으로 설정하여 Gateway 객체에서 활성화됩니다. Cilium이 Gateway 리소스에 대해 생성하는 Service는 Gateway 객체의 필드로 구성할 수 있습니다. Gateway 컨트롤러가 로드 밸런서 인프라를 구성하는 데 사용하는 일반적인 주석은 Gateway 객체의 infrastructure 필드를 사용하여 구성할 수 있습니다. Cilium의 LoadBalancer IPAM을 사용하는 경우(Service 유형 LoadBalancer의 예시 참조), LoadBalancer 유형의 Service에 사용할 IP 주소를 Gateway 객체의 addresses 필드에 구성할 수 있습니다. Gateway 구성에 대한 자세한 내용은 Kubernetes Gateway API specification 페이지를 참조하세요.

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 리소스를 지원합니다.

Cilium Gateway 배포

  1. 샘플 애플리케이션을 생성합니다. 아래 예시에서는 Istio Bookinfo 샘플 마이크로서비스 애플리케이션을 사용합니다.

    kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
  2. 애플리케이션이 성공적으로 실행 중인지 확인합니다.

    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
  3. 다음 콘텐츠를 가진 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
  4. Gateway 리소스를 클러스터에 적용합니다.

    kubectl apply -f my-gateway.yaml
  5. 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
  6. Service 유형 LoadBalancer에서 Cilium LoadBalancer IPAM에 의해 할당된 IP 주소를 사용하도록 Gateway 리소스를 구성하고, Service 유형 NodePort 또는 호스트 네트워크에서 NodePort 또는 호스트 네트워크 주소를 사용하도록 Gateway 리소스를 구성합니다.

Cilium Ingress 설치

고려 사항

  • 아래 예시와 같이 nodePort.enabledtrue로 설정된 상태에서 Cilium을 구성해야 합니다. Cilium의 kube-proxy 대체 기능을 사용하는 경우 nodePort.enabledtrue로 설정할 필요가 없습니다.

  • 아래 예시와 같이 envoy.enabledtrue로 설정된 상태에서 Cilium을 구성해야 합니다.

  • ingressController.loadbalancerModededicated로 설정되면 Cilium은 각 Ingress 리소스에 대한 전용 Service를 생성합니다. ingressController.loadbalancerModeshared로 설정되면 Cilium은 클러스터의 모든 Ingress 리소스에 대해 LoadBalancer 유형의 공유 Service를 생성합니다. shared 로드 밸런서 모드를 사용하는 경우 labels, annotations, typeloadBalancerIP 등 공유 Service에 대한 설정이 Helm 값의 ingressController.service 섹션에 구성됩니다. 자세한 내용은 Cilium Helm values reference 페이지를 참조하세요.

  • ingressController.defaulttrue로 설정되면 Cilium이 클러스터의 기본 Ingress 컨트롤러로 구성되고 ingressClassName가 Ingress 리소스에 지정되지 않은 경우에도 Ingress 항목을 생성합니다.

  • Cilium Ingress는 로드 밸런서(기본값), 노드 포트 또는 호스트 네트워크 모드에서 배포될 수 있습니다. 호스트 네트워크 모드에서 Cilium이 설치되면 LoadBalancer 유형의 Service 및 NodePort 유형의 Service가 비활성화됩니다. 자세한 정보는 호스트 네트워크을 참조하세요.

  • 레거시 AWS 클라우드 공급자가 Cilium Helm 차트에서 생성된 기본 cilium-ingress 서비스에 대해 Classic Load Balancer를 생성하지 못하도록 항상 Helm 값에서 ingressController.service.annotationsservice.beta.kubernetes.io/aws-load-balancer-type: "external"로 설정합니다.

사전 조건

  1. 명령줄 환경에 Helm이 설치되어 있습니다. Helm 설정 지침을 참조하세요.

  2. 하이브리드 노드에 대한 CNI 구성의 지침에 따라 Cilium이 설치되어 있습니다.

절차

  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
  2. 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
  3. 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 구성

Cilium Ingress는 ingressClassNamecilium으로 설정하여 Ingress 객체에서 활성화됩니다. Cilium이 Ingress 리소스에 대해 생성하는 Service는 dedicated 로드 밸런서 모드를 사용할 때 Ingress 객체의 주석으로, 그리고 shared 로드 밸런서 모드를 사용할 때 Cilium/Helm 구성으로 구성할 수 있습니다. 이러한 주석은 일반적으로 Ingress 컨트롤러에서 로드 밸런서 인프라, 또는 서비스 유형, 로드 밸런서 모드, 포트 및 TLS 패스스루 등 Service의 기타 속성을 구성하는 데 사용됩니다. 주요 주석은 아래에서 설명합니다. 지원되는 주석의 전체 목록은 Cilium 문서의 Cilium 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 precedencePath types examples 페이지와 이 페이지의 Cilium Ingress 배포 섹션에 있는 예시를 참조하세요.

다음은 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 배포

  1. 샘플 애플리케이션을 생성합니다. 아래 예시에서는 Istio Bookinfo 샘플 마이크로서비스 애플리케이션을 사용합니다.

    kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
  2. 애플리케이션이 성공적으로 실행 중인지 확인합니다.

    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
  3. 다음 콘텐츠를 가진 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
  4. 클러스터에 Ingress 리소스를 적용합니다.

    kubectl apply -f my-ingress.yaml
  5. 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
  6. Service 유형 LoadBalancer에서 Cilium LoadBalancer IPAM에 의해 할당된 IP 주소를 사용하도록 Ingress 리소스를 구성하고, Service 유형 NodePort 또는 호스트 네트워크에서 NodePort 또는 호스트 네트워크 주소를 사용하도록 Ingress 리소스를 구성합니다.

Service 유형 LoadBalancer

기존 로드 밸런서 인프라

기본적으로 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 문서Kubernetes Gateway 문서를 참조하세요.

중요

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

로드 밸런서 인프라 없음

환경에 로드 밸런서 인프라 및 해당 Ingress/Gateway 컨트롤러가 없는 경우 Cilium의 LB IAM(로드 밸런서 IP 주소 관리)을 사용하도록 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 리소스가 생성될 때까지 활성화되지 않습니다.

사전 조건

  • Cilium Ingress 설치 또는 Cilium Gateway 설치의 지침에 따라 설치된 Cilium Ingress 또는 Gateway가 설치되어 있습니다.

  • Cilium Ingress 배포 또는 Cilium Gateway 배포의 지침에 따라 Cilium Ingress 또는 Gateway 리소스에 샘플 애플리케이션이 배포되어 있습니다.

  • 하이브리드 노드에 대한 Cilium BGP 구성의 지침에 따라 Cilium BGP 컨트롤 플레인이 활성화되어 있습니다. BGP를 사용하지 않으려는 경우 이 사전 조건을 건너뛸 수 있지만 Cilium LB IPAM에서 할당한 LoadBalancer IP 주소가 온프레미스 네트워크에서 라우팅될 때까지 Ingress 또는 Gateway 리소스에 액세스할 수 없습니다.

절차

  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"}} }'
  2. 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 섹션을 참조하세요.

      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"
  3. 클러스터에 CiliumLoadBalancerIPPool 리소스를 적용합니다.

    kubectl apply -f cilium-lbip-pool-ingress.yaml
  4. 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
  5. 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"
  6. 클러스터에 CiliumBGPAdvertisement 리소스를 적용합니다.

    kubectl apply -f cilium-bgp-advertisement-ingress.yaml
  7. 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

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

참고

Cilium 버전 1.18.x에서 NodePort 서비스에 대한 Cilium Gateway 지원이 계획되어 있음(#27273)

사전 조건

  • Cilium Ingress 설치의 지침에 따라 설치된 Cilium Ingress가 설치되어 있습니다.

  • Cilium Ingress 배포의 지침에 따라 Cilium Ingress 리소스에 샘플 애플리케이션이 배포되어 있습니다.

절차

  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 배포에서 설명하는 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
  2. 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
  3. 클러스터에서 노드의 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
  4. 노드의 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" }

호스트 네트워크

NodePort 유형의 Service와 마찬가지로 로드 밸런서 인프라와 Ingress 또는 Gateway 컨트롤러가 없는 경우, 또는 외부 로드 밸런서를 사용하여 로드 밸런싱을 자체 관리하는 경우 호스트 네트워크에서 직접 Ingress 및 Gateway 리소스를 노출하도록 Cilium Ingress 및 Cilium Gateway를 구성할 수 있습니다. Ingress 또는 Gateway 리소스에 대해 호스트 네트워크 모드가 활성화되면 LoadBalancer 유형의 Service 및 NodePort 모드가 자동으로 비활성화되고, 호스트 네트워크 모드는 각 Ingress 또는 Gateway 리소스에 대해 이러한 대체 모드와 상호 배타적입니다. NodePort 유형의 Service에 비해 호스트 네트워크 모드는 추가로 유연하게 포트 범위를 사용할 수 있고(30000-32767의 NodePort 범위로 제한되지 않음) 호스트 네트워크에서 Envoy 프록시가 실행되는 노드의 하위 집합을 구성할 수 있습니다.

사전 조건

절차

게이트웨이

  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
  2. 호스트 네트워크 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 배포에서 설명하는 Istio Bookinfo 샘플 애플리케이션을 사용합니다. 아래 예시에서 Gateway 리소스는 호스트 네트워크에서 실행되는 Envoy 프록시의 공유 리스너 포트인 HTTP 리스너의 8111 포트를 사용하도록 구성됩니다. Gateway 리소스에 대한 권한 있는 포트(1023 미만)를 사용하는 경우 지침은 Cilium 문서를 참조하세요.

    --- 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]}
  3. 클러스터에서 노드의 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
  4. 노드의 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

업스트림 Cilium 문제(#34028)로 인해 호스트 네트워크 모드의 Cilium Ingress에는 loadbalancerMode: shared 사용이 필요하고, 이로 인해 클러스터의 모든 Ingress 리소스에 대해 ClusterIP 유형의 단일 Service가 생성됩니다. Ingress 리소스에 대한 권한 있는 포트(1023 미만)를 사용하는 경우 지침은 Cilium 문서를 참조하세요.

  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
  2. 호스트 네트워크 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 배포에서 설명하는 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]}
  3. 클러스터에서 노드의 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
  4. 노드의 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" }