TheKoguryo's 기술 블로그

Version 2022.03.22

4.1.2 NGINX Ingress Controller에서 host 기반 라우팅(feat. OCI DNS)

Ingress Controller에서 도메인 네임을 기반하여 라우팅하기 위해 OCI DNS를 사용하는 방법을 확인합니다.

OCI DNS 서비스 사용하기

이미 구입한 Domain Name이 있다는 전제하에 설정하는 과정입니다. 테스트를 위해 freenom 사이트에서 발급받은 무료 Domain Name(thekoguryo.ml)을 사용하였습니다.

OCI DNS 서비스 설정

  1. OCI 콘솔에 로그인합니다.

  2. 좌측 상단 햄버거 메뉴에서 Networking > DNS Management > Zones로 이동합니다.

  3. Create Zone 클릭

    image-20211206172303690

  4. 생성정보 입력

    사용한 Domain Name을 바탕으로 Zone을 생성합니다.

    • METHOD: Manual

    • ZONE NAME: 가지고 있는 Domain Name 입력

    • COMPARTMENT: 생성할 대상 Compartment

    • ZONE TYPE: Primary

      image-20211206174702891

  5. Zone 내부에 NS 유형과 SOA 유형의 레코드가 생성되어 있습니다. NS는 네임 서버 레코드, SOA는 권한 시작 레코드입니다. Add Record를 클릭합니다. image-20211206174831470

  6. 추가할 레코드를 입력하고 제출합니다.

    • Record Type: A - IPv4 Address

    • NAME: *.ingress

      • 와일드 카드 형식으로 ingress controller가 사용할 서브 Domain Name을 입력합니다.
    • TTL: 300, 우측 자물쇠는 클릭하여 잠금 해제 후 TTL 값 입력

    • RDATA MODE: Basic

    • ADDRESS: 매핑할 IP, 여기서는 앞서 만든 nginx ingress controller의 Load Balancer의 IP 입력

      image-20211206180022991

  7. 반영하기 위해 Publish Change 클릭

  8. 확인 창이 뜨면 한번 더 Publish Change 클릭

    image-20211206180616524

  9. 레코드 추가 및 반영 완료

    image-20211206180835039

  10. 레코드 중 NS 유형인 네임서버 주소를 모두 복사합니다.

Domain Name 제공 측에 설정

이제 Domain Name을 구입한 사이트에서 설정이 필요합니다. 아래 과정은 freenom 기준 설정입니다. 구입한 사이트에서 비슷한 방식으로 설정합니다.

  1. freenom 사이트에 접속하여 My Domain에서 사용할 도메인 네임 우측의 Manage Domain 클릭 image-20211206223023792

  2. 위쪽 Management Tools > Nameservers를 선택한 다음 **Use custom nameservers (enter below)**를 선택합니다.

  3. 앞서 OCI DNS Zone 에서 복사해둔 네임서버 주소를 차례대로 입력한 후 Change Nameservers 클릭 image-20211206223106338

DNS 테스트

  1. nslookup 툴로 등록한 DNS를 테스트 해봅니다. 잘 등록된 것을 알 수 있습니다.

    C:\>nslookup *.ingress.thekoguryo.ml
    서버:    kns.kornet.net
    Address:  168.126.63.1
    
    권한 없는 응답:
    이름:    *.ingress.thekoguryo.ml
    Address:  132.226.225.240
    

HOST 기반 라우팅 테스트

HOST 이름에 따라 라우팅 서비스를 달리하는 경우입니다.

  1. 테스트를 위한 샘플 앱을 배포합니다. PATH 기반 라우팅 때 사용한 앱을 그대로 사용합니다.

    배경 색깔이 다른 두개의 웹페이지를 배포합니다.

    kubectl create deployment nginx-blue --image=thekoguryo/nginx-hello:blue
    kubectl expose deployment nginx-blue --name nginx-blue-svc --port 80
    kubectl create deployment nginx-green --image=thekoguryo/nginx-hello:green
    kubectl expose deployment nginx-green --name nginx-green-svc --port 80
    
  2. ingress 설정 YAML(host-basic.yaml)을 작성합니다.

    • blue.ingress.thekoguryo.ml 요청은 nginx-blue-svc 로 라우팅
    • green.ingress.thekoguryo.ml 요청은 nginx-green-svc로 라우팅
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-host-basic
      annotations:
        kubernetes.io/ingress.class: nginx
    spec:
      rules:
      - host: blue.ingress.thekoguryo.ml
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-blue-svc
                port:
                  number: 80
      - host: green.ingress.thekoguryo.ml
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-green-svc
                port:
                  number: 80
    
  3. 작성한 host-basic.yaml을 배포합니다.

    oke_admin@cloudshell:~ (ap-seoul-1)$ kubectl apply -f host-basic.yaml 
    ingress.networking.k8s.io/ingress-host-basic created
    oke_admin@cloudshell:~ (ap-seoul-1)$ kubectl get ingress
    NAME                 CLASS    HOSTS                                                    ADDRESS           PORTS   AGE
    ingress-host-basic   <none>   blue.ingress.thekoguryo.ml,green.ingress.thekoguryo.ml                     80      6s
    
  4. ingress rule에서 적용한 host 명으로 각각 접속하여 결과를 확인합니다.

    • blue.ingress.thekoguryo.ml 요청

      image-20211206233208049

    • green.ingress.thekoguryo.ml 요청

      image-20211206233234556

    • 와일드 카드 주소로 DNS에 등록한 Ingress Controller의 Load Balancer를 거쳐 접속한 host의 FQDN에 따라 대상 서비스에 라우팅 되는 것을 확인할 수 있습니다.



** 이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다. **
Last updated on 5 Dec 2021