안녕하세요, 사람인HR Tech Sourcer 이승빈입니다
이번 포스팅에서는 2020년에 도입되어 운영하고 있는 kubernetes 인프라에 애플리케이션을 빌드하고 배포하는 사람인HR의 프로세스 운영 기술을 소개해드리려 합니다.
Story
지난 포스팅에서 소개해드린 대용량 Push 메시지 생성 시스템과 같은 고객을 위한 서비스를 제공하기 위해서는 이러한 서비스를 만드는 개발 환경이 사전에 구축되어 있어야 합니다.
•
Agile : 짧은 작업 계획 기반의 개발 문화
•
Gitlab CI → 작업물 자동 검사기
•
Kubernetes 인프라 → 기계 운영 도구
•
Git ops → Gitlab CI + Kubernetes Infra 운영 도구
빠르게 변화하는 기술과 고객의 니즈에 대응하기 위해서 애자일 방법론을 사용하게 되는데요. 애자일 방법론을 실현하기 위해서는 짧은 작업 기간 마다 작업물을 검사해줄 수 있는 Gitlab CI가 필요합니다. 또한 Gitlab CI와 더불어 대용량 Push 메시지 생성 시스템을 이루던 Docker 기반의 세 기계를 운영하는 Kubernets Infra 이 두 가지를 운영할 수 있도록 만들어 주는 Gitops가 필요해요.
K8S 인프라 CI/CD
K8S 인프라 CI/CD란 서비스 기술을 의미하는 것이 아닌 대용량 Push 메시지 생성 시스템과 같은 시스템의 운영 기술입니다. 이때 CI는 지속적인 운영을, CD는 지속적인 배포라는 뜻을 가지고 있는데요. 다음과 같은 과정을 거치게 됩니다.
•
CI : Continuous Integration, 기계의 테스트 과정을 자동화하는 부분에 해당 (Gitlab CI)
1.
개발자가 git에 애플리케이션 코드를 푸시
2.
푸시 된 소스에 대해 gitLab CI 프로세스가 통합 빌드 진행
3.
결과물로써 컨테이너 이미지가 생성되고 사내 Docker 저장소에 이미지 푸시
•
CD : Continuous Delivery 혹은 Continuous Deployment, CI 이후 기계를 관리하고 작동시키기 위한 적절한 환경을 구성하는 부분에 해당 (Kubernetes 인프라)
1.
배포 작업서에 변경 사항 업데이트
2.
배포방식(자동 혹은 수동)에 따라 kubernetes 인프라에 Deploy 및 Upgrade
시스템은 규모가 커질수록 관리가 힘들어지기 마련입니다. 대용량 Push 메시지 생성 시스템과 같은 기술에 적절한 운영 방식이 구축되지 않는다면 기존의 서비스를 유지하는 데에 많은 인력이 투입되어 서비스가 더 이상 진화하지 못하거나 별도의 추가 인력 투입으로 인해 비용이 배로 발생하게 됩니다. 그렇기 때문에 운영 방식의 자동화를 통하여 업무의 효율을 높여주는 것은 매우 중요합니다. 서비스인프라개발팀은 서비스를 운영하기 위한 최상의 환경 구축을 위해 연구를 진행하고 있으며 나아가 고품질의 서비스를 제공하기 위한 개발을 병행하고 있습니다.
시스템 구축에 사용된 주요 기술 스택
Gitlab CI
사람인HR에서는 CI 툴로 gitlab CI를 사용하고 있습니다. gitlab 프로젝트 저장소에 커밋이나 푸시와 같은 수정 사항이 발생하면 gitlab-ci.yml이란 파일에 작성된 과정대로 CI가 수행됩니다. 사전에 Docker 이미지 빌드 과정을 수행하기 위한 Dockerfile 작성이 이루어져 있어야 합니다. 수정한 소스 코드를 컴파일하고 빌드하면 Docker 이미지를 생성하여 빌드하고 저장소에 푸시한 후 자동으로 업데이트합니다.
Kubernetes
kubernetes란 컨테이너의 배포, 관리, 확장, 네트워킹을 자동화를 도와주는 컨테이너 오케스트레이션 Tool입니다. 과거 물리 서버에서 두 개 이상의 애플리케이션을 실행할 경우 특정 애플리케이션이 자원을 전부 차지하는 등 리소스 할당 이슈가 있었고 여러 물리 서버를 실행하는 경우 자원이 충분히 활용되지 않거나 물리 서버를 유지하는 데 큰 비용이 드는 단점이 있었습니다. 이에 대한 해결책으로 가상화가 도입되었습니다. 가상화는 소프트웨어를 사용하여 Host OS에서 작동하는 단일 컴퓨터 하드웨어 요소를 가상머신이라고 하는 다수의 가상 컴퓨터들로 분할하여 사용하는 방법입니다. 실제 컴퓨터 하드웨어의 일부에서만 실행되면서 자체적으로 Guest OS를 두어 각각 독립적인 컴퓨터로써 작동하여 자원을 효율적으로 사용할 수 있게 되었습니다. 하지만 Guest OS부터 가상장치, Host OS, 물리 장치에 이르는 여러 단계의 파이프라인으로 구성되어 있어 속도가 저하되는 또 다른 이슈가 발생했습니다.
그렇게 해서 등장한 것이 바로 컨테이너입니다. 컨테이너란 가상화와 유사하지만, Guest OS를 두어 독립적인 컴퓨터로써 분리하여 사용할 수 있는 자원을 분할하는 것이 아닌 운영체제를 공유하면서 프로세스 자체에 사용할 수 있는 자원을 분할하여 독립적으로 애플리케이션을 실행할 수 있도록 도와주는 기술입니다. 그렇기 때문에 가상화보다는 가볍다는 장점을 가지게 되었고 속도 저하와 관련된 이슈를 해결할 수 있게 되었습니다. 컨테이너를 다루는 도구 중 가장 유명한 것이 Docker이고 이러한 도구를 통해 컨테이너를 오케스트레이션 하는 것이 바로 kubernetes입니다.
Helm
kubernetes에 동일한 애플리케이션을 여러 번 배포하는 상황은 빈번하게 발생합니다. 애플리케이션을 배포하기 위해서 컨테이너 배포뿐 아니라 다양한 리소스들을 같이 배포해야 하는데 동일한 애플리케이션을 배포할 때마다 리소스들을 다시 작성해 주는 것은 매우 불편한 상황이 아닐 수 없습니다. 게다가 리소스들은 가끔 수정이 필요한 작은 부분을 제외하고는 보통 그 정의가 동일하기 때문에 같은 내용들을 한 번에 한 번만 변경할 수 있도록 도와주면서 필요한 일부 항목은 변경이 가능하도록 해주는 시스템이 요구됩니다.
Helm은 kubernetes용 패키지 매니지먼트 도구로 바로 위와 같은 역할을 가능하게 하는 존재입니다. Helm에서는 기본적으로 리소스들의 yaml 포맷 파일을 관리하는데 이러한 yaml파일들의 집합을 차트라 하고 이 차트를 관리하게 됩니다.
Rancher
Rancher란 kubernetes를 관리하는 Tool입니다. kubernetes의 여러 리소스를 관리하기 위한 집합체인 kubernetes 클러스터를 쉽게 생성하고 관리할 뿐 아니라 운영에 필요한 모니터링, 보안 관련 기능을 Web UI 기반으로 쉽게 설치할 수 있는 관리 플랫폼입니다. 사용자 UI를 통해 Rancher의 기능 중 Helm 기반의 Chart를 검색하고 실행할 수 있는 기능을 이용하여 클릭하는 것만으로 간단하게 애플리케이션을 배포 및 실행할 수 있습니다.
GitOps
gitops란 git을 사용하는 프로젝트에서 DevOps를 구현하는 것을 의미합니다. DevOps에 대한
확장으로 인프라를 코드로 취급하여 애플리케이션과 그 기반 인프라를 관리합니다. git 저장소의
코드와 Production 환경이 일치하도록 자동화된 프로세스를 구축하는데 애플리케이션을 배포하거나 업데이트할 때 코드를 수정하여 자동화 프로세스에 일관된 환경을 유지할 수 있도록 하는 방식입니다. gitops를 통하여 두 개의 git 저장소를 관리하는데 하나는 애플리케이션 자체의 소스 코드를 저장하는 code 저장소와 kubernetes 배포용 매니페스트를 저장하는 config 저장소입니다.
이번 포스팅에서는 사람인HR의 gitops를 기반으로 gitlab CI를 이용한 CI와 Helm, Rancher를 이용한 Kubernetes 인프라 CD 자동화 프로세스 운영 방식을 살펴보았습니다. 쿠버네티스는 계속해서 컨테이너 기반 애플리케이션의 표준 플랫폼으로 자리 잡아가고 있는 만큼 개발자분들의 경우 관련된 기술 스택을 확장하신다면 도움이 되지 않을까 생각합니다.
다음 포스팅에서는 Elastic Stack을 사용한 관제 시스템을 소개해드리겠습니다. 앞으로도 사람인HR 피플팀의 개발 큐레이션 많은 관심 부탁드립니다.
출처 및 참고 사이트
•