AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
Amazon EKS에서 인그레스 NGINX 컨트롤러를 구성하고 문제를 해결하려면 어떻게 해야 합니까?
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
다음 단계를 완료하십시오.
-
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 ... -
다음 명령을 실행하여 클러스터에 매니페스트를 적용합니다.
kubectl apply -f ingress-nginx.yaml
인터넷 연결 Network Load Balancer
-
다음 주석을 사용하여 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 ... -
다음 명령을 실행하여 클러스터에 매니페스트를 적용합니다.
service.beta.kubernetes.io/aws-load-balancer-type: nlb
예:kubectl apply -f ingress-nginx.yaml
내부 Network Load Balancer:
-
다음 주석을 함께 사용하여 내부 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 ... -
다음 명령을 실행하여 클러스터에 매니페스트를 적용합니다.
kubectl apply -f ingress-nginx.yaml
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
예: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 -
다음 명령을 실행하여 클러스터에 매니페스트를 적용합니다.
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(역할 기반 액세스 제어) 또는 기타 관련 오류를 확인합니다.
참고: ingress-nginx-controller-pod-name을 인그레스 NGINX 컨트롤러 포드의 이름으로 바꾸십시오. ingress-nginx-namespace를 인그레스 NGINX 네임스페이스의 이름으로 바꾸십시오.kubectl logs ingress-nginx-controller-pod-name -n ingress-nginx-namespace
액세스 및 요청 로그
특정 요청 및 응답에 대한 정보를 찾으려면 인그레스 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
관련 정보
- 언어
- 한국어
