CI/CD, Docker, Kubernetes가 뭔데?
1. CI/CD가 도대체 뭔데?
제가 작년에 개념들을 공부하면서 가장 추상적인 개념이었던 CI/CD에 대해 작성해볼까 합니다.
CI/CD.. 말은 지속적 통합, 지속적 개발이라고 하지만, 개발을 이제 막 공부하시는 분들은 '이게 무슨 소리야?'라고 생각하실 겁니다.
제가 간단하게 말씀드리면!
CI/CD 도구가 깃(Git) 저장소의 변경사항을 기반으로 코드를 자동으로 빌드(Build), 테스트(Test), 배포(Deploy)하는 과정입니다!
여러분들은 두 가지 경험만 있으면 이 원리를 쉽게 이해할 수 있습니다.
깃허브(GitHub)에 Push를 해본 경험이 있으신가요?
프로젝트를 서버에 배포해본 적 있으신가요?
이 두 가지 경험이 있다면, CI/CD 개념은 어렵지 않습니다. 간단히 말하면, 메인 브랜치(Main Branch)에 Push하면, CI/CD 도구가 알아서 테스트(테스트 코드가 존재할 때), 머지(Merge), 배포까지 자동으로 해주는 프로세스입니다.
즉, 개발자는 Main 브랜치로 Push만 하면 자동으로 변경 사항이 배포까지 이어집니다.
그렇다면 CI/CD를 왜 사용할까요?
여러분의 서비스가 매초마다 수익이 발생한다고 가정해봅시다. 중단 배포를 하게 되면 서버가 다시 실행될 때까지 서비스가 멈추고, 그 시간만큼 손해가 발생합니다. 만약 중단 없이 배포할 수 있다면? 서비스는 계속 제공되면서 새로운 버전으로의 업데이트도 가능하겠죠. 이러한 이유로 CI/CD는 무중단 배포를 목적으로 사용됩니다.
2. Docker는 뭔데?
사실 저도 Docker Desktop으로 이미지 생성해서 컨테이너를 실행해본 경험밖에 없어서 아직 서비스에서 Docker를 제대로 활용한 경험은 없습니다.
그런 규모 있는 서비스에 대한 경험은 아직 없거든요.
하지만 저에게 Docker가 무엇이냐고 물어본다면, 여러분들이 개발을 하면서 개인 컴퓨터로 열심히 개발을 하시겠죠? JDK 11도 깔고, DB도 깔고 필요한 소프트웨어들을 다 설치했는데, 서버의 환경이 다를 수 있습니다.
만약 서버의 JDK 버전이 8이고 다른 프로젝트가 이미 실행 중이라면?
큰 문제가 발생할 수 있습니다.
이러한 문제를 해결하기 위해 Docker가 필요합니다.
Docker는 컨테이너 기술을 이용한 플랫폼으로, 애플리케이션과 그 실행 환경을 그대로 패키징해서 어디서든 동일한 환경에서 실행할 수 있도록 해줍니다.
쉽게 말해, 해외 직구할 때 사용하는 컨테이너처럼 생각하면 됩니다. 컨테이너에 담긴 상품은 외부 환경과 관계없이 안전하게 운송되는 것처럼, Docker 컨테이너는 개발 환경을 그대로 패키징하여 어디서든 동일한 환경을 제공합니다.
기술적으로 설명하자면, 개발 환경(JDK 버전, DB 등)을 Dockerfile이라는 파일에 기록하고, 이를 바탕으로 Docker 이미지(Image)를 만들어 실행합니다. 이 이미지를 사용하면 어느 서버에서든 동일한 환경에서 실행할 수 있습니다.
또한 저도 헷갈렸던 개념인데 Docker는 VM(가상 머신)과 비슷하지만 완전히 다른 기술입니다.
VM: 하드웨어 단위에서 격리하여 리소스를 나누는 방식 (보안 강함, 독립성 강함, 실행 느림, 확장 제한적)
Docker: 호스트 OS의 리소스를 공유하며 OS 단위에서 가상화 (보안 중간, 독립성 중간, 실행 빠름, 확장성 우수)
저는 Docker를 공부하기 전에 친구들과 개발 관련 이야기를 하던 중 CI/CD의 무중단 배포 딜레이를 거의 0으로 만들기 위해 Docker를 사용한다는 이야기를 들었었는데, 그땐 이해가 잘 안 갔지만 이후에 공부하면서 그 이유를 명확히 알게 되었습니다.
CI/CD는 쉽게 말해서 깃에 Push하고 그 기반으로 소스코드가 다시 빌드되어 배포되는 무중단 배포입니다.
하지만 결국에는 컴파일하는 시간적 단차는 존재할 것이고, 그 시간은 배포 이후에 지연 시간에 해당하겠죠.
이때 Docker를 도입하면?
Docker는 기본적으로 변경이 없는 것들은 이미지 캐싱을 합니다. JDK든 DB든 그 안에 조금 더 세부적인 내용이든 변경이 없는 것들은 다시 컴파일하지 않고, 변경 사항만을 다시 컴파일합니다.
이러한 이미지 캐싱이 그 단차를 확연하게 줄여줄 수 있기 때문에 Docker는 CI/CD와 함께 사용하면 무중단 배포 성능을 극대화할 수 있습니다.
CI/CD + Docker = 무중단 배포의 완성
3. Kubernetes는 뭔데?
마지막으로 Kubernetes는 무엇일까요?
솔직히 저도 아직 Kubernetes에 대한 실제 사용 경험이 없어 개념적으로만 알고 있지만 쉽게 설명해보겠습니다.
여러분, 오케스트라를 아시죠? 바이올린, 첼로, 트럼펫 등 다양한 악기가 멋지게 어우러져 음악을 만듭니다. 그 오케스트라를 지휘하는 사람을 지휘자라고 하죠? 바로 그 지휘자가 Kubernetes입니다!
Kubernetes는 여러 개의 컨테이너를 효율적으로 관리하는 "컨테이너 오케스트레이션 플랫폼"입니다.
Kubernetes의 주요 기능은 다음과 같습니다.
Self Healing: 특정 컨테이너가 과부화되거나 다운되면 자동으로 재실행하여 복구합니다.
트래픽 분산: 한 컨테이너에 트래픽이 몰릴 경우 다른 컨테이너로 자동으로 분산해줍니다.
Self Healing은 게임에서 힐러처럼, 다운된 컨테이너를 다시 살려내는 역할을 하고, 트래픽 분산은 과부하를 방지하기 위해 트래픽을 나누어주는 역할(Scale 관리)을 합니다.
실제로 써보면서 구체적인 것들을 알게 되겠죠.
AWS에도 Kubernetes 전용 서비스가 있을 정도로 클라우드 서비스의 깊이는 정말 끝이 없습니다.
제가 작성한 포스팅은 절대적인 정답이 아니라, 공부한 내용을 정리하면서 이제 막 개발을 시작하시는 분들이 쉽게 접근할 수 있도록 가볍게 작성한 글입니다.
오늘은 CI/CD → Docker → Kubernetes로 이어지는 흐름에 대해 알아봤습니다!