[쿠버네티스 세미프로젝트] DNS 이중화 & HA Proxy 연동

신현식·2023년 1월 21일
0

구름_Linux

목록 보기
21/22

DNS 서버 이중화 및 HA proxy 연동

Web서버 nginx에 직접 SSL 인증서를 적용하여도 되나, 상단에 HA-Proxy가 존재할 경우 HA-Proxy에 SSL인증서를 적용하는 것이 좋다. 상단에 존재하는 HA-Proxy의 front에서 443으로 호출받으면 backend를 80으로 보내 뒷단의 Web서버들에게는 80포트로 전달한다.
단, 클라이언트는 443이 아니라 80포트로 접속했을 시 자동으로 443포트에 연결될 수 있도록 리다이렉트 설정까지 진행한다.

원리

  1. 외부에서 goorm-11th.com 도메인으로 접속한다.
  2. goorm-11th.com 도메인은 DNS서버에 해당 도메인과 맵핑된 정보인 HA-Proxy서버의 아이피의 443포트로 호출한다.
  3. 도메인으로부터 DNS쿼리 조회하여 호출된 HA-Proxy서버는 backend로 지정된 웹서버들의 아이피로 로드밸런싱되어 정보를 불러온다. 웹서버는 도메인을 호출한 클라이언트에게 웹페이지를 제공한다.

가상머신의 ip 종류

  • NAT : 가상머신이 모두 같은 IP가 할당되어 있기에 외부로 인터넷은 되지만 가상머신끼리는 통신 X , 호스트와 가상머신 간 통신을 하려면 별도로 포트포워딩 기능을 설정해주어야 한다.

  • NAT network : 10.0.2.x / 가상 머신 안에서 vm끼리 서로 통신하기 위한 네트워크, 호스트에서 가상 네트워크로 접속을 안되지만 포트포워딩을 해야지 가능하고 인터넷도 가능 , 별도의 DHCP 서버가 따로 있어서 버추얼박스 내 가상 서버들이 각각 IP를 할당 받을 수 있음

  • Bridge: 스우치와 같은 기능을 한다. IP를 AP(유무선공유기 : 돈 주고 사용하고 있는거)로부터 직접 받아옴, 즉 하나의 네트워크로 묶여있는 것이기에 호스트와 가상 네트워크간에 상호 통신이 가능한 편한 방식

  • 호스트 only 네트워크 : 192.168.x.x / 호스트 PC(내 PC)와 가상머신이 통신 가능 , 가상머신끼리 통신 가능 , 인터넷 안됨

📢 가상머신 네트워크 동작 참고 사이트: https://www.youtube.com/watch?v=OrRIzxW_UcM&ab_channel=%EA%B3%A0%EC%8C%A4IT

DNS 서버 이중화[Master & Slave]

master-slave는 동기화 과정을 통해 zone파일을 관리하는데 master의 zone파일에 SOA필드에 있는 serial값의 변화가 생기면 파일이 업데이트가 되었다고 판단되어 slave서버로 zone파일을 보내 동기화를 진행한다. 이런 동기화 과정이 바로 zone transfer이고 이때 사용되는 포트가 53/tcp이다
-> 따라서 master 서버에서 장애 발생시 슬레이브 서버에서 중단없이 서비스를 지속적으로 제공할 수 있다.

<서버 구성>
HAproxy: 192.168.56.108
web1: 192.168.56.101
web2: 192.168.56.107
dns1: 192.168.56.105
dns2: 192.168.56.109

마스터 dns 서버

1. 패키지 설치

yum -y install bind*

2. named 데몬 설정파일

  • vi /etc/named.conf

수정 전

