시간과 비용을 절약하고, 생산성과 품질까지 향상시킬 수 있는 소프트웨어 개발 방법은 없을까?
DevOps는 개발(Develop)과 운영(Operation)을 통합하는 개발 방법론을 뜻합니다. 개발과 운영팀 간의 협업과 소통을 강화해, 지속적인 통합과 배포로 빠른 시간 내 안정적인 서비스를 제공하는 것을 목표로 합니다.
과거에는 개발팀과 운영팀이 서로 다른 업무를 수행하며, 서로의 역할을 이해하지 못하는 경우가 많았습니다. 이로 인해 서비스 출시가 지연되거나 버그, 오류, 보안 이슈와 같은 예상치 못한 상황이 발생하기도 했습니다. 하지만 DevOps를 통해 이런 문제를 해결할 수 있습니다. 다만 기존 업무 프로세스와는 전혀 다른 방식이라 변화에 대한 저항이 있을 수 있습니다.
따라서, DevOps를 도입하기 위해서는 기술적 / 문화적 / 조직적인 변화와 전략적인 계획, 충분한 지원이 필요합니다. DevOps는 최신의 소프트웨어 개발과 운영 방식을 대변하는 기술인 만큼 각 팀들이 긴밀하게 협력해 서로의 역할을 이해하는 것이 중요합니다. 또한, 지속적인 개선과 배포를 통해 빠르게 서비스를 제공하기 위해서는 회사 차원의 지원과 관심이 필요합니다.
이번 글에서는 DevOps 도입에 필요한 준비사항과 소프트웨어로 100% 자동화된 DevOps를 구축하는 방법에 대해 알아보겠습니다.
DevOps의 3가지 방법론
DevOps는 개발자와 운영자 간의 협력과 자동화, 지속적인 통합과 배포, 모니터링 등의 과정을 통해 개발과 운영을 빠르게 반복하고 개선합니다. DevOps 방법론은 다음과 같이 크게 3가지 영역으로 나눌 수 있습니다.
<개발 영역>
- 지속적인 통합(Continuous Integration, CI): 개발자가 코드를 작성하면 자동으로 테스트가 실행돼 최대한 빨리 오류를 찾아낼 수 있도록 합니다.
- 지속적인 배포(Continuous Deployment, CD): 코드 변경이 있을 때마다 자동으로 배포가 이루어지며, 배포 프로세스를 자동화해 실수를 최소화합니다.
<운영 영역>
- 모니터링: 시스템의 상태를 지속적으로 모니터링해, 장애 발생 시 빠르게 대응할 수 있도록 합니다.
- 로깅: 시스템 로그를 수집하고 분석해 이상을 감지하고, 이를 해결하기 위한 데이터를 제공합니다.
- 보안: 개발 팀과 운영 팀이 보안에 대한 책임을 공유해 보안 이슈를 최대한 빠르게 대응할 수 있도록 합니다.
<협업 영역>
- 자동화: 인프라 구성과 배포를 자동화해 실수를 줄이고 생산성을 높입니다.
- 문화: 개발자와 운영자 간의 소통을 촉진하고 문제 해결을 위한 협업을 강조합니다.
- 지식 공유: 지식을 공유해 지속적인 학습과 성장을 촉진합니다.
DevOps는 개발자, 운영자 간의 협력과 생산성을 높여 빠른 배포와 안정적인 운영을 가능하게 합니다. 배포 시간은 줄이면서 배포 빈도를 증가시키고, 실패로 인한 복구 시간과 실패율도 감소시켜 소프트웨어의 제공 속도를 높이고 서비스의 안정성을 향상시킵니다.
DevOps구축의 핵심은?
DevOps의 핵심은 ‘자동화’입니다. 인프라 파이프라인과 애플리케이션 파이프라인을 구축하고 모니터링을 자동화해 비용과 시간을 절약하고 안정적인 운영을 지원합니다.
인프라 파이프라인을 구축하면 인프라 리소스를 코드로 관리(Infra as a Code) 하고 자동화할 수 있는데요. 이는 인프라 구성이 일관되고 안정적이며, 사람의 개입이 줄어들어 시간과 비용을 절약할 수 있습니다. 또한, 인프라 구성 변경 사항들을 관리할 수 있어 안정성을 유지할 수 있습니다.
또한 애플리케이션 파이프라인을 자동화하면 지속적인 통합과 배포, 테스트 자동화를 통해 빠른 피드백과 개선을 기대할 수 있습니다. 이를 통해 더욱 높은 품질의 애플리케이션을 제공하게 되는 것이죠.
DevOps를 통해 모니터링을 자동화하면, 모니터링 시스템이 오류를 감지하고 알림을 보내 오류 대응 속도가 빨라지고 서비스의 안정성도 향상됩니다. 이외에도 DevOps에 중요한 4가지 항목이 있습니다. 수준 높은 DevOps를 완성하기 위해서는 이 항목들을 모두 만족할 만한 수준으로 충족시켜야 합니다.
- 변경 리드타임: Code Commit(개발된 소스를 저장하고 제어하는 기능을 제공하는 버전 관리 시스템)에서 운영 환경에 성공적으로 실행되는 데까지 걸리는 시간
- 배포 빈도: 코드를 운영 환경에 배포하거나 최종 사용자에게 배포하는 빈도
- 복구 시간: 서비스 사고 또는 사용자에게 영향을 미치는 결함이 발생할 때 서비스를 복원하는 시간
- 변경 실패율: 프로덕션 또는 릴리즈 변경 중 서비스 성능 저하 및 조치가 필요한 비율
DevOps를 구축하는 다양한 소프트웨어 자동화 도구
100% 자동화된 DevOps를 구축하기 위해서는 현재 프로젝트 성격에 맞는 소프트웨어 자동화 도구를 선택해야 합니다.
1) 인프라 프로비저닝(IT 인프라를 생성하고 설정하는 프로세스) 자동화
기존의 인프라 관리는 사람이 수동으로 콘솔에서 작업해야 했습니다. 이는 수많은 시간과 비용이 소모되었으며, 실수로 인한 안정성 문제가 발생하기도 했는데요. 이제는 인프라 파이프라인을 구축해 관리를 자동화하며 생산성을 높일 수 있습니다.
인프라 기반 환경 생성을 위해서는 프론트엔드(Front-end), 백엔드(Back-end), 애플리케이션, CI/CD 파이프라인과 같은 ‘인프라 파이프라인’이 구성되어야 합니다. 인프라 파이프라인은 인프라 구성을 위해 소프트웨어 구성 관리(Software Configuration(구성) Management, 소프트웨어의 변경사항을 체계적으로 추적하고 통제하는 것) 개념을 이용해서 모든 인프라를 코드에 의해 변경하고, 몇 번을 시도하더라도 동일한 결과를 만들어냅니다. 또한, 애플리케이션 파이프라인에서 필요한 인프라 자원도 함께 구성해 인프라 관련 작업을 대기할 필요 없이 유연하게 반영할 수 있습니다. 이러한 인프라 프로비저닝 자동화를 구현하는 데 사용할 수 있는 소프트웨어 도구들은 아래와 같습니다.
- 인프라 자원 생성 및 관리: Terraform, AWS Cloudformation, CDK 등
- 서버의 환경 변수 및 상태 관리: Ansible, Chef, Puppet 등
- 코드 및 파이프라인 관리: Gitlab, Jenkins, AWS Code Series 등
- 컨테이너 관리: Docker, Kubernetes
이외에도 도구 선택은 특정 요구 사항과 사용 중인 기술 스택에 따라 달라지기 때문에 프로젝트 상황에 맞게 활용해야 합니다.
2) 애플리케이션 프로비저닝 자동화 (feat. GitOps)
GitOps 전략은 컨테이너 환경에서 DevOps 자동화를 구성하는 방법입니다. DevOps의 확장 모델인 GitOps는 인프라와 애플리케이션 배포를 위한 코드의 소스 제어를 통합해 애플리케이션의 전체 라이프 사이클을 관리합니다. 또한, 인프라와 애플리케이션 배포를 위한 코드를 하나의 Git repository(Git 버전 관리 시스템에서 코드를 저장하는 공간)에 저장하고 해당 repository를 통해 배포를 자동화합니다.
GitOps 전략을 사용하면 배포 프로세스를 간소화하고 더 일관성 있게 관리할 수 있는데요. 애플리케이션의 배포와 롤백을 쉽게 수행할 수 있는 것은 물론, 더 안정적인 배포까지 보장받을 수 있습니다.
GitOps 전략은 특히 Kubernetes(컨테이너 오케스트레이션 플랫폼)와 같은 Container Orchestration(컨테이너 배포, 관리, 확장을 자동화해 컴퓨팅 자원을 관리하고 조정) 툴과 함께 사용할 때 가장 효과적입니다. Kubernetes 클러스트의 구성과 애플리케이션 배포를 관리할 수 있고 일관성 있고 안정적인 배포를 보장할 수 있으며, 인프라와 애플리케이션 배포를 통합해 관리할 수 있습니다. 즉, 애플리케이션 자동화에서 GitOps 전략을 활용하면 더 효율적이고 안정적인 배포를 경험할 수 있습니다.
3) 모니터링
DevOps를 통해 모니터링도 자동화됩니다. DevOps를 적용하면 모니터링 시스템이 스스로 오류를 감지하고 자동으로 알림을 보내는데요. 이러한 도구 덕분에 서비스의 안정성은 점차 향상되고, 단계별로 목적에 맞는 테스트를 수행하며 빠르게 오류 대응이 이루어집니다. 자동화 테스트와 모니터링 솔루션의 종류는 다음과 같습니다.
자동화 테스트 종류
- Smoke Test: 주요 기능을 중심으로 내/외부 연동 기능의 정상 동작을 확인합니다.
- Health Check: 서비스 간의 연결 상태가 정상인지 확인합니다.
- Module Test: 단독으로 기능을 수행할 수 있는 단위 테스트, UI상의 모든 기능, Backend 모든 API를 테스트합니다.
- Unit Test: Class or Function 단위로 내부 로직을 검증합니다.
모니터링 솔루션 종류
- 클라우드 공급자 제공 모니터링 도구: Amazon CloudWatch, Google Cloud Monitoring, Microsoft Azure Monitor
- Third Party 모니터링 도구: NewRelic, Datadog, Splunk, AppDynamics
앞서 설명한 DevOps 자동화를 위한 방법을 통해 현재 프로젝트 성격에 맞는 소프트웨어 자동화 도구를 선택하는데요. 실제 업무에서는 고객의 다양한 니즈나 이해관계에 따라 구성이 됩니다. 시작은 기본 인프라 구축을 위한 클라우드 환경 구성에 있어 CI/CD 자동화 툴을 선택하고 빌드/배포의 체계를 구성합니다. DevOps는 GitOps를 포함해, 머신러닝 개발에 DevOps를 접목한 MLOps, 보안을 접목한 DevSecOps, Chat 기능을 접목한 ChatOps와 같은 다양한 개념으로 파생됐고, 각 프로젝트에서 적절한 방법을 이용합니다.
빌드/배포의 체계가 적용되면, 애플리케이션 구성을 위한 클라우드 환경인 랜딩존(LandingZone)을 인프라 파이프라인을 통해 관리하고 구성합니다. 이후 새로운 애플리케이션들은 애자일 적용을 통해 DevOps 구성을 바탕으로 빠른 서비스 출시와, 오픈 이후 지속적인 수시 배포로 시스템을 개선합니다.
DevOps적용 사례
하나의 시스템을 구축하더라도 Frontend, Backend, Batch, Integration 등 여러 가지 애플리케이션이 필요하며, 이를 위해선 다수의 DevOps 파이프라인을 만들어 사용해야 합니다. DevOps 파이프라인 중 Backend 애플리케이션 개발 시 구성했던 소프트웨어를 통해 자동화된 CI/CD 파이프라인 사례를 알아보겠습니다.
Backend 애플리케이션의 소스 관리는 쉽게 구성이 가능한 Gitlab을 통해 Git Repository를 제공하는데요. 이후 개발자들은 Git에 연결해 소스코드를 받거나 개발한 소스를 업로드할 수 있습니다. Gitlab의 Git Repository에는 Webhook(웹 애플리케이션 이벤트를 다른 애플리케이션으로 전달하는 기술) 기능을 포함하고 있어, 개발자가 변경한 소스코드가 올라왔을 때(Push) Webhook을 통해 CI/CD 파이프라인으로 자동으로 trigger 됩니다.
이렇게 trigger된 후 CI/CD 파이프라인에서 실행하는 아래 단계들을 차례대로 수행합니다. 그때 각 단계에서는 상태를 점검하고, 상태에 따라서 파이프라인을 계속 진행할 것인지, 멈출 것인지에 대한 조건을 넣어 자동화를 진행하는데요. 최종적으로 파이프라인이 끝나게 되면 실패 또는 성공에 대한 결과를 Slack Messenger를 통해 사용자에게 전달합니다.
각 단계별 수행하게 되는 작업은 아래와 같습니다.
• Source Checkout: Gitlab의 Git repository에서 애플리케이션의 소스 코드를 내려받습니다.
• Init: 빌드에 필요한 환경 변수들을 설정합니다.
• Static Anaylsis: Sonarqube Scan(코드 품질 검사용 오픈 소스 플랫폼)을 통해 코드의 정적 분석을 수행하고, Sonarqube Server에 결과를 Repoting 합니다. Sonarqube Server에 접속하면 분석 결과를 확인할 수 있습니다.
• Unit Test: JUnit(자바 단위 테스트 프레임워크)을 통해 단위 테스트를 수행합니다.
• Java Build: Gradle(빌드 자동화 도구)을 통해 Java 빌드를 수행합니다. 빌드 시 필요한 파일들은 외부의 Library Repository에서 다운로드합니다. 빌드 후에는 jar(Java Archive, 자바 클래스 파일, 리소스 및 메타데이터를 포함하는 압축 파일) 형태의 패키지 파일이 생성됩니다.
• Infra Provisioning: Terraform 코드를 실행해 AWS의 자원들을 생성합니다. Terraform은 IaC 도구로 인프라의 상태를 코드로 정의하고 생성할 수 있게 도와주는 도구입니다.
• Container Image Build: EKS(AWS의 Kubernetes 관리형 서비스) 기반의 컨테이너로 애플리케이션을 동작시키기 위해서 Java Build의 결과물을 포함해 컨테이너 이미지를 생성합니다. 생성된 이미지는 Image Repository에 저장합니다.
• EKS Deploy: EKS에 구성될 애플리케이션 자원들을 HelmChart(Kubernetes 애플리케이션 배포 패키지) 기반으로 정의해 Git Repository에 Push 합니다. ArgoCD는 Git의 변경사항을 체크해 변경된 부분을 EKS에 반영하며 자원들을 생성합니다.
• Health Check Test: EKS에 구성된 애플리케이션이 정상적으로 생성되고 실행되는지, URL의 HTTP Response Code를 확인합니다.
• Module Test: 애플리케이션의 기능들을 점검하는 단계로, API 단위로 input 값에 따라 output이 정상적으로 나오는지 확인합니다. Test를 위한 코드가 개발되어 있기 때문에 자동으로 테스트를 진행할 수 있습니다.
• Result Reporting: 파이프라인 실행 결과를 사용자에게 알려주기 위해서 Slack으로 결과 메시지를 발송합니다.
이렇게 구성된 파이프라인은 프로젝트 내 여러 애플리케이션에 있으며, 각 애플리케이션 안에서도 Branch 별로 구성된 CI/CD 파이프라인이 있습니다. 수많은 파이프라인들은 하루에도 몇 번씩 빌드를 수행합니다. 즉, 빌드의 성공/실패에 대한 관리뿐 아니라 변경 리드타임, 배포 빈도에 대해서도 모니터링은 필수입니다.
다음은 Grafana(데이터 시각화 및 모니터링 대시보드)와 Prometheus(오픈소스 모니터링 시스템)를 활용해 각 지표(metric)를 정의하고 수집해 Dashboard를 구성한 내용입니다. 아래의 이미지는 실제 프로젝트에서 적용된 Dashboard 화면인데요. 이는 DevOps의 중요한 4가지와 변경 리드타임, 배포 빈도 등을 관리하고 개선하는데 활용됐습니다.
최적의 DevOps 환경을 구성하기 위해서는 프로젝트 상황에 맞는 소프트웨어 도구와 조직, 그리고 기업의 관심과 노력이 매우 중요합니다. 소프트웨어를 통한 자동화된 DevOps 구축으로 빠르게 변화하는 비즈니스 환경에 성공적으로 대응하시기 바랍니다.
● LG CNS와 함께 클라우드가 제공하는 신기술을 100%로 활용해보세요!
글 ㅣ LG CNS 클라우드데브옵스개발팀 유치송 총괄, 임현수 선임