44
Kubernetes통한 Laravel 개발프로세스 개선하기 아이엠컴퍼니 개발자 김창엽 ([email protected])

Kubernetes를 통한 laravel 개발프로세스 개선하기

Embed Size (px)

Citation preview

Page 1: Kubernetes를 통한 laravel 개발프로세스 개선하기

Kubernetes를 통한 Laravel 개발프로세스 개선하기아이엠컴퍼니 개발자 김창엽 ([email protected])

Page 2: Kubernetes를 통한 laravel 개발프로세스 개선하기

Kubernetes를 통한 Laravel 개발프로세스 개선하기아이엠컴퍼니 개발자 김창엽 ([email protected])

Page 3: Kubernetes를 통한 laravel 개발프로세스 개선하기

저는

안드로이드 개발자 (카카오폴, 쿨메신저, 아이엠스쿨)

DevOps 개발자 (Kubernetes, CI 자동화)

필요한 개발들 (스크립팅, 웹어플리케이션)

Page 4: Kubernetes를 통한 laravel 개발프로세스 개선하기

아이엠컴퍼니는

● AWS 사용● 개발팀 13 ~ 15명● 웹&시스템개발자 8명

○ 배포쪽 겸직 2명○ 시스템 겸직 2~3명○ 웹전담도 있음

● 일반적으로 2명 정도의 개발자가 3~4개 정도의 기능들을 묶어서 개발함○ => 한번에 3개 정도의 기능 집합들이 동시에 개발됨○ Ex) SMS 문자 메시지(주소록) + 추천 관리 시스템 + 커머스 리스팅 광고 기능을 동시에

Page 5: Kubernetes를 통한 laravel 개발프로세스 개선하기

좋은 개발자 상시 모집 중

Page 6: Kubernetes를 통한 laravel 개발프로세스 개선하기

오늘 주제Kubernetes를 통해서 개발프로세스(워크플로우)를 개선한 이야기

● Laravel 1%● Docker 9%● AWS 30%● Kubernetes 40% (세부 개념에 대한 설명은 하지 않습니다.)● Jenkins 20%

Page 7: Kubernetes를 통한 laravel 개발프로세스 개선하기

발표가 끝났을 때 기대하는 반응● Docker나 Kubernetes 모르는데 들을 만 했다● 아이엠컴퍼니는 저런 식으로 일하고 있구나● 세팅하느라 고생했네● 아이엠컴퍼니에서 일해보고 싶다

Page 8: Kubernetes를 통한 laravel 개발프로세스 개선하기

PHPHypertext Preprocessor

Page 9: Kubernetes를 통한 laravel 개발프로세스 개선하기

PHPHypertext Preprocessor

Pogi Hamyeon Pyeonhae?

Page 10: Kubernetes를 통한 laravel 개발프로세스 개선하기

초기 스타트업이 간과하는 것들● 배포

● 백업○ Version Control System○ Daily Database Backup

● 에러 추적○ Email on Error○ Slack on Error○ Logging

Page 11: Kubernetes를 통한 laravel 개발프로세스 개선하기

Node.js를 배포한다면?● Update on Restart● 그냥 재시작하면 당연히 서비스 순단(순간 단절)이 생김

Page 12: Kubernetes를 통한 laravel 개발프로세스 개선하기

Node.js를 배포하려면?현재 돌고 있는 워커들이 연결된 리퀘스트를 처리할 때 까지 대기해야함

● Blue-Green Deploymenthttp://martinfowler.com/bliki/BlueGreenDeployment.html

● Rolling Updatehttps://en.wikipedia.org/wiki/Rolling_release

Page 13: Kubernetes를 통한 laravel 개발프로세스 개선하기

Laravel + PHP-FPM을 배포하려면?● Git Pull (Clone)하고● artisan 커맨드 좀 돌리면 (optimize나 cache등)● 재시작 없이 끝!● 왠만해서는...

Page 14: Kubernetes를 통한 laravel 개발프로세스 개선하기

개발 프로세스와 Git Flow● 개발 브랜치

○ feature○ develop

● 테스트 브랜치○ release

● 프로덕션 브랜치○ master○ hotfix

Page 15: Kubernetes를 통한 laravel 개발프로세스 개선하기

2016년 중순까지의 아이엠컴퍼니● features

○ 작업 단위가 한달정도 되면 따로 분리

● develop○ 작업 단위가 작으면 develop에서 바로 작업

● qa○ 개발자들이 작업한 것을 기획자와 QA들이 체크하는 곳

