fungramming - 환경구축 자동화와 서버구축
by Yoonkh
재미그래밍 스터디 자료
웹 환경 구축 자동화
환경구축을 왜 자동화해야 할까요?
보통 서버는 한 번 구축하면, 이후로는 특별힐 건드릴 일이 없으니 수동으로 대처해도 충분하다고 생각할 지 모르지만, 실제로는 새로 서버를 추가하거나 서비스 중인 환경에 새로운 라이브러리와 미들웨어를 설치하거나, 신기술을 검증하려고 개발 환경을 따로 준비해야하는 상황은 반드시 발생하기 마련입니다. 그때마다 매번 수동으로 환경을 구축한다는 것은 시간이 아무리 많아도 부족합니다. 하지만 절차를 자동화했다면 누구든 짧은 시간에 간단히 구축할 수 있습니다.
-
가상화 기술 도구
-
Vagrant
-
Docker
-
-
프로비저닝 도구
- Ansible
-
서버의 상태 테스트 도구
- Serverspec
프로비저닝이란??
프로비저닝이란, 비즈니스의 요구에 따라 시스템 자원을 자동으로 할당/회수, 재배치하여 시스템 자원을 최적화 하는 기능입니다.
-
서버자원 프로비저닝
- 서버의 CPU, Memory 등의 자원을 할당 또는 적절하게 배치해서 운영할 수 있도록 준비해 놓는 것을 서버자원 프로비저닝이라고 합니다.
-
OS 프로비저닝
- OS를 서버에 설치하고, 구성 작업을 해서 OS가 기동되도록 준비해 놓는 것을 OS 프로비저닝이라고 합니다.
-
소프트웨어 프로비저닝
- 소프트웨어를 시스템에 설치/배포하고 필요한 구성 셋팅 작업을 해서 실행 할 수 있도록 해 놓는 것을 소프트웨어 프로비저닝이라고 합니다.
수동 환경 구축의 위험성
환경 구축을 자동화하면 어떤 점이 좋을까??
-
수동으로 환경을 구축할 때는 다음과 같은 상황에서 문제점이 발생할 수 있습니다.
-
서버를 새로 추가한다.
-
서버에 라이브러리나 미들웨어를 설치한다.
-
개발 환경을 가볍게 구축한다.
-
새로운 서버 추가
-
서버를 보강하는 방법
-
스케일 업: 서버의 CPU와 메모리를 고성능 제품으로 업그레이드하여 처리 성능을 올리는 방법.
-
스케일아웃: 서버 수를 늘려서 성능을 올리는 방법.
-
접속이 늘어나서 웹 서버나 애플리케이션 서버의 처리 성능이 부족하여 스케일아웃 방식으로 대처하는 경우가 있습니다.
스케일 아웃 방식을 사용하면 비용면에서 유리하고, 서버가 한 대 정도 정지해도 서비스를 계속 제공할 수 있다는 장점이 있습니다. 하지만 웹 서버와 애플리케이션 서버를 새로 추가해야 한다는 단점도 있습니다.
서버를 새로 추가할 때, 환경 구축이 자동화되어 있으면 간단한 커맨드로 서버를 추가할 수 있습니다. 하지만 환경 구축이 자동화 되어 있지 않으면, 서버를 추가하는 데 손이 많이 가고 실수를 하기도 쉽습니다.
수동환경구축의 문제점을 회피하고 환경구축을 자동화하는 구체적인 방법을 알아보겠습니다.
가상화 기술 도구 / 가상머신(VM): Vagrant
가상화는 실제 운영체제 위에 가상화 소프트웨어를 설치한 후에 소프트웨어를 통해 하드웨어를 에뮬레이션한 후 이 위에 운영체제를 설치하는 것을 의미합니다. 가상화 해주는 소프트웨어를 하이퍼바이저라고합니다.
다음 그림에서 보이는 가상화 부분에 해당하는 하이퍼바이저 설치, 운영체제 설치, 애플리케이션 설치 및 설정은 모든 개발자가 다 똑같이 해줘야 하는 작업입니다.
- 가상화의 개념
Vagrant는 이런 문제를 해결하기 위한 솔루션으로 설정 스크립트를 기반으로 특정 환경의 가상 머신을 만들어서 신속하게 개발 환경을 구축하고 공유할 수 있게 만들어진 솔루션입니다.
-
Box 파일
-
가상머신 시작시 기반이되는 이미지 파일
-
가상환경을 만드는데 필요함
-
일반적으로 OS 이미지에서 작성한다.
-
Vagrant를 사용할 때 최소한의 설정 조건
-
Vagrant 사용자
-
sshd 시작
-
프로비저닝 도구
-
-
-
Vagrantfile
- 가상머신의 사양이나 프로비저닝 도구의 지정 등 가상 머신의 구성
-
Ruby 기반으로 작성
- 기본적으로 파일과 프로비저닝 도구 설정으로 2개의 파일이 있다면 동일한 환경 구성이 가능
가상화 기술 도구 / Docker
컨테이너 기반(프로세스)의 오픈소스 가상화 플랫폼(OS가상화와 조금은 다른 개념)
-
Docker의 주요 개념
-
컨테이너
-
도커이미지
-
오버레이 네트워크
-
유니온 파일 시스템
-
도커 이미지란??
- 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않음
도커에서 가장 중요한 개념은 컨테이너와 함께 이미지라는 개념입니다
이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않습니다. 컨테이너는 이미지를 실핸한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장됩니다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있습니다.
도커 이미지 관리
- URL방식으로 태그를 붙일 수 있음
컨테이너란??
- 도커 이미지를 실행한 상태, 추가되거나 변하는 값을 컨테이너에 저장
도커이미지와 컨테이너관계
-
도커이미지에서 여러개의 컨테이너를 생성가능
-
컨테이너의 상태가 바뀌거나 삭제되어도 도커이미지는 변하지 않고 그대로 남아 있음
오버레이 네트워크란?
- 오버레이 네트워크(Overlay network)는 물리 네트워크 위에 성립되는 가상의 컴퓨터 네트워크입니다. 이 오버레이 네트워크 안의 노드는 가상, 논리 링크로 연결될 수 있으며, 각 링크는 네트워크 안에서 많은 물리적 링크를 통하지만 물리적 링크를 고려하지는 않습니다.
유니온 파일 시스템이란?
- Unionfs는 Linux, FreeBSD 및 NetBSD를 위한 파일 시스템 서비스로, 다른 파일 시스템을 위한 통합 마운트를 구현 합니다. 분기라고하는 별도의 파일 시스템의 파일과 디렉토리를 투명하게 겹쳐서 하나의 일관된 파일 시스템으로 만듭니다. 병합 된 분기 내에서 동일한 경로를 갖는 디렉토리의 내용은 새로운 가상 파일 시스템 내의 단일 병합 된 디렉토리에서 함께 볼 수 있습니다.
Command와 API
도커 클라이언트의 커맨드 명령어는 정말 잘 만들어져 있습니다. 대부분의 명령어는 직관적이고 사용하기 쉬우며 컨테이너의 복잡한 시스템 구성을 이해하지 못하더라도 편하게 사용할 수 있습니다. 또한 http기반의 Rest API도 지원하여 확장성이 굉장히 좋고 훌륭한 3rd party 툴이 나오기 좋은 환경입니다.
도커의 훌륭한 생태계
도커는 굉장히 큰 생태계를 가지고 있고 커다란 기업과 협력하여 사실상 클라우드 컨테이너 세계의 사실상 표준이 되었습니다. 로깅, 모니터링, 스토리지, 네트워크, 컨테이너 관리, 배포 등 다양한 분야에서 다양한 툴들이 존재하며 아예 도커를 위한 OS도 존재합니다. 현재 도커를 기반으로한 오픈소스 프로젝트는 10만개가 넘고 굉장히 활발하게 진행중입니다.
프로비저닝 도구 / Ansible
-
테스트 환경을 구축하는 데 사용되는 툴 Provision & configuration management tool
-
python으로 개발되고 YAML이라는 언어를 통해 정의할 수 있고 json으로 통신
- python github project중 상위 랭킹(6위)
-
해커 뉴스 분석을 보면 ansible이 많이 Mention이 되어지고 있음
-
오픈 소스 버전 (GPL)
Asible 장점 및 지원
-
빠른 SSH 통신, 빠른 provision이 가능
-
추후 상용 환경에서 사용할 때 agent 기반이면 방화벽 이슈, agent 데몬 관리라는 불편한 점이 존재(agent 방식은 확장성, 대규모 provision을 할 경우 매우 효과적이지만 서버와 통신하는 부분이 고도화되기 때문에 빠르고 간단한 provision을 할 수 없음)
-
자동 배포 환경이 쉬움
-
개발 가능성이 높은 오픈소스
-
대부분이 멱등성을 제공
-
playbook
-
ad-hoc 지원
-
병렬 provisioning 지원.
-
vagrant
-
jinja2
멱등성
-
여러 번 적용해도 결과는 바뀌지 않음
-
바뀌는 것이 없으면 당연히 배포되어도 바뀌지 않음
-
바뀌는 부분이 있으면 그 부분만 반영
-
shell, command, file module은 보장 되지 않는다
Ansible에서 멱등성이란??
여러번 ansible 툴을 사용하더라도 동일한 결과값이 나올 수 있도록 제공되는 형태여야 합니다. 매번 다른 결과가 나오거나 에러가 나온다면 비 멱등성하다고 할 수 있습니다. ansible 툴의 거의 대부분의 모듈은 멱등성을 제공합니다.
playbook
플레이북은 애드훅 테스트 실행 모드와는 완벽하게 다른 사용방법이며 특히 강력한 사용 방법입니다. 간단히 말해 플레이북은 정말 간단하게 설정을 관리하고 다수의 머신에 대한 배포 시스템에 대한 기본적인 단위입니다. 기존에 존재해왔던 것과 달리 복잡한 어플리케이션 형태의 배포에 매우 적절합니다. 플레이북은 설정을 정의 할 수 있으며 특정 머신의 집합을 오가며 다른 작업을 수행하도록 수동으로 작업 순서를 설정하는 것도 가능합니다.
ad-hoc
Adhoc이라는 의미는 임시적으로 수행하는 의미. ansible의 playbook을 작성하여 수행하는 것이 아니라 임시적으로나 또는 특별하게 어떤 작업을 수행하기 위해서 사용할 수 있는 실행방법이라고 할 수 있습니다.
Ansible의 한계
-
시스템의 초기 설치 수행은 불가능 (kickstart, pxe 등을 사용해야함)
-
시스템 모니터링은 지원하지 않음
-
시스템 변경사항은 추적하지 않음
서버의 상태 테스트 도구 / serverspec
Serverspec은 루비 테스트 프레임워크인 RSpec 형식으로 인프라 계층을 테스트할 수 있으며, 주로 통합 테스트를 지원합니다. 특정 구성 관리 도구에 의존하지 않으므로 어떤 도구를 사용해도(또는 어떤 도구도 사용하지 않고 직접 인프라를 구축했다고 해도) 테스트를 작성할 수 있다는 장점이 있습니다.
Serverspec으로 테스트해야 하는 대상은 단위 테스트 수준보다 통합 테스트 수준, 조건 분기 등을 포함해 복잡한 구성이 필요한 경우에 사용하면 좋습니다.
Serverspec의 원래 목적은 ‘인프라의 상태를 테스트’하는 것이 아니라 ‘인프라의 상태를 기술한 코드를 테스트’하는 것입니다. 코드 리팩터링을 지원하며 코드의 불안정한 부분을 테스트하는 기능도 지원합니다. 따라서 코드화를 가속시키는 성격의 도구입니다.
웹서버 구축
웹 브라우저로 표시할 HTML이나 이미지 데이터 등을 모아 두었다가 요청에 따라 전송하는 서버를 웹 서버라고 합니다. 웹 브라우저에서 HTTP를 사용해서 웹 서버에 요청을 보내면, 웹 서버는 그 요청을 받아서 필요한 처리를 합니다. 웹 서비스를 제공하려면 서버에 웹 서버 프로그램을 설치해야 합니다. 대표적인 것으로는 아파치와 Nginx등이 있습니다.
아파치
아파치는 1995년 NCSA httpd1.3을 기반으로 개발을 시작한 후로 20년 가까이 높은 시장 점유율을 유지하며 1위 자리를 지켜 왔습니다. 최근 몇 년은 계속 점유율이 떨어지는 추세이지만, 오랜 역사를 이어 온 만큼 안정적이며 많은 사용자에게 사랑받는 웹서버입니다.
워낙 다양한 추가기능에, 구축이 쉽다는 이유 때문에 많이 쓰고 있습니다. 하지만 Apache자체만으로 엄청 무거운데다가, Squid와 함께 Slowloris취약점이 발견되었기에, 보통 프로그래밍 능력이 능숙한 사람들이나, 대형사이트 운영자는 Nginx,IIS를 주로 쓰고 있습니다.
오픈소스(open source) 라이선스에 따라 무료로 배포되어 원하는 사람들이 자유롭게 사용할 수 있습니다.
유닉스·윈도 등을 비롯해 거의 모든 운영체제와 시스템에서 운용이 가능합니다.
Apache의 특징
-
쓰레드 / 프로세스 기반 구조로 요청 하나당 쓰레드 하나가 처리하는 구조
-
사용자가 많으면 많은 쓰레드 생성, 메모리 및 CPU 낭비가 심함
-
하나의 쓰레드 : 하나의 클라이언트 라는 구조
Apache의 특징
-
정적 컨텐츠의 효율적인 제공
-
Tomcat보다 10% 더 향상된 속도
-
클러스터링을 제공
-
보안문제의 해결
-
다중 웹사이트 호스팅을 제공
-
다양한 모듈을 제공
Nginx
트래픽이 많은 웹사이트를 위해 확장성을 위해 설계한 비동기 이벤트 기반구조의 웹서버 소프트웨어입니다.
더 적은 자원으로 더 빠르게 서비스한다
가벼움과 높은 성능을 목표로 만들어 졌으며, 러시아의 프로그래머,이고르 시쇼브가 Apache의 C10K Problem(하나의 웹서버에 10,000개의 클라이언트의 접속을 동시에 다룰 수 있는 기술적인 문제)를 해결하기 위해 만든 Event-driven구조의 HTTP, Reverser Proxy, IMAP/POP PROXY server를 제공하는오픈소스 서버 프로그램입니다.
Apache는 전 세계 서버에 70%의 점유율(2015.7기준)을 차지하고 있던 무지막지한 서버였지만, 지금은 다릅니다.
nginx의 특징
-
비동기 Event-Driven 기반 구조.
-
다수의 연결을 효과적으로 처리가능.
-
대부분의 코어 모듈이 Apache보다 적은 리소스로 더 빠르게 동작가능
-
더 작은 쓰레드로 클라이언트의 요청들을 처리가능
Nginx의 장점
-
보안 앞 단의 nginx로 리버스 프록시로 사용하고 뒷단에는 WAS를 설치하여 외부에 노출되는 인터페이스에 대해 Nginx WAS 부분만 노출 가능합니다. 익명의 사용자가 직접적인 Web Server로의 접근을 한다라고 하면 문제가 발생할 수 있기 때문에 직접적이지 않고 한 단계를 더 거침으로써 보안적인 부분을 처리할 수 있습니다.
-
Backend-service 장애 대응 처리 Backend-service 에 대해 max fails, fail timeout시 백업 서버로 진입할 수 있도록 처리 가능합니다.
-
빠른 속도
Subscribe via RSS