DevOps

그리고 자동화

검색팀 송원석

  • 처음 듣는 용어 많음 주의
  • 세부적이지 않음 주의
  • 노잼주의

주의사항

DevOps란?

DevOps는 개발과 운영을 동시에 하는것?

개발 + 운영? 그거 우리도 이미 다 하고 있는데?

개발 + 운영

틀린 말은 아니지만 맞는 말도 아님

어플리케이션이 서비스 되기까지

배포 > load balancer 조절 > 일부 서버 반영 > 기능 테스트 > 

load balancer 조절 (계속 반복)

서버 health check > fail over (rise & fall) > scale up & out

그냥 간단히만 적어도 이정도

개발 > Unit test > 빌드 > 개발서버 배포 > QA > 스테이징 배포 > QA > 

 운영 배포

개발 > Unit test > 빌드 > 개발서버 배포 > QA > 스테이징 배포 > QA > 

 운영 배포

DevOps는

load balancer 조절 > 일부 서버 반영 > 기능 테스트 > 

load balancer 조절 (계속 반복)

서버 health check > fail over (rise & fall) > scale up & out

그냥 간단히만 적어도 이정도

<< 얘빼고 모두 자동 & 간소화 (이것이 핵심!)

HOW TO

DevOps Tools

이미 자동화를 위한 수많은 tool들이 존재한다.

설명할 필요가 없는 핫한 container engine

자동화 어플리케이션 배포 툴. 

playbook이라는 yml파일로 config 설정

docker container management tool

server monitoring tool

vm image manage tool

빌드 자동화

Travis CI

  • 대표적인 github plugin
  • 설치 or 서버 필요없이 사이트 들어가서 github계정으로 사용한다고만 하면 세팅완료
  • 학습비용 적음
  • 소스를 서버에 pull하면 자동으로 테스팅 & 빌드 & deploy시작
  • project폴더에 .travis.yml파일을 생성해야함(example) (java example)
  • gitlab도 Gitlab CI 라고 비슷하게 플러그인 형식으로 운영중

AWS DevOps

  • AWS에서는 DevOps를 위한 많은 tool들을 제공해줌
  • AWS CodeDeploy같은 서비스로 배포를 자동화 가능 (AppSpec생성 필요)
  • AWS CodePipeline 같은 서비스로 배포를 단계별로 진행가능
  • On Premise 환경에서도 지원됨 (살짝 유료)

QA 자동화

Unit Test

maven돌리면 돌아가니 설명 생략

Canary analysis

  • 넷플릭스에서 배포전에 실행하는 테스트
  • 운영과 비슷한 환경을 구축해놓은 후 bot으로 HTTP status codes, response times, exception counts, load avg, 등을 측정
  • 넷플릭스는 Canary Score 100점 만점에 90점 이상 통과되었을시 반영

Selenium

  • http://www.seleniumhq.org/
  • 단순한 Mock객체로 http테스트를 하는것이 아닌 실제 브라우저로 unit테스트를 할 수 있게 도와줌
  • WebDriver로 여러 브라우저에서 잘 동작하는지 테스트 가능
  • unit test처럼 작성할 수 있고 브라우저의 plugin형태로도 지원
  • 단점 : 서버 구축 및 학습비용 필요

Phantom.js

  • http://phantomjs.org/
  • chrome v8엔진 기반으로 만들어진 테스팅 도구
  • javascript기반이라 테스팅을 작성하기 너무 쉬움
  • 페이지 비동기 호출까지 모두 체크 가능
  • jQuery같은 css selector로 페이지 제어 가능
  • 한줄만 적으면 현재 보고있는 페이지 캡쳐가능 [page.render('1.jpg')]
  • 단점 : 멀티 브라우징 테스트 안됨. 최근 release가 안되고있음

그래도

직접 테스트 해보는건 게을리 하지 맙시다

배포 자동화

배포 자동화를 하려면

  • 접속 유저가 끊어지거나 오류페이지를 봐서는 안됨
  • router (LB)를 많이 건드릴수록 사용자가 접속이 끊어지게됨
  • load balancer의 설정이 자동으로 이루어져야함
  • 배포실패시 rollback이 가능해야함

Blue Green deployment

  • Matin Fowler가 2010년에 자신의 블로그에 blue green deploy방식에 대해 정의 (URL)
  • green zone과 blue zone을 반영할때마다 스위칭하는 방식 (IMAGE)
  • 배포에 문제 발생시 이전 서비스를 재배포 필요없이 그냥 router(LB)를 스위칭 하기만 하면됨

