
Manifests를 사용한 설치
이 문서에서는 Kubernetes Manifests 를 사용하여 Kubernetes 클러스터에 NGINX Ingress Controller를 설치하는 방법을 설명합니다.
목차
1. 필수 구성 요소
2. RBAC 구성
3. 공통 리소스 생성
3-1. 사용자 지정 리소스 생성
3-2. NGINX App Protect용 리소스
3-3. NGINX App Protect DoS용 리소스
4. Ingress Controller 배포
4-1. NGINX App Protect DoS용 Arbitrator 배포
4-2. Ingress Controller 실행
4-3. Ingress Controller 실행 확인
5. Ingress Controller에 대한 액세스 권한 얻기
5-1. Ingress Controller Pod에 대한 서비스 생성
6. Ingress Controller 제거
1. 필수 구성 요소
1. Ingress Controller 이미지에 대한 액세스 권한이 있는지 확인합니다.
- NGINX Ingress Controller의 경우 DockerHub의 nginx/nginx-ingress 이미지를 사용합니다.
- NGINX Plus Ingress Controller의 경우 Docker Registry에서 이미지를 가져오는 방법에 대한 자세한 내용은 여기를 참조하십시오.
- Kubernetes 클러스터의 Container Registry에서 가져오려면 여기의 지침에 따라 JWT 토큰을 사용하여 Docker Registry Secret을 구성하십시오.
- 여기의 지침에 따라 고유한 이미지를 Build 하고 Private Docker Registry에 Push할 수도 있습니다.
2. Ingress Controller Repo를 복제하고 배포 폴더로 변경합니다.
$ git clone https://github.com/nginxinc/kubernetes-ingress.git --branch v2.4.1
$ cd kubernetes-ingress/deployments
2. RBAC 구성
1. Ingress Controller에 대한 Namespace 및 서비스 계정을 만듭니다.
$ kubectl apply -f common/ns-and-sa.yaml
2. 서비스 계정에 대한 클러스터 역할 및 클러스터 역할 바인딩을 만듭니다.
$ kubectl apply -f rbac/rbac.yaml
3. (App Protect만 해당) App Protect 역할 및 역할 바인딩 생성:
$ kubectl apply -f rbac/ap-rbac.yaml
4. (App Protect DoS만 해당) App Protect DoS 역할 및 역할 바인딩 생성:
$ kubectl apply -f rbac/apdos-rbac.yaml
Note: 이 단계를 수행하려면 클러스터 관리자여야 합니다. 관리자 액세스를 구성하려면 Kubernetes 플랫폼의 설명서를 따르십시오. GKE의 경우, Role-Based Access Control 문서를 참조하세요.
3. 공통 리소스 생성
이 섹션에서는 대부분의 Ingress Controller 설치에 공통적인 리소스를 생성합니다.
1. NGINX에서 TLS 인증서와 기본 서버에 대한 Key를 사용하여 Secret를 만듭니다.
$ kubectl apply -f common/default-server-secret.yaml
Note: 기본 서버는 수신 규칙이 정의되지 않은 도메인에 대한 모든 요청에 대해 상태 코드가 404인 Not Found 페이지를 반환합니다. 테스트 목적으로 자체 서명된 인증서와 생성한 Key를 포함합니다. 그러나 사용자 자신의 인증서와 Key를 사용하는 것이 좋습니다.
2. NGINX 구성을 사용자 지정하기 위한 구성 Map을 만듭니다.
$ kubectl apply -f common/nginx-config.yaml
3. IngressClass 리소스를 생성합니다.
$ kubectl apply -f common/ingress-class.yaml
Ingress Controller를 기본 Controller로 설정하려면 ingressclass.kubernetes.io/is-default-class
Annotation의 Annotation 처리를 제거하십시오. 이 Annotation을 true로 설정하면 ingressClassName 필드가 지정되지 않은 모든 새 Ingress에 이 IngressClass가 할당됩니다.
Note: Ingress Controller는 IngressClass 리소스 없이 시작하지 못합니다.
3-1. 사용자 지정 리소스 생성
Note: 기본적으로 VirtualServer, VirtualServerRoute, TransportServer 및 Policy에 대한 사용자 정의 리소스 정의를 생성해야 합니다. 그렇지 않으면 Ingress Controller Pod가 준비 상태가 되지 않습니다. 해당 요구 사항을 비활성화하려면 -enable-custom-resources command-line Annotation를 false로 구성하고 이 섹션을 건너뜁니다.
1. VirtualServer 및 VirtualServerRoute, TransportServer 및 정책 리소스에 대한 사용자 정의 리소스 정의를 만듭니다.
$ kubectl apply -f common/crds/k8s.nginx.org_virtualservers.yaml
$ kubectl apply -f common/crds/k8s.nginx.org_virtualserverroutes.yaml
$ kubectl apply -f common/crds/k8s.nginx.org_transportservers.yaml
$ kubectl apply -f common/crds/k8s.nginx.org_policies.yaml
Ingress Controller의 TCP 및 UDP Load Balancing 기능을 사용하려면 다음 추가 리소스를 생성합니다.
1. GlobalConfiguration 리소스에 대한 사용자 정의 리소스 정의를 만듭니다.
$ kubectl apply -f common/crds/k8s.nginx.org_globalconfigurations.yaml
3-2. NGINX App Protect용 리소스
App Protect WAF 모듈을 사용하려면 다음 추가 리소스를 생성하십시오.
1. APPolicy, APLogConf 및 APUserSig에 대한 사용자 정의 리소스 정의를 생성합니다.
$ kubectl apply -f common/crds/appprotect.f5.com_aplogconfs.yaml
$ kubectl apply -f common/crds/appprotect.f5.com_appolicies.yaml
$ kubectl apply -f common/crds/appprotect.f5.com_apusersigs.yaml
3-3. NGINX App Protect DoS용 리소스
APDosPolicy, APDosLogConf 및 DosProtectedResource에 대한 사용자 정의 리소스 정의를 생성합니다.
$ kubectl apply -f common/crds/appprotectdos.f5.com_apdoslogconfs.yaml
$ kubectl apply -f common/crds/appprotectdos.f5.com_apdospolicy.yaml
$ kubectl apply -f common/crds/appprotectdos.f5.com_dosprotectedresources.yaml
4. Ingress Controller 배포
Ingress Controller를 배포하기 위한 두 가지 옵션이 있습니다.
- Deployment: Ingress Controller Replica의 수를 동적으로 변경하려는 경우 Deployment를 사용합니다.
- DaemonSet: 모든 노드 또는 노드의 하위 집합에 Ingress Controller를 배포하기 위해 DaemonSet을 사용합니다.
Deployment 또는 Daemonset 리소스를 만들기 전에 요구 사항에 따라 해당 Manifest 파일에서 Ingress Controller 컨테이너의 Command-Line Argument를 업데이트해야 합니다.
4-1. NGINX App Protect DoS용 Arbitrator 배포
App Protect DoS 모듈을 사용하려면 Arbitrator 배포를 추가해야 합니다.
- 여기의 지침에 따라 고유한 이미지를 Build 하고 Private Docker Registry에 Push 합니다.
- 배포 및 서비스를 사용하여 Arbitrator 실행
$ kubectl apply -f deployment/appprotect-dos-arb.yaml
$ kubectl apply -f service/appprotect-dos-arb-svc.yaml
4-2. Ingress Controller 실행
- Deployment 사용: Deployment를 사용하여 Ingress Controller를 실행하면 기본적으로 Kubernetes가 하나의 Ingress Controller Pod를 생성합니다.
For NGINX, run:
$ kubectl apply -f deployment/nginx-ingress.yaml
For NGINX Plus, run:
$ kubectl apply -f deployment/nginx-plus-ingress.yaml
- DaemonSet 사용: 클러스터의 모든 노드가 아닌 노드의 하위 집합에서 Ingress Controller를 실행하는 방법을 알아보려면 Kubernetes DaemonSet 문서를 참조하세요.
For NGINX, run:
$ kubectl apply -f daemon-set/nginx-ingress.yaml
For NGINX Plus, run:
$ kubectl apply -f daemon-set/nginx-plus-ingress.yaml
4-3. Ingress Controller 실행 확인
다음 명령을 실행하여 Ingress Controller Pod이 실행 중인지 확인하십시오.
$ kubectl get pods --namespace=nginx-ingress
5. Ingress Controller에 대한 액세스 권한 얻기
Daemonset을 생성한 경우 Ingress Controller 컨테이너의 포트 80 및 443은 컨테이너가 실행 중인 노드의 동일한 포트에 매핑됩니다. Ingress Controller에 액세스하려면 해당 포트 와 Ingress Controller가 실행 중인 클러스터 노드의 IP 주소를 사용합니다.
Deployment를 생성한 경 다음은 Ingress Controller Pod에 액세스하기 위한 두 가지 옵션입니다.
5-1. Ingress Controller Pod에 대한 서비스 생성
- NodePort 서비스 사용:
NodePort 유형의 서비스를 생성합니다.
$ kubectl create -f service/nodeport.yaml
Kubernetes는 클러스터의 모든 노드에 두 개의 포트를 무작위로 할당합니다. Ingress Controller에 액세스하려면 할당된 두 포트와 함께 클러스터 노드의 IP 주소를 사용하십시오.
Kubernetes 설명서에서 NodePort 유형에 대해 자세히 알아보십시오.
- LoadBalancer 서비스 사용:
1. 클라우드 Deployment의 Manifest를 사용하여 서비스를 생성합니다.
For GCP or Azure, run:
$ kubectl apply -f service/loadbalancer.yaml
For AWS, run:
$ kubectl apply -f service/loadbalancer-aws-elb.yaml
Kubernetes는 클라이언트 정보(IP 주소 및 포트)를 전달하기 위해 활성화된 Proxy 프로토콜을 사용하여 TCP 모드에서 Classic Load Balancer(ELB)를 할당합니다. NGINX는 Proxy 프로토콜을 사용하도록 구성해야 합니다.
- 2단계에서 구성 Map 파일
nginx-config.yaml
에 다음 Key를 추가합니다.
proxy-protocol: "True"
real-ip-header: "proxy_protocol"
set-real-ip-from: "0.0.0.0/0"
- 구성 Map을 업데이트합니다.
kubectl apply -f common/nginx-config.yaml
Note: AWS의 경우 Load Balancer 유형 및 SSL Termination와 같은 할당된 Load Balancer에 대한 추가 옵션을 사용할 수 있습니다. 자세히 알아보려면 Kubernetes 설명서를 읽어보세요.
Kubernetes는 Ingress Controller Pod의 Load Balancing을 위해 클라우드 Load Balancer를 할당하고 구성합니다.
2. Load Balancer의 Public IP를 사용하여 Ingress Controller에 액세스합니다. Public IP를 가져오려면:
- For GCP or Azure, run:
$ kubectl get svc nginx-ingress --namespace=nginx-ingress
- AWS ELB의 경우 ELB IP 주소가 정적이지 않기 때문에 Public IP는
kubectl
에 의해 보고되지 않습니다. 일반적으로 ELB IP 주소 대신 ELB DNS 이름에 의존해야 합니다. 그러나 테스트 목적으로kubectl describe
를 사용하여 ELB의 DNS 이름을 얻은 다음nslookup
을 실행하여 연결된 IP 주소를 찾을 수 있습니다.
$ kubectl describe svc nginx-ingress --namespace=nginx-ingress
nslookup
을 사용하여 DNS 이름을 IP 주소로 확인할 수 있습니다.
$ nslookup <dns-name>
Public IP는 Ingress 리소스 상태에서 보고할 수 있습니다. 자세한 내용은 Reporting 리소스 Status 문서를 참조하세요.
Kubernetes 문서에서 LoadBalancer 유형에 대해 자세히 알아보세요.
6. Ingress Controller 제거
1. 생성된 모든 보조 리소스와 함께 Ingress Controller를 제거하려면 nginx-ingress
Namespace를 삭제합니다.
$ kubectl delete namespace nginx-ingress
2. ClusterRole 및 ClusterRoleBinding을 삭제합니다.
$ kubectl delete clusterrole nginx-ingress
$ kubectl delete clusterrolebinding nginx-ingress
3. 사용자 지정 리소스 정의를 삭제합니다.
Note: 이 단계에서는 연결된 모든 사용자 정의 리소스도 제거합니다.
$ kubectl delete -f common/crds/