CampusMeet

[DNS] Nginx ingress controller 와 Domain

dong_seok 2024. 9. 15. 13:58
1. Nginx ingress controller
2. 도메인 구매
3. 도메인 연결

1.  Nginx ingress controller

이전 시간에는 hoseo-meet-web 서비스를 LoadBalancer 타입으로 생성하고, 할당된 ExternalIP를 이용해 웹 브라우저에서 접근하는 방법을 실습했습니다. 하지만 여러 개의 서비스를 모두 LoadBalancer 타입으로 설정하면, 비효율적일 뿐만 아니라 관리하기도 어렵습니다. 이 문제를 해결하기 위해서는 각 서비스를 ClusterIP 타입으로 생성하고, 외부 트래픽을 적절하게 라우팅해줄 중앙 관리자가 필요합니다. 바로 이 역할을 수행하는 것이 NGINX Ingress Controller입니다.

 

 

Ingress Controller는 클러스터 외부에서 들어오는 요청을 분석하고, 적절한 서비스로 연결해주는 트래픽 관리의 핵심 역할을 합니다.

이를 통해 각 서비스는 ClusterIP 타입으로 설정된 상태에서 Ingress Controller가 외부 트래픽을 처리하게 되므로, 전체적으로 더 효율적이고 체계적인 서비스 관리가 가능해집니다. 

 

배포 과정

YAML 파일 Helm을 사용하여 배포하는 과정이 있는거 같은데 저는 Helm을 새롭게 설치하는것보다 이전에 설정해준 kubeconfig를 활용해서 손 쉽게 배포할 수 있는 YAML 파일을 사용하는 방법을 선택하였습니다. 다음의 명령어를 터미널에 입력하여 ingress-nginx를 클러스터에 배포합니다. ingress-nginx에 대한 네임스페이스와 서비스 등 리소스들이 한 번에 배포됩니다. 해당 ingress-nginx 예제 파일은 Deployment 명세에 hostNetwork: true 설정을 한 커스텀 예제입니다.

 

kubectl --kubeconfig=$KUBE_CONFIG apply -f https://raw.githubusercontent.com/kakaoicloud-guide/kubernetes-engine/main/guide-samples/settingIC/ingress-nginx/controller-v1.3.1/deploy.yml

 

배포 확인

인그레스 컨트롤러가 정상적으로 배포되었는지 확인하기 위해 다음의 명령어를 터미널에 입력하고 파드의 상태를 관찰합니다. 이때 ingress-controller 파드가 정상적으로 실행되는지 확인합니다. ingress-controller 파드가 running 상태로 실행되고 있다면 Ctrl+C 키를 눌러서 명령을 취소합니다.

 

kubectl --kubeconfig=$KUBE_CONFIG get pods -n ingress-nginx \
-l app.kubernetes.io/name=ingress-nginx --watch

 

 

ngress-controller pod가 Running 상태로 정상적으로 실행중인 모습을 볼 수 있습니다.

 

인그레스 컨트롤러 엔드포인트 확인

인그레스 컨트롤러 YAML을 배포하면 인그레스 컨트롤러 서비스를 위한 로드밸런서가 함께 생성됩니다. 생성된 로드밸런서의 IP를 통해 인그레스 서비스를 오픈할 수 있습니다. 다음의 명령어를 실행하여 ingress-nginx 서비스를 확인합니다.

 

kubectl --kubeconfig=$KUBE_CONFIG get svc -n ingress-nginx

 

 

EXTERNAL-IP가 정상적으로 할당된 모습을 볼 수 있습니다. 하지만 이 IP로 접근을 하게 되면

 

 

에러가 뜨게 됩니다. 왜냐하면 Ingress-Controller와 매칭되는 Ingress 리소스가 없기 때문입니다. 따라서 아래와 같이 Ingress 리소스를 정의 해주고 다시 실행시켜 보겠습니다.

 

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hoseo-meet-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: www.campus-meet.shop
    http: 
      paths: 
      - path: /
        pathType: Prefix
        backend: 
          service: 
            name: hoseo-meet-web-service
            port: 
              number: 80

 

nginx를 명시해주고 기존에 service 리소스로 만들어두었던 hoseo-meet-web-service를 지정해서 Ingress 리소스를 생성해주었습니다.  Ingress 리소스를 만들게되면 이전에 ingress controller pod에 할당받은 EXTERNER-IP 의 값이 자동으로 ADDRESS에 할당받게 됩니다.

 

 

