[쿠버네티스 세미프로젝트] 고가용성을 확보한 웹 서비스 인프라 환경 구축

신현식·2023년 1월 18일
0

구름_Linux

목록 보기
19/22
post-thumbnail

세미프로젝트 목표 “ 고가용성을 확보한 웹 서비스 인프라 환경 구축 “

  • 기본적인 인프라 환경 구성함으로써 간단한 서버 구축과 네트워크 내부망 통신에 대한 학습
  • 웹 서비스 구축
  • DNS 서비스 구축
  • 모든 서비스를 이중화 구축
  • 기타 HA PROXY를 이용한 로드 밸런서, 스토리지 구축, FTP, NFS, DB 등 선택적 구축
  • 각 서버 인프라는 분리구축
  • 상황 예시 : 화재가 일어났을 때 대응 될 수 있는 인프라 등등 DR 전략
  • Applcation의 소스와 커스텀하여 앱이 어떠한 방식으로 동작하는가에 대한 학습

인프라맵 설계

  • web서버: nginx로 구성, 이중화를 위해 두개 서버를 구축
  • 마스터/슬레이브 dns서버를 배치하여 dns쿼리에 대한 응답으로 HAproxy의 IP를 받도록 설정
  • HAProxy를 이용하여 웹 서버에 트래픽에 대한 로드밸런싱을 구축
  • HAProxy의 보안을 위해 ssl 설정
  • 시간이 된다면 스토리지 및 파일공유 시스템을 구축

web-nginx 구축

1. selinux off

  • getenforce 명령어를 통해 [Enforcing/Permissive/Disabled] 상태가 출력된다.
  • selinux 가 on 으로 (enforcing) 설정이 되어 있을 경우, 여러 제약사항이 발생한다.
  • ‘setenforce 0’ 으로 끌 경우, 서버 재부팅시 다시 on 이 된다.
  • 영구적으로 selinux off 를 설정할 경우는 아래와 같이 진행한다.
  • vi /etc/selinux/config or vi /etc/sysconfig/selinux로 들어가서 수정해준다.
$ sudo vi /etc/sysconfig/selinux
(변경전)
SELINUX=enforcing
(변경후)
SELINUX=disabled

$ sudo reboot

2. resolv.conf

  • nameserver 가 지정되어 있지 않다면, 아래와 같이 nameserver 를 설정한다.
  • $ sudo vi /etc/resolv.conf
# Generated by NetworkManager
search kornet
nameserver 168.126.63.1
nameserver 168.126.63.2
nameserver 8.8.8.8

3. nginx-repo 추가

$ sudo yum -y install epel-release
$ sudo vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

4. nginx 패키지 설치

$ sudo yum -y update  ## 인덱스 업데이트
$ sudo yum -y install nginx

5. 방화벽 설정

$ sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-ports
  • Zone은 사용자가 요구하는 정책 허용, 특정 허용, 거부, 특정 거부 등등에 맞게 그룹으로 관리되며, 처음 설정 시 위 명령어를 실행하였을 경우 기본적으로 내장되어 있는 정책
  • Public Zone : Firewalld의 기본 영역이며, 서비스를 제공하는 포트로 연결을 허용할 경우 사용

6. nginx 실행

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

💡 vi /etc/nginx/conf.d/default.conf 파일에서 nginx관련 정보를 볼 수 있다.

💡 nginx의 웹 표시 파일은 /usr/share/nginx/html/ 디렉터리에 존재한다 -> index.html 파일도 여기에 존재
💡 apache는 /var/www/html에 존재
-> 웹에 접속할때에는 가상머신내의 ip로 웹페이지에 들어갈 수 있다.

DNS 구축

1. 패키지 설치

$ sudo yum -y update
$ sudo yum -y install bind bind-chroot bind-utils

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**; };

(생략)

