왜 이런일을 해야하나요? - 문제상황
- Prometheus, Grafana... 등의 OSS 를 Ingress 형태로 연동해서 사용 중
- 해당 클러스터에 외부망 노출이 필요한 경우에...
- Public DNS 를 통해 NginxIngressController Service 의 External IP 가 외부 노출되고,
- OSS 들의 도메인 주소를 맞춘다면?
- -> /etc/hosts 등록하여 Prometheus 메트릭 데이터를 권한 외 사용자가 볼 수 있을듯?
아래 그림과 같이 내부망(Internal Network) 에 쿠버네티스 클러스터가 존재하고, Internal 망 내부에 존재하는 ADMIN, 외부 Public Network 에 존재하는 User 가 존재한다고 가정해보자

Ingress Class 를 하나만 사용한다면 ADMIN 에만 노출되어야하는 Prometheus, Grafana 가 Public Network 에 존재하는 User 에게도 접근이 가능하다. (단, host 주소를 알아야겠지만,)
이를 해결하기 위해 Ingress Class 를 두벌(int-nginx, ext-nginx) 두어,
int-nginx ingress class 의 ingress controller 를 ADMIN 에게만 노출하기 위해
Internal Network 에서만 접근 가능하도록 방화벽 구성을 하고,
ext-nginx ingress class 의 ingress contorller 는
Public Network 상에 노출하여 망을 구성하는 안을 제안했다.

어떻게 위와 같은 구성을 만들 수 있나? - 아이디어
Command-line arguments | NGINX Ingress Controller
Command-line arguments F5 NGINX Ingress Controller supports several command-line arguments, which are set based on installation method: If you’re using Kubernetes Manifests to install NGINX Ingress Controller, modify the Manifests to set the command-line
docs.nginx.com
위 링크는 Nginx ingress 의 CommandLine Argument 명세인데, 다음 항목을 보면
-ingress-class <string> 으로 ingress class 를 지정이 가능하다.

Nginx Ingress Controller 의 Deployment or DaemonSet 에 args.로 집어넣으면 될듯?
YAML 로 실제 해보자 - 테스트
위의 YAML 을 배포하여
Internal ingress class (internal-nginx) 와 External ingress class (external-nginx) 를
별도의 Ingress controller 를 사용하도록 분리할 수 있었다.
어떤게 바뀌었을까? - 변경점
변경점을 설명하자면,

90라인 args 에 -ingress-class=external-nginx 를 추가했고 (internal 의 경우 -> internal-nginx)
deployment/daemonset 과 service 의 연결을 분리하기 위해 selector 및 라벨도 당연히 설정하였음
ingress class 역시 2벌 생성함 (internal-nginx, external-nginx)
'kubernetes' 카테고리의 다른 글
emptyDir 을 sizeLimit 초과사용시 kubelet 코드상 어디에서 축출시킬까? (0) | 2025.01.16 |
---|---|
Grafana Dashboard 샘플 모음 (0) | 2024.08.04 |