내용으로 건너뛰기

Amazon EKS에서 인그레스 NGINX 컨트롤러를 구성하고 문제를 해결하려면 어떻게 해야 합니까?

6분 분량
0

Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터에서 Kubernetes용 인그레스 NGINX 컨트롤러를 설치하려고 합니다. 또한 문제를 해결하고 싶습니다.

간략한 설명

인그레스 NGINX 컨트롤러는 오픈 소스 HTTP 및 역방향 프록시 서버인 NGINX 인스턴스를 포함하는 포드를 배포, 구성 및 관리합니다. 이러한 포드는 컨트롤러의 서비스 리소스를 통해 노출됩니다. 서비스 리소스는 Kubernetes 인그레스 및 서비스 리소스가 나타내는 관련 애플리케이션에 대한 트래픽을 수신합니다. 자세한 내용은 GitHub 웹 사이트의 인그레스 NGINX 컨트롤러 및 NGINX 웹 사이트의 NGINX를 참조하십시오.

해결 방법

선택 사항: 헬름을 설치하십시오. 자세한 내용은 헬름 웹 사이트에서 헬름 설치를 참조하십시오. YAML 매니페스트를 사용하여 인그레스 NGINX 컨트롤러를 설치할 때는 헬름이 필요하지 않습니다.

선택 사항: AWS Load Balancer Controller를 설치합니다. 이 컨트롤러는 Network Load Balancer 대상 그룹 대상 유형을 IP 대상 유형으로 구성하는 데 필요합니다. IP 대상 유형은 인그레스 NGINX 컨트롤러 포드 IP를 대상 그룹에 등록합니다. 인스턴스 대상 유형은 NodePort의 인그레스 NGINX 컨트롤러 서비스를 사용하여 인스턴스를 등록합니다.

인그레스 INGINX 컨트롤러 설치

다음 방법 중 하나를 사용하여 Kubernetes 클러스터에 인그레스 NGINX 컨트롤러를 설치합니다.

다양한 구성 요소를 모두 정의하는 YAML 매니페스트 파일을 사용하십시오. kubectl을 사용하여 매니페스트에 리소스를 만듭니다.

-또는-

헬름을 사용하여 프로젝트의 리포지토리 차트를 통해 인그레스 NGINX 컨트롤러를 배포합니다.

AWS Classic Load Balancer 또는 AWS Network Load Balancer를 통해 인그레스 NGINX 컨트롤러를 외부에 노출할 수 있습니다. 기본적으로 두 방법은 모두 인터넷 연결 Classic Load Balancer를 통해 컨트롤러를 노출합니다.

헬름을 사용하여 인그레스 NGINX 컨트롤러 배포

해당 명령을 사용하여 컨트롤러를 설정하고 노출합니다.

인터넷 연결 Classic Load Balancer

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
ingress-nginx

내부 Classic Load Balancer

인그레스 NGINX 컨트롤러를 노출하는 Kubernetes Service에 다음 주석을 추가해야 합니다.

service.beta.kubernetes.io/aws-load-balancer-internal: true

예:

인터넷 연결 Network Load Balancer

Load Balancer를 Classic에서 Network로 변경하려면 다음 주석을 추가합니다.

service.beta.kubernetes.io/aws-load-balancer-type: nlb

예:

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="nlb" \
ingress-nginx

내부 Network Load Balancer

내부 Network Load Balancer를 프로비저닝하려면 다음 주석을 추가합니다.

service.beta.kubernetes.io/aws-load-balancer-type: nlb

service.beta.kubernetes.io/aws-load-balancer-internal: true

예:

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="nlb" \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-internal"="true" \
ingress-nginx

AWS Load Balancer Controller를 통한 IP 모드의 Network Load Balancer

클러스터에는 AWS Load Balancer Controller가 설치되어 있어야 합니다. 자세한 내용은 GitHub 웹 사이트에서 AWS Load Balancer Controller를 참조하십시오.

다음 주석을 사용하여 AWS Load Balancer Controller가 Network Load Balancer의 프로비저닝을 인계받는지 확인하십시오.