## 정방향 도메인 설정
54 zone "goorm-11th.com." IN {
55         type master;
56         file "goorm-11th.com.zone";
57         allow-update { none; };
58 };
59
## 역방향 도메인 설정
60 zone "0.168.192.in-addr.arpa" IN {
61         type master;
62         file "goorm-11th.com.zone";
63 };
64
65 include "/etc/named.rfc1912.zones";
66 include "/etc/named.root.key";
  • listen-on port 53 { any; };
    → DNS 요청에 응답할 인터페이스(any)와 포트(53) (IPv4)
  • listen-on-v6 port 53 { ::1; };
    → DNS 요청에 응답할 인터페이스와 포트(IPv6)
  • allow-query { localhost; };
    → DNS 쿼리 요청을 허가할 대상
  • zone “도메인.” IN {
    type master; → 도메인 영역을 직업 관리한다.
    file “~.zone”; → 영역 파일의 이름을 지정한다.
    allow-update { none; }; → 갱신을 제출하도록 허용된 호스트를 정의하는 인터넷 주소 일치 리스트를 지정한다.

수정 전과 같이 기본 설정 값은 localhost 에서만 DNS 요청을 받아들이도록 설정되어 있다. 다른 호스트가 현재 서버의 DNS 서비스를 사용하도록 구성하려면 이 설정 값을 변경해야 햔다. 특정 인터페이스 또는 특정 대상을 지정하려면 적절한 설정 값을 지정해야 하고, 특정 대상을 지정하지 않으려면 any를 입력한다.

## 아래 명령어를 통해 오타 검수한다.
$ named-checkconf

명령형식 : named-checkzone ZoneName FileName

3. zone파일 생성

  • 원본 파일 named.localhost 를 복사하여 새로운 zone 파일을 생성한다.
**$ cd /var/named
$ ll**
total 16
drwxr-x--- 7 root  named   61 Jan 17 00:25 chroot
drwxrwx--- 2 named named   23 Jan 17 00:27 data
drwxrwx--- 2 named named   60 Jan 17 00:28 dynamic
-rw-r----- 1 root  named 2253 Apr  5  2018 named.ca
-rw-r----- 1 root  named  152 Dec 15  2009 named.empty
-rw-r----- 1 root  named  152 Jun 21  2007 named.localhost
-rw-r----- 1 root  named  168 Dec 15  2009 named.loopback
drwxrwx--- 2 named named    6 Oct  4 16:06 slaves

**$ 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  goorm-11th.com.  root. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN      NS      ns.goorm-11th.com.
        IN      A       192.168.0.20
NS      IN      A       192.168.0.21
www     IN      A       192.168.0.20
  • 아래와 같이 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

  • tcp 프로토콜을 확인해볼 수 있다.
$ sudo firewall-cmd --info-service=dns

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

Client 서버에서 구축한 DNS서버를 쿼리하여 Web-nginx 호출하기

새로 생성한 Client 서버는 보기 편하도록 윈도우로 생성했다.
같은 내부 망에서 DNS 서버는 위에서 구축한 서버로 잡아, nslookup 조회시 DNS쿼리 정상 조회 되는 것과 도메인으로 정상 호출되는 것까지 확인되었다.

💡 만약 Client 에서 DNS가 다른 DNS값으로 설정되어 있다면???
위에서 구축해두었던 Web서버로 쿼리 조회할 수 있는 DNS값이 아니기 때문에, 아래와 같이 쿼리 조회 서버가 KT DNS로 잡히면서 찾을 수 없는 도메인인 것을 확인할 수 있다.
→ goorm-11th.com 도메인은 실제로 존재하는 도메인이 아니라, 테스트 용도로 내부에서 임의 설정한 도메인이기 때문에 외부에서 실제 사용되는 KT DNS 등에서 찾을 수 없는 도메인이다.
위와 같이 DNS 쿼리 조회가 불가능하다면, 웹 접속은 당연히 불가능할 것이다.

이를 통해 알 수 있는 것은 Web 서버는 DNS의 zone파일에 지정되어 있어야 하며 Client가 Web 서버를 브라우저로 띄우기 위해서는 해당 Web 서버가 DNS 쿼리를 조회할 수 있어야 한다.

profile
전공 소개

0개의 댓글