12 options {
13        listen-on port 53 { 127.0.0.1; };
14        listen-on-v6 port 53 { ::1; };
15        directory       "/var/named";
16        dump-file       "/var/named/data/cache_dump.db";
17        statistics-file "/var/named/data/named_stats.txt";
18        memstatistics-file "/var/named/data/named_mem_stats.txt";
19        recursing-file  "/var/named/data/named.recursing";
20        secroots-file   "/var/named/data/named.secroots";
21        allow-query     { localhost; };

(생략)

54 zone "." IN {
55         type hint;
56         file "named.ca";
57 };
58
59 include "/etc/named.rfc1912.zones";
60 include "/etc/named.root.key";

수정 후

12 options {
13         listen-on port 53 { **any**; };
14        listen-on-v6 port 53 { **none**; };
15        directory       "/var/named";
16        dump-file       "/var/named/data/cache_dump.db";
17        statistics-file "/var/named/data/named_stats.txt";
18        memstatistics-file "/var/named/data/named_mem_stats.txt";
19        recursing-file  "/var/named/data/named.recursing";
20        secroots-file   "/var/named/data/named.secroots";
21        allow-query     { **any**; };

13번째 줄 : ipv4에서 DNS 요청응답에 사용할 주소

  • 자기자신 질의(127.0.0.1) → 모든 네트워크 접속(any)

14번째 줄 : ipv6에서 DNS 요청응답시 사용할 주소

  • 차단(none)

21번째 줄 : DNS쿼리 요청 허가 대상

  • localhost → 모든 호스트 허가(any)

3. domain zone 정보추가

  • vi /etc/named.rfc1912.zones
    기존 등록 방식과 같으며 allow-update { [slave서버 IP]; }; 를 입력한다.
zone "goorm-11th.com" IN {
        type master;
        file "goorm-11th.com.zone";
        allow-update { 192.168.56.109; };
};

3. zone파일 생성 & Ha Proxy 연동

  • 원본 파일 named.localhost 를 복사하여 새로운 zone 파일을 생성한다.
cd /var/named
cp named.localhost goorm-11th.com.zone
  • 새로 생성한 ‘goorm-11th.com.zone’ 파일 내에서 아래와 같이 IP, 도메인을 설정한다.
  • 파일이름은 위에서 작성한 zone 내부의 파일과 이름이 같아야 한다.
  • 192.168.0.20 은 DNS서버에서 불러올 web서버이다.
  • 192.168.0.21 은 DNS서버의 IP주소이다.
$TTL 1D
@       IN SOA  ns1.goorm-11th.com      root. (
                                        20230120        ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns1.goorm-11th.com.
        NS      ns2.goorm-11th.com.
        IN      A       192.168.56.108
www     IN      A       192.168.56.108
ns1     IN      A       192.168.56.105
ns2     IN      A       192.168.56.109

호스트 only 네트워크를 이용해 가상머신끼리, 그리고 내 호스트 PC에서 도메인 이름으로 검색할수 있도록 해준다. 여기서 ns1과 ns2에는 각각 마스터와 슬레이브의 IP를, 도메인이름를 검색했을때에는 HA Proxy의 IP를 나오록도 설정해준다.

  • 아래와 같이 zone파일 내에서 오타 검사를 진행한다.
$ named-checkzone goorm-11th.com goorm-11th.com.zone
zone goorm-11th.com/IN: loaded serial 0
OK
  • 파일의 권한을 정상적으로 실행 가능하도록 권한 설정을 한다.
[root@localhost named]# chmod -R 754 /var/named
[root@localhost named]# systemctl restart named

4. 방화벽 설정

$ sudo firewall-cmd --permanent --add-service=dns
$ sudo firewall-cmd --reload

5. 데몬 재시작

$ sudo systemctl restart named
$ sudo systemctl enable named
Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service

슬레이브 dns 서버

1. 슬레이브 서버 구축

master dns 서버와 마찬가지로 2번 데몬파일까지 수정한다. 그 후 다음과 같이 따라한다.

  • vi /etc/named.rfc1912.zones
zone "goorm-11th.com" IN {
        type slave;
        file "slaves/goorm-11th.com.zone.slave";
        masters { 192.168.56.105; };
};

2. 방화벽 설정

$ sudo firewall-cmd --permanent --add-service=dns
$ sudo firewall-cmd --reload

3. 데몬 재시작

$ sudo systemctl restart named
$ sudo systemctl enable named
Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service
  • 실제로 /var/named/slaves 디렉터리에 아까 생성한 zone파일을 가져왔는지 ls -lh로 확인
  • master 서버의 /var/log/mesagges 에서도 확인가능
  • 또한 정상적으로 작동하는것을 확인 하였다면 Master서버 zone 파일의 시리얼 번호를 변경(값이 더 높도록 +1 이상) 후 named 서비스를 재기동하고 Slave 서버로 잘 넘어갔는지 다시 확인하면 된다.

4. DNS 이중화 확인

client에 /etc/resolv.conf파일 접속 후 아래 사진처럼 master와 slave의 nameserver ip를 등록한 이후 nslookup으로 goorm-11th.com를 검색하면
-> master가 존재할 때는 master가 goorm-11th.com의 ip를 찾아내는 것을 볼 수 있다.
-> master 서버를 종료하고 goorm-11th.com을 입력했을 땐 slave 서버의 ip를 찾아냄

📌resolv.conf파일의 역할

/etc/resolv.conf : 사용하고자 하는 네임서버를 지정하는 파일
DNS서버의 /etc/resolv.conf파일에는 해당 DNS서버의 ip주소를 적어줘야한다.
웹 서버의 /etc/resolv.conf파일에도 설정을 해줘야 하는데 여기서도 또한 DNS name server로 활용할 ip의 주소 즉, DNS서버의 주소를 적어준다.

최종 프로젝트 완성


최종적으로 위에 인프라를 구축한 이후 날씨 데이터를 가져오는 애플리케이션을 배포하였다. 배포 과정에서 DB를 읽기, 쓰기 전용으로 분리해서 서버를 구축하였다. 또한 앱 트래픽을 조절하기 위해 앞 서버에서 트래픽을 leaky bucket으로 조절하였고 추가로 뒤 서버에서도 조절하도록 하였었다. 이를 통해서 서비스에서 트래픽을 조절하는 것에 대한 중요성을 많이 알게되었다. 하지만 이부분은 너무 백엔드쪽 부분이였어서 내가 실제로 한 일을 없었다. 그래서 앞으로 트래픽 관리에 대한 공부가 필요할 것 같다.
추가로 이번 프로젝트를 하면서 공공데이터 api를 따오는 과정도 공부하였다. json파일을 실제로 가져와서 원하는 데이터를 추출하고 관리하는 것까지 해보았다.

profile
전공 소개

0개의 댓글