● stable (git-flow의 master 대응)○ 프로덕션

Page 16: Kubernetes를 통한 laravel 개발프로세스 개선하기

환경에 따른 백엔드 분리 (비동기 Queue, DB)

production

● stable

feature

● features

develop

● develop● qa

Page 17: Kubernetes를 통한 laravel 개발프로세스 개선하기

Push Based Deploy● 아이엠컴퍼니에서는 Git

Push를 하면 모든 배포가 자동으로 일어나게 설정되어있었음○ QA Deploy○ Production Deploy

● 환경은 미리 구축된 것을 이용하기만 함● Feature의 경우는 일련의 과정을 수동으로 한번 해줘야함

○ 귀찮으니까 Feature용 환경 구축을 지양하게 됨○ 비용 발생도 원인

Page 18: Kubernetes를 통한 laravel 개발프로세스 개선하기

Gitlab

Production QA

Push

githo

ok

githook

Page 19: Kubernetes를 통한 laravel 개발프로세스 개선하기

테스트와 환경에 따른 문제● 기획자나 QA가 테스트를 하려면 QA까지 밀어넣어야 외부 노출이 된다.● feature 환경을 별도로 노출시키려면 전체 환경을 복제해야하므로 비용이 발생한다.

○ Route53○ DB (정말 드물게)○ EC2○ SQS 등○ 안쓰는 리소스가 가끔 남아있을 때가 있음

Page 20: Kubernetes를 통한 laravel 개발프로세스 개선하기

1. Git-Flow대로 브랜치를 관리하고, 브랜치들은 외부 노출이 되어야함2. ip based로 가면 ssl(https) 환경에서 테스트 불가 => 도메인이 필요

어떻게 해야할까?

Page 21: Kubernetes를 통한 laravel 개발프로세스 개선하기

문제점

1. 각 브랜치들이 모두 독립적으로 인스턴스를 가동하면 인스턴스 관리가 어려워 짐a. 사용하지 않는 인스턴스를 주기적으로 정리해줘야 함

2. 도메인을 매번 관리하는 것은 손이 많이 감a. Route53까지 자동화시켜야함 .

Page 22: Kubernetes를 통한 laravel 개발프로세스 개선하기

Kubernetes (쿠베르네테스, k8s)이상한 모임이니까 이상한 모임 링크

https://blog.weirdx.io/post/30460

● Kubernetes: Intro by 1ambda님

Page 23: Kubernetes를 통한 laravel 개발프로세스 개선하기

Kubernetes● By Google● Docker Container Management

○ vs Docker Swarm?

● Docker Container Deploy● Internal IP, DNS, Proxy 등등의 Network Management Layer● AWS, Google Cloud등과 연동

● Pod: 컨테이너 그룹● Service: Pod 접근 제어

Page 24: Kubernetes를 통한 laravel 개발프로세스 개선하기

Kubernetes Service● ClusterIP

○ Internal 접근만 가능

● NodePort○ 포트 개방○ 노출되는 형태가 안 이쁨

● LoadBalancer○ 서비스 하나당 하나의 로드밸런서○ 포트포워딩 없이 SSL 사용하려면 사실상 유일한 방법

Page 25: Kubernetes를 통한 laravel 개발프로세스 개선하기

Service with LoadBalancer● 1달에 18불● 로드밸런서 한대로 모든 트래픽을 분산시킬 수 없을까?

Page 26: Kubernetes를 통한 laravel 개발프로세스 개선하기

Kubernetes DNS● 자체 DNS를 가지고 있어서 노출된 서비스를 규칙에 따라 접근할 수 있다.● [svc].[namespace].svc.cluster.local● svc와 namespace를 호스트로 받으면?● DNS Server: 10.0.0.1

Page 27: Kubernetes를 통한 laravel 개발프로세스 개선하기

Kubernetes Navigator● 요청된 호스트에 따라 내부 DNS를 이용하여 Proxy Pass하는 Nginx Service

Page 28: Kubernetes를 통한 laravel 개발프로세스 개선하기

Navigator nginx

Page 29: Kubernetes를 통한 laravel 개발프로세스 개선하기

Service with Git Branch● 네임스페이스는 그렇다치고…● 어떤 브랜치가 어떤 서비스로 만들어지는지 어떻게 결정하지?

● 브랜치를 가지고 서비스를 만들면 되지!

Page 30: Kubernetes를 통한 laravel 개발프로세스 개선하기

Jenkins를 통한 Git과 k8s 연결

