Kubernetes, Docker, Jenkins 를활용한 CI/CD 환경구축 삼성전자 SQE Lab.( 네트워크 ) 이호광 2018. 10. 18.
목차 제품특성과현재환경, 목표 DevOps Immutable Infrastructure Infrastructure as Code Container Container Orchestration CI/CD 개선결과, Lesson Learned 03 05 06 07 08 10 13 14
제품특성과현재환경 다양한제품 ( 군 ) 과개발 / 운영중인버전들 다양한 OS 와버전 다양한 toolchain 서버 개발서버 빌드서버 서버관리자가서버세팅 / 관리 개발자는개발서버에서 build 월평균 21,000 commits
목표 개발자는개인 PC 에서개발 개발서버미제공 빌드서버는 Cloud Native On-Premise 에서 Cloud 처럼 CI/CD Pipeline Commit 되면 pipeline 시작 Pipeline 은빌드, 시험, 배포의일련의 workflow 특정 step 에서문제발생시 committer 에게알림 Automation & Infrastructure as Code 모든것이자동화 누가무엇을바꿨는지쉽게알수있으면
DevOps (2008 년 Agile conference 에서처음언급됨 ) Dev(Development) + Ops (Operation) 개발팀과운영팀사이의소통, 협업을강조하는 S/W 개발방법론 빨리, 자주, 안정적으로 build, test, release 할수있는문화와환경구축 주요 Practice Continuous Integration 자동화된 build, 테스트후변경사항을주기적으로통합 Continuous Delivery 코드변경되면자동으로 build, test, release 준비 Infrastructure as Code Provisioning, 시스템변경및구성에대한일관되고반복적인과정자동화 Microservices Monitoring and Logging Communication and Collaboration
Immutable Infrastructure (2013 년, Chad Fowler) 서버가배포된후에수정되지않는인프라패러다임 변경이필요하면새서버를제공하고기존서버를대체 Snowflake Server vs Phoenix Server (2012 년, Martin Fowler) Immutable Infrastructure 의장점 일관성및신뢰성향상 간단하고예측가능한배포프로세스 변경가능한인프라에서일반적으로발생하는문제를완화하거나완전히예방 효율적으로사용하려면다음사항이필요 배포자동화 Cloud 컴퓨팅환경에서의빠른 provisioning 상태저장또는임시데이터처리솔루션
Infrastructure as Code 지금까지수작업으로해오던인프라구축이나변경작업을코드로작성해서자동화하는것 인프라에 " 유연성 ", 즉반복성과확장성을부여 장점 : 빠른속도, 비용절감, 위험감소 Tools Ansible Chef Puppet Terraform AWS CloudFormation <Docker in Docker!> ( 출처 : https://github.com/docker-library/docker)
Container Container 란? VM 과유사하나, Host OS 의 Kernel 을공유하면서애플리케이션과라이브러리만가상화하는방법 ( 출처 : techtarget.com) Container 기술의장점 가볍다 : VM 을사용할때보다최대 4~10 배나더많은서버인스턴스구동가능 빠르다 : 컨테이너가구동되면애플리케이션이바로시작됨
Docker ( 부두노동자를뜻함 ) Container 기술중현재가장인기있는오픈소스소프트웨어 표준컨테이너포맷지위획득 (2015년 OCI(Open Container Initiative) 에소스기증 ) 이미지생성과배포 / 관리에특화되어, Cloud와같은유연성을제공 비저장성 - 영속성 (Persistency) 없음 ( 필요시별도 volume 사용 ) As-Is To-Be Toolchain Toolchain Toolchain RHEL 7.1 RHEL 7.2 RHEL 7.3 VM VM VM Docker Registry Don t Care Don t Care RHEL 7.1 환경 RHEL 7.2 환경 RHEL 7.3 환경 - VM 개수만큼각종 OS, Toolchain 설치 - 환경이변경되면, VM 개수만큼작업 - 이미지관리 ( 환경당 1 회 ) - 환경이변경되면이미지업데이트 ( 출처 : docker.com)
Container Orchestration 수많은호스트에서다양한 container 를세팅하고적용 / 관리해야하는번거로움을해결 컨테이너의배포, 관리, 확장, 네트워킹및가용성을자동화하는도구 기능 호스트 Provisioning 컨테이너세트의인스턴스화 실패한컨테이너일정재조정 합의된인터페이스를통해컨테이너연결 클러스터외부에서비스노출 컨테이너추가또는제거로클러스터확장또는축소 ( 출처 : docker.com) <The Container Orchestration Landscape is Changing> ( 출처 : cncf.io)
Kubernetes (k8s) ( 그리스어로키잡이를뜻함 ) Container Orchestration 도구중가장인기있는오픈소스소프트웨어 Google 이자사데이터센터운영에활용했던컨테이너기술을기반으로개발해오픈소스로공개 CNCF(Cloud Native Computing Foundation) 에 2016 년첫번째프로젝트로기부 master Pod 1 Pod 2 Node Node Node ( 출처 : cloudplatform.googleblog.com) PV
+ alpha Harbor VMware 사에서만든오픈소스 Docker registry 현재 CNCF sandbox project Helm The package manager for Kubernetes chart 활용하여복잡한 Kubernetes application 을쉽게정의, 설치, 업그레이드할수있음 chart 를생성, 버전관리, 공유, 배포하기쉬움 현재 CNCF Incubating project
CI/CD Fail Fast CI (Continuous Integration) change 가 commit 되면즉시 build & test 가능한빠른오류발견과수정을가능케한다 빨리고품질의 code 를만들수있다 (2010 년, Jez Humble) (1997 년, Kent Beck) CD (Continuous Delivery or Continuous Deployment) CI 를더오른쪽으로 (test, deploy) 확장하여 release-ready 상태보장 빠르고반복적이고믿을수있는방법으로 change 가 pre-production 또는 production 환경, 결국고객에게까지전달될수있게한다 Continuous Deployment 는 Facebook, Netflix 와같은 B2C 제품에적합
Jenkins Cloudbees 사에서만든오픈소스 CI/CD Tool 다양한 Plugin 제공 Pipeline as Code <Blue Ocean 에서의 Pipeline> ( 출처 : Jenkins.io) <Pipeline as Code : Jenkinsfile> ( 출처 : Jenkins.io)
개선결과 개발환경 Container화 개발환경을 Dockerfile로작성하고형상관리 Harbor로 Docker Registry 구축하고이미지등록 개발서버대신개인PC에서개발 Kubernetes 활용한 Cloud Native 환경구축 kubeadm 활용한 Kubernetes Cluster 구축 Ingress, Persistent volume, Helm 설치 / 활용 Jenkins 설치 Jenkins 운영 Blue Ocean, Kubernetes, Pipeline 등의 Plugin 활용 MultiBranch Pipeline Job 생성 제품 /branch 별 Jenkinsfile 작성하고형상관리
개선결과 As-Is To-Be 개발서버 RHEL 7.1 RHEL 7.2 RHEL 7.3 k8s master Ubuntu 16.04 k8s nodes ( 빌드서버 ) Dockerfile 빌드서버 Jenkinsfile RHEL 7.1 RHEL 7.2 RHEL 7.3 Docker Registry VCS Jenkins master RHEL 7.1 RHEL 7.2 RHEL 7.3 Jenkins Master Launch Jenkins Agent PODs using Docker Registry Run pipeline
Lesson Learned Infra 기술들이 Cloud 를향하고있다 ( 또는 Cloud 의대중화 ) Hybrid (Cloud + On-premise) 환경으로전환예상 DevOps Engineer? Docker (+ Harbor) Dockerfile 작성 / 관리중요 Kubernetes (+ Helm) 난이도상 (http(s) proxy 문제등 ) 아직완성되지않았지만 (beta 버전 ) 강력하다 Jenkins 설정자동화필요 (Configuration as Code Plugin 활용 )
Q&A
THANK YOU