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/

 

Exposing TCP and UDP services - NGINX Ingress Controller

Exposing TCP and UDP services Ingress does not support TCP or UDP services. For this reason this Ingress controller uses the flags --tcp-services-configmap and --udp-services-configmap to point to an existing config map where the key is the external port t

kubernetes.github.io

 

>> 참조2: https://stackoverflow.com/questions/61430311/exposing-multiple-tcp-udp-services-using-a-single-loadbalancer-on-k8s

 

Exposing multiple TCP/UDP services using a single LoadBalancer on K8s

Trying to figure out how to expose multiple TCP/UDP services using a single LoadBalancer on Kubernetes. Let's say the services are ftpsrv1.com and ftpsrv2.com each serving at port 21. Here are the

stackoverflow.com

 

>> 참조3: https://minikube.sigs.k8s.io/docs/tutorials/nginx_tcp_udp_ingress/

 

Ingress nginx for TCP and UDP services

How to set up a minikube ingress for TCP and UDP services

minikube.sigs.k8s.io

 

위 사이트들을 참고하여 몇 차례 시행착오 끝에 성공한 방법을 요약 정리하면 다음과 같다.

 

  1. 먼저, 기존에 사용 중이던 포트 매핑 정보를 삭제한다. 즉, 공인 IP 주소가 할당된 LoadBalancer 서비스를 삭제한다. 보통 이 과정에서 공인 IP 주소도 자동 삭제된다. (mariadb, mqtt 외부 노출 서비스 이름을 각각 mariadb-public-svc, mqtt-public-svc로 사용했다.)
    kubectl delete service mariadb-public-svc
    kubectl delete service mqtt-public-svc

     
  2. 구성맵(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"

     
  3. 워크로드에 있는 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'
              ...

     
  4. 서비스에 있는 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 두 개에 해당하는 비용 절감. 끝.

 

 



Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]