이 문서에서는 Kubernetes 매니페스트를 사용하여 Kubernetes 클러스터에 NGINX Ingress Controller를 설치하는 방법을 설명합니다.
전제 조건(Prerequisites)
1. Ingress Controller 이미지에 대한 액세스 권한이 있는지 확인합니다.
- NGINX Ingress Controller의 경우 DockerHub의 nginx/nginx-ingress 이미지를 사용합니다.
- NGINX Plus Ingress Controller의 경우 F5 Docker 레지스트리에서 이미지를 가져오는 방법에 대한 자세한 내용은 여기를 참조하십시오.
- Kubernetes 클러스터의 F5 Container 레지스트리에서 가져오려면 여기의 지침에 따라 MyF5 포털에서 JWT 토큰을 사용하여 도커 레지스트리 시크릿을 구성하십시오.
- 여기의 지침에 따라 고유한 이미지를 빌드하고 개인 Docker 레지스트리에 푸시할 수도 있습니다.
2. Ingress Controller 리포지토리를 복제하고 배포 폴더로 변경합니다:
$ git clone https://github.com/nginxinc/kubernetes-ingress.git --branch v2.2.0
$ cd kubernetes-ingress/deployments
1. RBAC 구성
1. Ingress Controller에 대한 네임스페이스 및 서비스 계정을 생성합니다.
$ 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
참고: 이 단계를 수행하려면 클러스터 관리자여야 합니다. Kubernetes 플랫폼의 문서에 따라 관리자 액세스를 구성하십시오. GKE의 경우 역할 기반 액세스 제어 문서를 참조하세요.
2. 공통 리소스 생성
이 섹션에서는 대부분의 Ingress Controller 설치에 공통적인 리소스를 생성합니다.
1. NGINX의 기본 서버에 대한 TLS 인증서와 키를 사용하여 비밀을 만듭니다.
$ kubectl apply -f common/default-server-secret.yaml
참고: 기본 서버는 수신 규칙이 정의되지 않은 도메인에 대한 모든 요청에 대해 404 상태 코드와 함께 찾을 수 없음 페이지를 반환합니다. 테스트 목적으로 자체 서명된 인증서와 생성한 키를 포함합니다. 그러나 자체 인증서와 키를 사용하는 것이 좋습니다.
2. NGINX 구성을 사용자 지정하기 위한 구성 맵을 만듭니다.
$ kubectl apply -f common/nginx-config.yaml
3. IngressClass 리소스를 생성합니다.
$ kubectl apply -f common/ingress-class.yaml
Ingress Controller를 기본(default) 컨트롤러로 설정하려면 ingressclass.kubernetes.io/is-default-class 주석의 주석 처리를 제거하십시오. 이 주석을 true로 설정하면 ingressClassName 필드가 지정되지 않은 모든 새 Ingress에 이 IngressClass가 할당됩니다.
참고: Ingress Controller는 IngressClass 리소스 없이 시작되지 않습니다.
사용자 지정 리소스 생성
참고: 기본적으로 VirtualServer, VirtualServerRoute, TransportServer 및 Policy에 대한 사용자 지정 리소스 정의를 생성해야 합니다. 그렇지 않으면 Ingress Controller 파드(Pod)가 준비 상태가 되지 않습니다. 해당 요구 사항을 비활성화하려면 -enable-custom-resources 명령줄 인수를 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 부하 분산 기능을 사용하려면 다음 추가 리소스를 생성합니다.
- GlobalConfiguration 리소스에 대한 사용자 지정 리소스 정의를 만듭니다.
$ kubectl apply -f common/crds/k8s.nginx.org_globalconfigurations.yaml
NGINX App Protect용 리소스
App Protect 모듈을 사용하려면 다음 추가 리소스를 만드십시오.
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
NGINX App Protect DoS용 리소스
App Protect DoS 모듈을 사용하려면 다음 추가 리소스를 만드십시오.
1. 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
3. Ingress Controller 배포
Ingress Controller 배포를 위한 두 가지 옵션이 있습니다.
Deployment. Ingress Controller 복제본의 수를 동적으로 변경하려는 경우 배포를 사용합니다.
DaemonSet. 모든 노드 또는 노드의 하위 집합에 Ingress Controller를 배포하려면 DaemonSet을 사용하십시오.
배포 또는 Daemonset 리소스를 만들기 전에 요구 사항에 따라 해당 매니페스트 파일에서 Ingress Controller 컨테이너의 명령줄 인수를 업데이트해야 합니다.
NGINX App Protect DoS용 Arbitrator 배포
App Protect DoS 모듈을 사용하려면 Arbitrator 배포를 추가해야 합니다.
- 여기의 지침에 따라 고유한 이미지를 빌드하고 개인 Docker 레지스트리에 푸시합니다.
- 배포 및 서비스를 사용하여 Arbitrator 실행
$ kubectl apply -f deployment/appprotect-dos-arb.yaml
$ kubectl apply -f service/appprotect-dos-arb-svc.yaml
3.1 Ingress Controller 실행
- Deployment를 사용합니다. Deployment를 사용하여 Ingress Controller를 실행하면 기본적으로 Kubernetes가 하나의 Ingress Controller 파드(Pod)를 생성합니다.
NGINX의 경우 다음을 실행합니다.
$ kubectl apply -f deployment/nginx-ingress.yaml
NGINX Plus의 경우 다음을 실행합니다.
$ kubectl apply -f deployment/nginx-plus-ingress.yaml
참고: F5 Container 레지스트리에서 선택한 이미지로 nginx-plus-ingress.yaml을 업데이트하십시오. 또는 구축한 컨테이너 이미지.
- DaemonSet 사용: DaemonSet을 사용하여 Ingress Controller를 실행하면 Kubernetes가 클러스터의 모든 노드에 Ingress Controller 파드(Pod)를 생성합니다.
참조: 클러스터의 모든 노드가 아닌 노드의 하위 집합에서 Ingress Controller를 실행하는 방법을 알아보려면 Kubernetes DaemonSet 문서를 참조하세요.
NGINX의 경우 다음을 실행합니다.
$ kubectl apply -f daemon-set/nginx-ingress.yaml
NGINX Plus의 경우 다음을 실행합니다.
$ kubectl apply -f daemon-set/nginx-plus-ingress.yaml
참고: F5 Container 레지스트리에서 선택한 이미지로 nginx-plus-ingress.yaml을 업데이트하십시오. 또는 구축한 컨테이너 이미지.
3.2 Ingress Controller가 실행 중인지 확인
다음 명령을 실행하여 Ingress Controller 파드(Pod)이 실행 중인지 확인하십시오.
$ kubectl get pods --namespace=nginx-ingress
4. Ingress Controller에 대한 액세스 권한 얻기
daemonset를 만든 경우 Ingress Controller 컨테이너의 포트 80 및 443은 컨테이너가 실행 중인 노드의 동일한 포트에 매핑됩니다. Ingress Controller에 액세스하려면 해당 포트와 Ingress Controller가 실행 중인 클러스터 노드의 IP 주소를 사용합니다.
deployment를 생성한 경우 Ingress Controller 파드(Pod)에 액세스하기 위한 두 가지 옵션이 아래에 있습니다.
4.1 Ingress Controller 파드(Pod)용 서비스 생성
- NodePort 서비스를 사용하십시오.
NodePort 유형으로 서비스를 생성합니다.
$ kubectl create -f service/nodeport.yaml
Kubernetes는 클러스터의 모든 노드에 두 개의 포트를 무작위로 할당합니다. Ingress Controller에 액세스하려면 할당된 두 포트와 함께 클러스터 노드의 IP 주소를 사용하십시오.
- LoadBalancer 서비스 사용:
- 클라우드 공급자의 매니페스트를 사용하여 서비스를 만듭니다.
- GCP 또는 Azure의 경우 다음을 실행합니다.
$ kubectl apply -f service/loadbalancer.yaml
- AWS의 경우 다음을 실행합니다.
$ kubectl apply -f service/loadbalancer-aws-elb.yaml
Kubernetes는 클라이언트 정보(IP 주소 및 포트)를 전달하기 위해 활성화된 PROXY 프로토콜을 사용하여 TCP 모드에서 Classic Load Balancer(ELB)를 할당합니다. NGINX는 PROXY 프로토콜을 사용하도록 구성해야 합니다.
2단계에서 config map 파일 nginx-config.yaml에 다음 키를 추가합니다.
proxy-protocol: "True"
real-ip-header: "proxy_protocol"
set-real-ip-from: "0.0.0.0/0"
config map 업데이트:
kubectl apply -f common/nginx-config.yaml
참고: AWS의 경우 로드 밸런서 유형 및 SSL termination와 같은 할당된 로드 밸런서와 관련된 추가 옵션을 사용할 수 있습니다. 자세히 알아보려면 Kubernetes 설명서를 읽어보세요.
Kubernetes는 Ingress Controller 파드(Pod)의 로드 밸런싱을 위해 클라우드 로드 밸런서를 할당하고 구성합니다.
2. 로드 밸런서의 공인 IP를 사용하여 Ingress Controller에 액세스합니다. 공인 IP를 얻으려면:
GCP 또는 Azure의 경우 다음을 실행합니다:
$ kubectl get svc nginx-ingress --namespace=nginx-ingress
AWS ELB의 경우 ELB IP 주소가 고정되어 있지 않기 때문에 공인 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>
Ingress Controller 제거(Uninstall)
1. nginx-ingress 네임스페이스를 삭제하여 생성된 모든 보조 리소스와 함께 Ingress Controller를 제거(Uninstall)합니다.
$ kubectl delete namespace nginx-ingress
2. ClusterRole 및 ClusterRoleBinding을 삭제합니다.
$ kubectl delete clusterrole nginx-ingress
$ kubectl delete clusterrolebinding nginx-ingress
3. 사용자 지정 리소스 정의를 삭제합니다.
참고: 이 단계에서는 연결된 모든 사용자 지정 리소스도 제거합니다.
$ kubectl delete -f common/crds/