이제 ingress 리소스를 잘 만들어주었으니 다시 접속햅도록 하겠습니다.

 

 

ingress 리소스도 만들어주었고 fastapi 서비스와도 잘 연결해주었는데 똑같은 404 not found 에러가 발생하였습니다. 이유를 찾아보니 yaml 파일을 만들때 설정해준 "host: www.campus-meet.shop" 가 원인이었습니다. Ingress의 host 필드는 특정 호스트 이름으로 들어오는 트래픽만을 처리하도록 제한합니다. 따라서 "www.campus-meet.shop" 으로 들어오는 요청만 처리를 하는데 도메인을 구매하지도 연결하지도 않았으니 접근 자체가 불가능한 것이었습니다. host 필드를 제거하면 Ingress가 모든 호스트 이름으로 들어오는 트래픽을 처리합니다. 따라서 이 host 필드를 삭제하고 리소스를 다시 생성해주었습니다. 그리고 할당받은 ADDRESS로 접근하니

 

 

fastapi 서비스로 정상적으로 접근 가능한 모습을 볼 수 있었습니다!

 

2. 도메인 구매

위에서 ingress.yaml 파일에 host를 작성하면서 생긴 404 not found 에러를 다뤄보았습니다. host를 작성하지않고 yaml 파일을 만드니 ADDRESS 로 웹브라우저에서 접근이 가능해졌지만 항상 저 긴 ADRESS를 외우고 다닐 수는 없으니 도메인을 구매하고 연결해보는 과정을 거쳐보도록 하겠습니다.

 

도메인 구매에 사용한 웹사이트는 gabia입니다. 가비아의 도메인 서비스는 국내 도메인 등록 점유율 1위를 자랑하며 퍼포먼스와 제공하는 서비스에 비해 가성비가 좋은 상품 이라는 평이 있어서 선택 하게 되었습니다.

 

우선 희망하는 도메인을 검색해줍니다.

 

 

도메인을 검색하면 현재 이벤트 가격과실가격이 같이 적혀있습니다. 보통 1년 단위로 결제를 하기때문에 구매일부터 1년은 이벤트 가격으로 서비스 이용이 가능하지만 그 후부터는 실가격을 지불하고 서비스를 이용해야합니다. 저는 일단 제일 저렴한 도메인을 선택해주었습니다.

 

 

 

처음에 디폴트값이 3년으로 설정되어있기때문에 결제하기전에 기간을 잘 지정해주고 오른쪽에 예상 금액까지 확실하게 확인한 후 기타 정보를 채워서 결제를 진행해줍니다.

 

 

이제 서비스 관리 탭을 클릭하면 구매한 도메인이 표시됩니다. 결제 후 바로 나타나지 않더라도, 당황하지 말고 약 5분 정도 기다리면 도메인이 정상적으로 표시되는 것을 확인할 수 있습니다.

 

3. 도메인 연결

도메인 구매를 완료하였으니 이제 연결을 해줄 차례입니다. 먼저 DNS 관리툴에 들어가서 레코드 수정을 눌러줍니다.

 

 

여러가지 타입이 있지만 저의 경우에는 ADDRESS 형태 IP가 아닌 도메인 형태이기 때문에 CNAME을 사용해주었습니다.

 

 

ADDRESS를 넣어주기만 하면 될줄 알았더니 CNAME의 값/위치는 마지막에 점(.)으로 끝나야한다고 문구가 나와서 추가해주었습니다. 그리고 확인을 누르고 저장을 하니

 

레코드가 설정된 모습을 볼 수 있었습니다. 이제 도메인 형태의 ADDRESS가 아닌 내가 지정한 host 도메인명으로 접근을 해도 아래 화면처럼 정상적으로 접근이 가능한 모습을 볼 수 있습니다!

 

 

 

참고자료

https://velog.io/@soluinoon/%EA%B0%80%EB%B9%84%EC%95%84%EC%97%90%EC%84%9C-%EB%8F%84%EB%A9%94%EC%9D%B8-%EA%B5%AC%EB%A7%A4%ED%95%B4-%EC%A0%81%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0

 

https://docs.kakaocloud.com/service/container-pack/k8se/how-to-guides/k8se-ingress

'CampusMeet' 카테고리의 다른 글

[NKS] NKS를 활용한 배포 (1)  (0) 2024.09.08
[CS] .env 파일 유출 문제와 해결 방안  (3) 2024.08.28
[Backend] FastAPI  (0) 2024.08.14
[Crawling] Crawling 을 통한 데이터 수집  (2) 2024.08.11