3. 누구?
• 남편이자 두 아이의 아빠
• ~ 2011 웹개발
• ~ 2014 성능팀, Arcus 캐시 개발/운영
• 2015 ~ nDeploy 빌드 배포 시스템
4. Naver Labs & D2 Program
• Naver Labs
• 네이버의 핵심기술에 대한 Research & Engineering
• http://labs.naver.com
• D2 Program (For Developers, By Developers)
• 가치 있는 기술 지식 생산을 돕고 경험을 나누며, 개발자
를 지원합니다.
7. nDeploy
• 네이버와 라인, NHNEnt.에서 사용하는 빌드/배포 시스템.
• 사용자가 관리하는 Jenkins 서버를 좀 더 쉽고 강력하게 쓸
수 있게 해줍니다.
• 접근 권한 관리, 배포할 서버 관리, 시나리오에 기반한 자유
도 높은 빌드 프로세스 정의가 가능합니다.
• In-house 앱 배포 기능도 있습니다.
8.
9.
10.
11. 번거로운 Jenkins 설치
• 자유도가 높아질 수록 운영 비용이 올라 갔습니다.
• Jenkins 설치는 어떻게 하나요?
• 플러그인은 뭘 깔아야 하나요?
• 서버 검색이 안되요 ㅠ_ㅜ
• VM을 쓰고 있는데 너무 느려요 ㅠ_ㅜ
12. Jenkins를 풀(pool)로 제공해봐
• VM만으로는 해결이 되지 않는다.
• 고사양의 공용 빌드 서버에 Jenkins를 여러 개 띄우려면?
• 각 사용자 별로 독립적인 환경을 어떻게 제공하지?
16. CoreOS Fleet
• CoreOS에 내장. systemd를 클러스터 레벨로 지원.
• 단순한 스케줄러.
• 도커 컨테이너에 대한 별도의 지원은 없음.
• 서비스 디스커버리를 직접 구현해야 함.
• 하지만 도커 컨테이너를 여러 호스트에서 간단히 실행하기
에는 좋은 플랫폼.
207. service를 생성하면 별도의 IP가 할당됩니다
POD
10.1.30.2:8080
POD
10.1.40.2:8080
nginx-service
10.100.0.1:8080
Host A Host B Host C
POD
10.1.20.5:8080
Client
PROXY PROXY PROXY
Portal IP
IP가 충돌할 수 있으니
다른 subnet을 사용
208. 각 호스트에 있는 Proxy가 iptables 정책을 변경하여
어디서든 접속할 수 있도록 합니다.
POD
10.1.30.2:8080
POD
10.1.40.2:8080
nginx-service
10.100.0.1:8080
Host A Host B Host C
POD
10.1.20.5:8080
Client
PROXY PROXY PROXY
port
42356
port
33615
port
55178
(REDIRECT / DNAT)
10.100.0.1
tcp dpt:8080 to:ip:port
214. • https://coreos.com/
• 최신 커널과 리눅스 플랫폼을 지원하는 경량 리눅스 배포본.
• 선택한 이유
• system, journald, fleetd, etcd, flanneld
• CentOS 7이 아직 초기 단계.
• cloudinit을 이용한 쉬운 OS 형상 관리.
216. Ansible
• CoreOS 및 Kubernetes 클러스터 운영을 자동화.
• CoreOS 호스트 별 OS/플랫폼 설정을 템플릿 화 할 수 있음.
• CoreOS에는 파이썬이 설치되어 있지 않기 때문에 직접 설
치해야 합니다.
• https://github.com/defunctzombie/ansible-coreos-
bootstrap
218. Jenkins 도커 이미지
• All-in-one 이미지를 하나만 관리.
• 사내에서 주로 사용하는 빌드 도구나 SDK를 미리 설치.
• JDK7/8, maven, gradle, nodejs, android SDK 등.
• 필수 플러그인을 미리 설정.
• 인증, 빌드 도구, nDeploy 등.
219. Jenkins 도커 이미지
• official jenkins Dockerfile을 기반으로 사내 환경에 맞춤.
• 사내 계정, 사내 플러그인 설치 등.
• 기본 빌드 도구 및 SDK는 호스트에 설치하여 볼륨 마운트.
• 로컬 라이브러리 저장소(maven, gradle)도 공유.
220. Jenkins Reverse Proxy
• 도메인에 연결된 전용 Jenkins URL 제공.
• /jenkins-id
• Golang으로 구현한 간단한 reverse proxy로 역시
Kubernetes pod/service로 구동. 80 포트를 노출.
• 요청된 jenkins-id에 대해 Kubernetes의 service discovery
정보를 확인하여 실제 endpoint IP를 확인.
221. Jenkins Reverse Proxy
• ApiServer에서 지원하는 Proxy를 쓰지 않은 이유
• apiserver로 모든 요청이 집중되기 때문. (요청량 제한)
• 어차피 ApiServer로 부터 discovery 정보를 얻지 않나?
• 메모리에 캐싱하여 주기적으로 갱신해야 함.
• ApiServer의 Watch API를 이용, 리얼타임 갱신도 수행.
222. Private Docker Registry
• nDeploy 전용의 도커 저장소가 필요.
• 사내 환경에 맞는 도커 이미지 서비스: OS, Jenkins 등
• 사용자별 Jenkins 도커 이미지 저장.
• V1: https://github.com/docker/docker-registry
• V2: https://github.com/docker/distribution
223. V1 버전은 쓰지 마세요
• 매우 느립니다.
• 자주 죽습니다. (심지어 sleep 하다가도…)
• 검색 엔진(alchemy) 붙일 경우 UPDATE lock에 시달립니다.
• 하지만 도커 1.5 버전 까지는 어쩔 수 없이 써야 합니다ㅠ_ㅜ
224. V2로 업그레이드
• 마이그레이션
• Docker 1.6과 Registry V2를 설치하여 실행.
• docker pull을 이용하여 registry1의 모든 이미지를 pull.
• 도커 업그레이드 (1.5 - 1.6)
• 이미지 호환되지 않음.
• 1.6 설치 후, 다른 storage path를 지정하여 실행.
225. Kubernetes Master 이중화
• Kubernetes는 아직 master 이중화를 지원하지 않습니다.
• 저희는 L4와 fleet을 이용해 이중화 하고 있습니다.
• fleet에 대한 자세한 내용은 아래 링크를 참고 해주세요.
• https://github.com/coreos/fleet