service.beta.kubernetes.io/aws-load-balancer-type: external

기본적으로 시스템은 내부 Network Load Balancer를 생성합니다. 그러나 다음 주석을 추가하여 IP 대상 그룹 대상 유형의 인터넷 연결 Network Load Balancer를 만들 수 있습니다.

service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing

예:

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="external" \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-scheme"="internet-facing" \
ingress-nginx

kubectl 및 YAML 매니페스트 파일 사용

YAML 매니페스트 파일을 다운로드합니다. 다음 명령은 인그레스 NGINX 컨트롤러 버전 1.11.2를 다운로드합니다.

curl -Lo ingress-nginx.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml

참고: 값을 다른 컨트롤러 버전으로 바꿀 수 있습니다. 자세한 내용은 GitHub 웹 사이트의 태그를 참조하십시오. 경우에 따라 시스템이 프로비저닝하는 로드 밸런서의 유형과 속성을 변경하기 위해 ingress-nginx-controller Kubernetes Load Balancer Service에 주석을 추가해야 합니다.

예:

curl -Lo ingress-nginx.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml

인터넷 연결 Classic Load Balancer

수정 없이 클러스터에 매니페스트를 적용할 수 있습니다. 다음 명령을 실행합니다.

kubectl apply -f ingress-nginx.yaml

내부 Classic Load Balancer

다음 단계를 완료하십시오.

  1. YAML 매니페스트를 수정하여 다음 주석을 지정하는 주석 섹션을 추가합니다.
    service.beta.kubernetes.io/aws-load-balancer-internal: true
    예:

    ...
    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-internal: true
      ...
    type: LoadBalancer
    ...
  2. 다음 명령을 실행하여 클러스터에 매니페스트를 적용합니다.

    kubectl apply -f ingress-nginx.yaml

인터넷 연결 Network Load Balancer

  1. 다음 주석을 사용하여 Network Load Balancer를 만듭니다.
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    예:

    ...
    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
      ...
    type: LoadBalancer
    ...
  2. 다음 명령을 실행하여 클러스터에 매니페스트를 적용합니다.
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    예:

    kubectl apply -f ingress-nginx.yaml

내부 Network Load Balancer:

  1. 다음 주석을 함께 사용하여 내부 Network Load Balancer를 만듭니다.
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    service.beta.kubernetes.io/aws-load-balancer-internal: true
    예:

    ...
    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
        service.beta.kubernetes.io/aws-load-balancer-internal: true
      ...
    type: LoadBalancer
    ...
  2. 다음 명령을 실행하여 클러스터에 매니페스트를 적용합니다.

    kubectl apply -f ingress-nginx.yaml

AWS Load Balancer Controller를 통한 IP 모드의 Network Load Balancer

  1. 클러스터에 AWS Load Balancer Controller를 설치합니다. 자세한 내용은 GitHub 웹 사이트에서 AWS Load Balancer Controller를 참조하십시오. AWS Load Balancer Controller가 Network Load Balancer를 프로비저닝하도록 다음 주석을 사용합니다.

    service.beta.kubernetes.io/aws-load-balancer-type: external
  2. 기본적으로 시스템은 내부 Network Load Balancer를 생성합니다. 대상 그룹 대상 유형을 IP로 사용하여 인터넷 연결 Network Load Balancer를 만들려면 다음 주석을 추가합니다.
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    예:

    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: external
        service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
      ...
    type: LoadBalancer
  3. 다음 명령을 실행하여 클러스터에 매니페스트를 적용합니다.

    kubectl apply -f ingress-nginx.yaml

문제 해결

자세한 내용은 GitHub 웹 사이트에서 문제 해결을 참조하십시오.

서브넷 오류

Network Load Balancer가 서브넷을 자동으로 검색할 수 없는 경우 다음과 같은 오류 메시지가 표시될 수 있습니다.

"Reconciler error","controller":"ingress",...,"error":"couldn't auto-discover subnets: unable to resolve at least one subnet"