Page 31: Kubernetes를 통한 laravel 개발프로세스 개선하기

Jenkins를 통한 Git과 k8s 연결mgr-ft는 서비스 구분자입니다.(같은 namespace에 다른 서비스들이 돌아가고 있음. namespace는 환경별로만 구분)

Page 32: Kubernetes를 통한 laravel 개발프로세스 개선하기

Jenkins를 통한 Git과 k8s 연결

Page 33: Kubernetes를 통한 laravel 개발프로세스 개선하기

Jenkins를 통한 Git과 k8s 연결

Page 34: Kubernetes를 통한 laravel 개발프로세스 개선하기

3줄 요약1. Jenkins에서 푸시가 일어나면2. 브랜치 이름에서 서비스 이름을 따다가 (feature/sms면 sms)3. 해당 브랜치 이름으로 k8s deployment와 service를 생성 혹은 갱신한다.

Page 35: Kubernetes를 통한 laravel 개발프로세스 개선하기

Git-flow + Kubernetes = PROFIT!● 언제든지 독립된 환경에서 개발자가 git만으로 테스트를 위한 배포를 수행할 수 있다.

Page 36: Kubernetes를 통한 laravel 개발프로세스 개선하기

Pros● 여러명의 개발자가 동시에 같은 제품을 작업해도 문제가 없다.● QA는 코드 머지로 인한 사이드이펙트 같은 문제에 신경쓰지 않고, 기능 테스트때 기능 테스트에만 집중할 수 있다.

○ 통합테스트는 릴리즈 전에 최종 진행

● 로컬 환경보다 훨씬 빠르다. (AWS내에서의 리소스 접근)● 프로덕션 환경과 동일한 환경에서 테스트가 가능하다.

Page 37: Kubernetes를 통한 laravel 개발프로세스 개선하기

Cons● Docker image build를 포함한 Rolling update 반영이 생각보다 좀 걸린다.

○ 현재 Laravel + Angular.js 어플리케이션 빌드하는데 평균 3분 ~ 길면 5분

● 1.3 기준 Kubernetes Service name 길이 제한이 있다 (24자)○ 이 제한이 브랜치 이름 길이 제한을 줘버린다.○ mgr-ft-(feature)이름이므로 실제 사용할 수 있는 브랜치 이름은 17자

○ 1.4 에서 63자까지로 완화됨(https://github.com/deis/workflow/issues/212)

● k8s 환경에 문제가 있다면 원인을 찾기가 어렵다.○ Laravel https 필터 관련 Navigator에 X-Forwarded-Proto 관련 문제를 경험

● 클라이언트는 호스트를 동적 변경 할 수 있어야 편해진다.

Page 38: Kubernetes를 통한 laravel 개발프로세스 개선하기

고민 사항● DB, Redis, SQS(MessageQueue)등도 환경에 따라 분리하는 게 좋지만…● 결국 Kubernetes 안에 서비스를 많이 밀어넣으면 클러스터 개수가 굉장히 빠르게 늘어남.

● DB같은경우는 기존에 누적된 데이터가 없으면 테스트가 너무 어려운 부분이 있음.

○ 데이터가 많아서 덤프 넣는데도 시간이 오래 걸릴거라...

Page 39: Kubernetes를 통한 laravel 개발프로세스 개선하기

배포 요약

Gitlab Jenkins Kubernetes

Page 40: Kubernetes를 통한 laravel 개발프로세스 개선하기

Kubernetes 서비스 접근 요약

NavigatorLoadbalencer

Kubernetes

Navigator Pods

namespace

App Pods

namespace

App Pods

Page 41: Kubernetes를 통한 laravel 개발프로세스 개선하기

부록) 그래서 얼마나 아꼈을까? (30개의 서비스를 가정)

Page 42: Kubernetes를 통한 laravel 개발프로세스 개선하기

Plain AWS (1 mon)● EC2 (t2.nano): $0.01 * 24(시간) * 30(일) * 30(대) = $216● ELB: $0.025 * 24 * 30 * 30 = $540● $756

Page 43: Kubernetes를 통한 laravel 개발프로세스 개선하기

Kubernetes (1 mon)● EC2(m3.large): $0.193 * 24 * 30 * 2(대, master & slave) = $277.92● ELB: $0.025 * 24 * 30 * 1: $18● $295.92 ● Plain AWS 대비 60% 절감

Page 44: Kubernetes를 통한 laravel 개발프로세스 개선하기

Q&A감사합니다