AKS에서 웹 기본 HTTP/HTTPS 서비스를 외부에 노출할 때 보통 nginx 웹 서버를 사용하여 80/443 포트를 수신 대기하는 서비스를 만들어 사용한다.(이 부분에 대한 내용은 인터넷에 널려 있으니 아무 거나 찾아 주워 먹으면 됨.)
여기에 추가로 reverse proxy와 유사한 개념인 "수신(Ingress)"이라는 호스트 도메인-Pod 매핑 기법을 통해 공인 IP 주소 하나로 여러 도메인 및 포트, 또는 하위 URL에 대해 Pod/Container 별로 분기 처리가 가능하다.
그런데, 이러한 상황에서 추가로 웹 서비스가 아닌 DB 서비스 또는 AMQP나 MQTT 같은 서비스를 외부로 노출하려면 일반적인 방법으로는 공인 IP 주소가 서비스 종류 별로 하나씩 추가되어야 한다. 웹 서비스인 경우 포트가 추가되거나 바뀌더라도 nginx에 포트를 추가하는 것만으로 해결이 되지만, 웹 서비스가 아닌 경우에는 이런 방법으로는 안되니까.
즉,
Container - Deployment - Service - LoadBalancer(공인 IP주소)
새로운 유형의 서비스를 하기 위해서는 이런 구조로 추가로 공인 IP 주소가 1개 필요하다.
공인 IP 주소 하나에 보통 5,000원/월 정도하니까 별 부담이 아니라 생각할 수도 있겠지만, 이것저것 합산하다 보면 꽤 큰 금액이 되기도 한다. 그래서 불필요한 지출을 줄이려면 공인 IP주소는 가급적 하나만 쓰는 것이 좋겠지...
허나, 어디 마음먹은 대로 쉽게 되랴?
나 역시 LoadBalancer 3개를 써서 공인 IP 3개를 만들어 3종류의 서비스를 1년 넘도록 하고 있다가...
오늘 문득 이걸 줄일 수 있는 방법이 있지 않을까, 하고 찾아봤다.
내 상황에 맞는 제대로 된 자료는 못찾았지만 대략 유사한 것들은 다음과 같았다.
>> 참조1: https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/
>> 참조3: https://minikube.sigs.k8s.io/docs/tutorials/nginx_tcp_udp_ingress/
위 사이트들을 참고하여 몇 차례 시행착오 끝에 성공한 방법을 요약 정리하면 다음과 같다.
- 먼저, 기존에 사용 중이던 포트 매핑 정보를 삭제한다. 즉, 공인 IP 주소가 할당된 LoadBalancer 서비스를 삭제한다. 보통 이 과정에서 공인 IP 주소도 자동 삭제된다. (mariadb, mqtt 외부 노출 서비스 이름을 각각 mariadb-public-svc, mqtt-public-svc로 사용했다.)
kubectl delete service mariadb-public-svc kubectl delete service mqtt-public-svc
- 구성맵(ConfigMap)으로 tcp-services, 즉, TCP 포트-서비스 매핑 정보를 등록한다.
[외부포트]: "[네임스페이스]/[서비스명]:[내부포트]" 형식으로 쓰면 된다.
apiVersion: v1 kind: ConfigMap metadata: name: tcp-services data: 1883: "default/mqtt:1883" 8883: "default/mqtt:8883" 43306: "default/mariadb:3306"
- 워크로드에 있는 nginx 컨트롤러 배포 설정 정보 수정(YAML 편집): args 항목에 위 등록한 tcp-services 구성맵을 사용하도록 설정한다. (--tcp-services-configmap=$(POD_NAMESPACE)/tcp-services)
... args: - '--controller-class=k8s.io/ingress-nginx' - '--ingress-class=nginx' - >- --configmap=$(POD_NAMESPACE)/nginx-ingress-ingress-nginx-controller - '--tcp-services-configmap=$(POD_NAMESPACE)/tcp-services' ...
- 서비스에 있는 nginx 컨트롤러 서비스 설정 정보 수정(YAML 편집): 위 1번에 등록한 포트 정보를 추가한다.
ports: ... - name: mqtt-1883 protocol: TCP port: 1883 targetPort: 1883 - name: mqtt-8883 protocol: TCP port: 8883 targetPort: 8883 - name: mariadb-43306 protocol: TCP port: 43306 targetPort: 43306 ...
이렇게 공인 IP 두 개에 해당하는 비용 절감. 끝.
'Tech: > Server·IIS' 카테고리의 다른 글
ARR 사용 팁: 서버팜 IP주소/포트 확인 (0) | 2024.08.28 |
---|---|
Windows RRAS - IKEv2 컴퓨터 인증서 기반 VPN 구성 (1) | 2024.03.18 |
Visual Studio에서 HTTPS/SSL 디버깅이 안될 때 (0) | 2022.09.20 |
[docker] MariaDB 10.4 my.cnf 인식 오류 (0) | 2022.08.03 |
ARR: URL 재작성(rewrite) 팁 (0) | 2020.12.15 |