AWS Load Balancer Controller는 서브넷 태그를 사용하여 로드 밸런서에 사용할 서브넷을 자동으로 찾습니다. AWS 로드 밸런서의 경우 컨트롤러에는 서로 다른 가용 영역에 두 개 이상의 서브넷이 필요합니다. Network Load Balancer의 경우 컨트롤러에 하나 이상의 서브넷이 필요합니다. 자동 검색의 경우 서브넷에 태그를 지정해야 합니다.

  • kubernetes.io/role/elb 키로 퍼블릭 서브넷에 태그를 지정합니다. 값을 1로 설정합니다.
  • kubernetes.io/role/internal-elb 키로 프라이빗 서브넷에 태그를 지정합니다. 값을 1로 설정합니다.
  • AWS Load Balancer Controller 버전 2.1.1 이하를 사용하는 경우 퍼블릭 및 프라이빗 서브넷에 kubernetes.io/cluster/your-cluster-name 키로 태그를 지정합니다. 값을 소유 또는 공유로 설정합니다.

주소 필드에 kubectl get 또는 describe ingress가 표시되지 않음

kubectl get ingress your-ingress-name 명령을 실행할 때 주소 필드가 비어 있을 수 있습니다. 또는 kubectl describe ingress가 할당된 주소를 표시하지 않을 수 있습니다. 이러한 시나리오 중 하나에서 다음 작업을 수행하십시오.

  • 인그레스 리소스를 설명하여 올바른 ingressClassName 또는 kubernetes.io/ingress.class 주석을 사용하는지 확인합니다. 인그레스 NGINX 컨트롤러의 IngressClass 이름은 ingressClassName 필드 또는 kubernetes.io/ingress.class annotation의 값과 일치해야 합니다. 일치하지 않는 경우 인그레스 NGINX 컨트롤러의 IngressClass 리소스를 클러스터의 유일한 기본 IngressClass로 구성합니다. 자세한 내용은 Kubernetes 웹 사이트의 기본 IngressClass를 참조하십시오.
  • 인그레스 리소스를 설명하여 인그레스 NGINX 컨트롤러가 이벤트에 오류를 추가했는지 확인합니다. 이벤트가 없는 경우 이벤트는 Time To Live 제한에 도달한 것입니다. 또는 인그레스 NGINX 컨트롤러는 작업을 수행해야 하는 인그레스를 감지할 수 없습니다.
  • 다음 명령을 실행하여 인그레스 NGINX 컨트롤러 포드의 로그에서 RBAC(역할 기반 액세스 제어) 또는 기타 관련 오류를 확인합니다.
    kubectl logs ingress-nginx-controller-pod-name -n ingress-nginx-namespace
    참고: ingress-nginx-controller-pod-name을 인그레스 NGINX 컨트롤러 포드의 이름으로 바꾸십시오. ingress-nginx-namespace를 인그레스 NGINX 네임스페이스의 이름으로 바꾸십시오.

액세스 및 요청 로그

특정 요청 및 응답에 대한 정보를 찾으려면 인그레스 NGINX 컨트롤러의 기본 로그 형식을 검토하십시오. 이 작업을 수행하려면 GitHub 웹 사이트의 로그 형식을 참조하십시오. 다음 예에서 기본 로그 형식은 다음 샘플 로그와 일치합니다. 백엔드 대상의 IP 주소 및 포트가 192.168.114.102.80이고 백엔드 대상의 HTTP 응답이 200임을 보여줍니다.

192.168.116.133 - - \[24/Sep/2024:22:14:59 +0000\] "GET / HTTP/1.1" 200 45 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10\_15\_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36" 524 0.003 \[default-apache-service-80\] \[\] 192.168.114.102:80 45 0.003 200 ffe584bdeb28959241e8d8408cfc06e5

관련 정보

Kubernetes 애플리케이션 노출, 3부: Ingress-Nginx 컨트롤러

AWS 공식업데이트됨 일 년 전
댓글 없음

관련 콘텐츠