Zero time deployment

  • cloud진영에서는 원래 프로그램이 있던곳이 아닌 다른영역에 배포후 domain이 바라보는 곳을 스위칭 하는 방식으로 적용 (AWS Beanstalk, pivotal cloud등)
  • l7 layer 등을 재기동하지 말고 config를 reload해서 사용 (example) (근데 사실 reload해도 접속자수 너무 많으면 끊어짐..)
  • 정리하면 배포는 시간이 걸릴수밖에 없으니 배포된 서버로 연결을 switching하는 방식이 유리하고 잦은 스위칭은 장애가 될 수 있다.

AWS CodePipeline

  • 배포를 리전별 그룹별 단계별로 배포가능
  • 서버 배포시 여러형태의 배포 설정을 지원

Fail Over

Fail Over

  • 고가용성(High Availability) 구성은 필수 
  • l4 l7 영역에서 rise & fall option을 설정 가능 (haproxy)
  • 이런 방식은 특정 URL을 health check하는 방식 이기 때문에 일부 기능만 마비 혹은 데이터를 가지고 오지 못하는 세부적인 사항에 대비할 수 없음

Circuit Breaker

  • Martin Fowler가 자신의 블로그에 기술 (URL)
  • 최근 micro service에 의해 서버간 통신이 더 잦아지면서 더욱 중요해짐
  • 특정 연결에 장애 지속적 발생시 연결을 끊고 다른 대체 method를 호출하다 연결이 원할해지면 다시 원래 method를 호출
  • Java는 Netflix에서 만든 Hystrix (spring cloud netflix)나 FailSafe 나 Javaslang-circuitbreaker등이 있음

Scale out

같은 서버에 scale out

  • 같은 서버에 scale 조절시 port나 로그 or upload파일 경로등이 겹쳐 문제가 발생할 수 있음
  • 스케일 조절시 session clustering도 신경 써야함 (redis나 gemfire같은 memory db고려)
  • nodejs는 pm2만 설치하면 해결 (pm2 scale 숫자)만 치면 알아서 늘어남
  • 그럼 java는 어떻게...

docker-compose

  • docker image를 yml설정파일로 관리할 수 있는 도구 (Doc)
  • 여러개의 docker image를 docker-compose up 명령어로 한번에 필요한 여러 서버를 띄우거나 부분적으로 기동도 가능 
  • 설정이 되었다면 docker-compose scale web 5 이런 명령어로 쉽게 scale조절 가능
  • docker는 설정이 겹쳐도 container안에서 독립적이라 port나 로그 경로등이 겹쳐도 아무 지장 없음

다른 서버에 scale out

  • 이부분은 서버가 vm으로 관리되는 cloud환경을 추천
  • on premise 환경의 경우 ansible, docker-swarm, kubernetes등으로 관리
  • 이도저도 안된다면 아예 vm이미지로 만들어서 서버에 vm이미지를 올려서 vagrant로 관리하는거도 방법
  • 결론은 scale 관리하기 docker가 짱임

기타 scale out

  • Apache Mesos로 자원을 관리하고
  • Marathon 으로 WAS or job을 관리하는 방식
  • Marathon으로 auto recovery, scale change, load balance, health check등을 UI상에서 매우 손쉽게 지원

기타

  • 최근에는 Slack을 이용하여 채팅 명령어로 배포하는 Hubot 이나 Deploy Bot 같은 서비스도 존재함 (Example)
  • 아마존에서는 Alexa Skills Kit이라는 음성으로 Aws서버를 관리하는 도구도 존재함.

마지막으로

  • 지금 설명한것은 DevOps의 일부분인 자동화 부분만 설명. 매일 매일 해야하는 배포나 빌드 모니터링등이 먼저 자동화가 되어야 Dev와 Ops를 함께 하는것이 가능해짐.
  • flickr DevOps는 하루에 10번 이상 운영 반영이 이루어짐. 자동화 되어야 이런것들이 가능해짐.
  • 자동화를 도와주는 여러 tool 및 방법론이 있다 하더라도 쉬운 작업이 절대 아님.
  • 한명이 DevOps를 노력한다고 해서 할 수 없고 개발팀 전체가 DevOps문화를 이해하고 같이 고민하고 노력해야함

감사합니다