기존에는 애플리케이션을 다루는 서버를 운영하는 Ops 그룹과 애플리케이션을 제작하고 런칭하는 Dev그룹이 나눠져 협동을 하였다. 다만 물리적인 서버에 변수가 너무 많고, 서비스를 늘리면 그에 맞는 서버들이 유기적으로 연동되야하고, 여기에 다시 애플리케이션을 올리다보면 설정이 달라지거나 서버가 불안정하면 서비스 자체가 흔들리는 경우가 많았다.
작업자체가 대규모다 보니 릴리즈 시간이 점차 늘어나고, 릴리즈가 늘어날 수록 개발 충돌이 많이 일어난다(버전이나 코드 등의 협의가 섞이기 시작) 이에 따랄 데브옵스 문화는 지속적으로 정착될 것이다.
데브옵스의 움직임 : 문화, 자동화, 측정, 공유
목적 : 최대한 소프트웨어 배포 절차 자동화, 코드 형태로 인프라 관리.
IaC의 구분
코드 형태로 자동화를 구현할 수 있는 것은 즉각적인 호출과 응답을 할 수 있는 스크립트를 제작하는 것
수동으로 작업하는 것을 절차로 정의하고, 스크립트 언어로 구현해 대상 장비에서 수행한다.
즉 스크립트를 작성하는 것이다.
직접 장비에 맞는 코드를 수작업으로 추가해야하며, 대규모 인프라에서는 구성하기 매우 까다롭고 어렵다는 단점이 있다.
Chef, Ansible 등이 구성 관리 도구에 속하며, 서버에 소프트웨어를 설치하거나 관리하는 목적으로 상요한다.
특징 : 코딩 규칙
분산형 구조
도커, 베이그란트와 같은 것으로, 소프트웨어와 수행 시 필요한 설정과 의존성이 있는 프로그램들을 포함한 특정 시점에 운영 체제와 함께 스냅샷하여 템플릿 이미지화 하는 것이다.
그래서 베이그란트를 통해서 VM을 생성한뒤 ansible로 관리하면 된다.
컨테이너는 운영체제의 사용자 영역만 에뮬레이트 한다.(기본적으로 사용자 영역과 커널 영역이 있는데, 커널 영역은 모든 하드웨어 까지 접근권한이 있어, 위험할 수 있다)
서버 템플릿의 경우 변하지 않는 인프라(Immutable Infrastructure)로 이미 fix된 버전으로 이미지를 만들어서 새로 버전 업그레이드 될 경우 별도의 이미지를 작성하지 않는 한 모두 동일한 세팅을 항시 유지할 수 있다는 장점이 있다.
Terraform, CloudFormation 처럼 서버, DB 등 인프라 자체를 구성하기 위한 도구를 만들 수 있다.
코드형 인프라를 적용하면 배포 주기가 수백배, 장애 복구시간이 수십시간 빨라지며, 상용 서비스 적용이 매우 빨라지는 효과를 얻었다.
구성 관리 vs 배포 도구
구성 관리도 리소스 프로비저닝을 통해 배포 도구의 역할도 한다. 배포 도구 역시 스크립트를 통해서 구성 관리 정보를 수집할 수 있다. 도커 파일과 같은 탬플릿 이미지를 소유하고 있다면 서버 프로비전 도구가 가장 효과적이며, 서버 템플릿 도구가 없다면 설정 관리 도구와 프로비전 도구를 함께 사용하는 것이 최적이다.
예로 테라폼으로 인프라 리소스를 배포하고, 앤서블로 설정 관리를 수행하는 식이다.
가변 vs 불변의 인프라
chef, ansible 등의 구성관리 도구는 가변적 인프라를 기본으로 한다. 따라서 구성 관리 도구로 소프트웨어 버전 업그레이드가 필요하면 개별적으로 진행되게 되며, 이 경우 추후 관리가 되지 않을 수 있다. 따라서 해당 내용들은 변하지 않는 인프라를 사용할 때 유리할 수 있다.
terraform과 같은 배포 도구는 업그레이드한 이미지를 새로 생성한 다음, 새 이미지를 배포하고, 기존 이미지를 회수하는 방식으로 진행해서 배포도 빠르고 회수나 복구도 빠르다.
절차적 언어 vs 선언형 언어
절차적 언어는 해당 언어가 절차적으로 지속 반영된다. 선언형 언어는 선언한 내용으로 실행한다.
즉, ansible과 같은 절차적 언어는 기존 10대의 서버 구성 코드에서 15대로 증강하려면 5를 추가해 넣어야 하나,
terraform과 같은 선언형 언어는 기존 10대의 서버 구성 코드에서 15대로 증강하려면 10을 15로 변경하면된다.
마스터 유무
마스터 서버의 역할은 인프라를 한 곳에서 중앙 관리하고, 웹 인터페이스를 제공하는 곳도 많으며, 백그라운드에서 지속해서 실행되 구성 변경 감지가 쉽다.
다만, 클러스터를 구성하는 등 추가적인 리소스를 잡아먹고, 마스터 서버 자체가 중요해 관리, 운영, 업그레이드, 백업, 모니터링 작업이 필요하며, 모든 클라이언트와 소통 포트를 열어둬야하므로 보안적으로 위험할 수 있다.
에이전트 유무
에이전트는 일반적으로 각 서버 백그라운드로 수행되며, 최신의 설정 관리 업데이트를 담당한다.
부트스트랩핑 : 서버를 프로비전하고 어떻게 소프트웨어를 설치하는가? 일부 구성 관리 도구는 일부 외부 프로세스가 처리할 것으로 가정하여 진행한다.
유지관리 : 에이전트 소프트웨어는 주의 깊게 정기적으로 업데이트하고, 마스터 서버와의 동기화를 신중하게 유지해야한다. 에이전트 소프트웨어가 재시작되거나 문제가 발생하면 모니터링 되어야한다.