본문 바로가기
리눅스 강의

리눅스 서버 컨테이너 관리의 정석: 쿠버네티스 vs 도커 스웜

by infolily 2024. 10. 21.

리눅스 서버에서 여러 컨테이너를 효율적으로 관리하고 싶으세요? 컨테이너 오케스트레이션은 복잡한 컨테이너 환경을 자동화하고 관리하기 위한 필수적인 기술이 되었어요. 특히, 리눅스 서버에서 컨테이너를 운영할 때는 쿠버네티스(Kubernetes)와 도커 스웜(Docker Swarm)이라는 두 가지 강력한 도구를 활용할 수 있어요. 이 글에서는 두 도구의 특징과 장단점을 비교 분석하고, 리눅스 서버 환경에서 어떤 도구를 선택해야 할지 고민하는 분들에게 도움을 드리고자 해요.

 


도커 스웜: Docker의 내장 오케스트레이션 솔루션

Docker Swarm은 Docker 엔진 자체에 내장된 오케스트레이션 도구에요. 즉, Docker를 이미 사용하고 있다면 추가적인 설치 없이도 Swarm을 활용하여 여러 Docker 엔진을 하나의 클러스터로 묶고, 마치 하나의 거대한 가상 서버처럼 운영할 수 있다는 거죠. 덕분에 컨테이너 관리가 한결 수월해지고, 복잡한 설정 없이도 쉽게 시작할 수 있다는 장점이 있어요.

 


도커 스웜의 핵심 기능 살펴보기

도커 스웜의 핵심 기능을 좀 더 자세히 알아볼까요? 먼저, 노드 구성부터 살펴보면, Swarm은 크게 매니저 노드(Manager Node)와 워커 노드(Worker Node)로 구성되어 있어요. 매니저 노드는 클러스터를 총괄적으로 관리하고, 워커 노드는 실제 컨테이너를 실행하는 역할을 수행하죠.  클러스터 관리를 위한 핵심적인 역할을 수행하는 매니저 노드는 클러스터의 컨테이너 배포, 스케줄링, 네트워크 관리 등을 책임져요. 워커 노드는 매니저 노드의 지시에 따라 컨테이너를 실행하고, 컨테이너의 상태를 매니저 노드에 보고하는 역할을 담당하죠.

 

다음으로, 서비스 배포 기능을 살펴볼게요. 매니저 노드에서  명령어를 사용하면 컨테이너 기반 서비스를 손쉽게 배포할 수 있어요.  게다가,  옵션을 통해 서비스를 복제하여 여러 컨테이너 인스턴스를 생성하고, 고가용성을 확보할 수도 있고요. 예를 들어,  명령어를 사용하면 nginx 웹 서버를 3개의 레플리카로 배포하여 안정적인 서비스를 제공할 수 있어요. 서비스를 복제하면 컨테이너 중 하나가 장애가 발생하더라도 다른 컨테이너가 자동으로 서비스를 대신 처리하여, 서비스 중단 없이 계속해서 운영이 가능해지죠.

 

마지막으로, 자동 복구 기능은 도커 스웜의 매력적인 기능 중 하나에요. 만약 서비스가 예상치 못한 오류로 중단되면, Swarm은 자동으로 새로운 컨테이너 인스턴스를 생성하여 서비스를 복구해요. 이렇게 자동 복구 기능을 통해 서비스의 가용성을 높이고, 시스템의 안정성을 확보할 수 있죠. 설정된 레플리카 수보다 컨테이너가 부족하면, 부족한 만큼의 새로운 컨테이너를 생성하여, 항상 원하는 수의 컨테이너가 동작하도록 유지해줘요.

 


쿠버네티스: 컨테이너 오케스트레이션의 대표 주자

쿠버네티스는 Google에서 개발한 오픈소스 컨테이너 오케스트레이션 도구에요. 뛰어난 확장성과 유연성을 바탕으로 대규모 애플리케이션을 효과적으로 관리하고 싶을 때 주로 사용되죠.  쿠버네티스는 도커 스웜보다 다소 복잡한 구조를 가지고 있어요. 하지만 그만큼 다양하고 강력한 기능들을 제공하기 때문에, 복잡한 애플리케이션을 운영하는 데에 더욱 적합하다고 할 수 있어요.

 


쿠버네티스의 핵심 기능 살펴보기

쿠버네티스의 핵심 기능 중 하나는 복잡한 애플리케이션 배포 관리 기능이에요. 롤링 업데이트, 블루-그린 배포 등 다양한 배포 전략을 지원하여 복잡한 애플리케이션을 안정적으로 배포하고 관리할 수 있죠.  서비스를 업데이트할 때, 롤링 업데이트를 활용하면 기존 컨테이너를 새로운 버전의 컨테이너로 순차적으로 교체하여 서비스 중단 없이 업데이트를 진행할 수 있어요. 블루-그린 배포는 새로운 버전의 컨테이너를 별도의 환경에 배포한 후, 검증을 거쳐 기존 환경으로 전환하는 방식이에요. 이러한 다양한 배포 전략을 통해, 서비스의 안정성을 확보하면서, 동시에 새로운 기능을 빠르게 적용할 수 있죠.

 

또 다른 핵심 기능으로 자동 스케일링 기능을 꼽을 수 있어요. 쿠버네티스는 애플리케이션의 트래픽 변화를 자동으로 감지하고, 필요에 따라 컨테이너의 수를 늘리거나 줄여서 시스템 자원을 효율적으로 관리해요.  서비스에 대한 트래픽이 늘어나면, 쿠버네티스는 자동으로 컨테이너를 추가 생성하여 트래픽을 분산시키고, 서비스 성능 저하를 방지하죠. 반대로 트래픽이 줄어들면, 불필요한 컨테이너를 제거하여 시스템 자원 낭비를 줄일 수 있고요.

 

마지막으로, 서비스 디스커버리 및 로드 밸런싱 기능을 통해 클러스터 내에서 서비스 간의 통신을 쉽게 관리하고, 로드 밸런싱 기능을 제공해요. 쿠버네티스는 서비스 디스커버리를 통해 클러스터 내의 각 서비스의 위치를 자동으로 관리하고, 서비스 간의 통신을 간편하게 할 수 있도록 지원해요. 또한, 로드 밸런싱 기능을 통해 들어오는 트래픽을 여러 컨테이너에 분산시켜 서비스의 성능과 안정성을 향상시키죠.

 


도커 스웜과 쿠버네티스의 비교: 어떤 도구를 선택해야 할까요?

어떤 오케스트레이션 도구를 선택해야 할지 고민이시라면, 두 도구의 특징을 비교해 보면서 자신에게 맞는 도구를 선택하는 게 좋아요.

 

설치 및 설정 간편 복잡
학습 곡선 낮음 높음
자동 복구 지원 지원
스케일링 수동 및 자동 가능 자동 스케일링 지원
커뮤니티 지원 제한적 활발

특성 Docker Swarm Kubernetes

 

위의 표에서 보시다시피, Docker Swarm은 설치 및 설정이 간편하고, 학습 곡선이 낮아서 초보자도 쉽게 사용할 수 있어요.  특히, Docker를 이미 사용하고 있는 경우라면, 별도의 설정 없이 바로 Swarm 모드를 활성화하여 사용할 수 있기 때문에 더욱 매력적이죠. 반면, Kubernetes는 설치 및 설정이 복잡하고, 학습 곡선이 높아서 초보자에게는 다소 어려울 수 있어요. 하지만, 자동 스케일링 기능과 활발한 커뮤니티 지원 등 더욱 다양하고 강력한 기능들을 제공하기 때문에, 복잡한 애플리케이션이나 대규모 환경에서 더욱 빛을 발휘해요.

 

결론적으로, 간단한 컨테이너 관리나 빠른 설정이 필요한 경우에는 Docker Swarm이 더 나은 선택이 될 수 있어요. 특히, 소규모 서비스나 테스트 환경에 적합하죠. 하지만, 복잡한 애플리케이션을 운영하거나, 대규모 환경에서 뛰어난 확장성과 유연성을 필요로 한다면 Kubernetes를 선택하는 것이 좋을 거예요.

 


투자 플랫폼 테스트 서버 재구축: Docker Swarm 활용 사례

저는 최근에 개발 중인 투자 플랫폼의 테스트 서버를 재구축하면서 Docker Swarm을 도입했어요. 기존에는 단일 서버에서 Docker Compose를 사용하여 서비스를 운영했는데, 서버 자원이 부족하고, 서비스 안정성이 떨어지는 문제점이 있었죠.  투자자들에게 서비스 개발 현황을 보여주고, 안정적인 환경에서 개발을 진행해야 할 필요성이 생겼어요.

 


기존 테스트 서버의 문제점

기존 테스트 서버는 다음과 같은 문제점을 가지고 있었어요.

 

  • 단일 서버: 서버가 하나뿐이라서, 서버에 문제가 발생하면 모든 서비스가 중단될 위험이 있었어요.
  • 자동 복구 기능 부재: 서비스 중 하나가 오류로 중단되더라도, 자동으로 재시작되지 않아 서비스 장애 시간이 길어질 수 있었어요.
  • 로그 관리 부재: 에러 로그를 수집하는 시스템이 없어서 문제 발생 시 원인 분석이 어려웠어요.
  • 에러 알림 기능 부재: 에러가 발생해도 알림 기능이 없어서, 문제를 빠르게 파악하고 대응하기 어려웠어요.

Docker Swarm 도입을 통한 문제 해결

이러한 문제점을 해결하기 위해 Docker Swarm을 도입했어요. Docker Swarm을 사용하면 여러 서버를 하나의 클러스터로 묶어서 관리할 수 있고, 레플리카 기능을 통해 서비스를 복제하여 고가용성을 확보할 수 있거든요.

 

  • 다중 서버 구성: 2대의 서버를 운영하여, 하나의 서버에 문제가 발생하더라도 다른 서버에서 서비스를 계속 제공할 수 있도록 했어요.
  • 자동 복구 기능 활용: 레플리카 기능을 통해 서비스를 복제하여, 서비스가 중단되면 자동으로 다른 서버에서 새로운 컨테이너 인스턴스를 생성하여 서비스를 복구하도록 했어요.
  • 로그 관리 시스템 구축: 추후 로그 관리 시스템을 구축하여, 에러 발생 시 빠르게 원인을 파악하고 문제를 해결할 수 있도록 계획하고 있어요.
  • 에러 알림 기능 도입: 에러 발생 시 알림을 받을 수 있도록 모니터링 시스템을 도입할 예정이에요.

재구축된 테스트 서버 예상 구성


재구축된 테스트 서버는 다음과 같은 구조로 운영될 예정이에요.

 

  • Jenkins에서 배포 버튼을 누르면, Git 저장소에서 소스 코드를 가져와요.
  • Nexus에서 필요한 라이브러리를 다운로드 받아서 Maven 빌드를 진행해요.
  • 빌드된 결과물(jar 파일)을 마스터 테스트 서버로 전송하고, Dockerfile을 기반으로 Docker 이미지를 생성해요.
  • 생성된 Docker 이미지를 Nexus Docker Hub에 업로드해요.
  • 업로드된 이미지를 각 서버에 전달하고, 서비스를 업데이트해요.

Docker Hub 구축 및 설정

Docker Swarm을 활용하여 여러 서버에 서비스를 배포하려면, 모든 서버에서 접근 가능한 Docker Registry가 필요해요. 저는 기존 Nexus에 Docker Hub 기능을 추가하려고 했지만, 포트 충돌 문제로 새롭게 Docker Hub를 구축하게 되었어요.

 

Nexus에 Docker Hub를 추가하기 위해서는 기존 포트 외에 Docker Hub 전용 포트를 하나 더 열어야 했어요. 저는 5000번 포트를 사용했고요. 그리고, 두 가지 Repositories를 생성했어요.

 

  • Hosted Repository: 사내에서 사용할 Docker 이미지를 저장하는 저장소에요. Hosted Repository의 이름은 자유롭게 설정할 수 있고, HTTP 영역에 5000번 포트를 입력해주고, Enable Docker V1 API를 체크해주면 돼요.
  • Proxy Repository: Docker Hub를 프록시하여 외부 이미지를 가져오는 저장소에요. Proxy Repository의 이름도 자유롭게 설정하고, Enable Docker V1 API를 체크해준 뒤, Remote Storage에 를 입력하고, Docker Index: Use Docker Hub 옵션을 체크하면 돼요.

마지막으로, Docker 클라이언트와 서버에서 Docker Hub에 접근할 수 있도록 설정했어요.

 

  • Docker 클라이언트 설정: Windows라면 도커 아이콘을 마우스 오른쪽 버튼으로 클릭해서 Settings > Docker Engine > "insecure-registries"에 Nexus 주소와 포트()를 추가해주면 돼요. Mac이라면 Preferences > Docker Engine > "insecure-registries"에 Nexus 주소와 포트를 추가하면 되고요. 설정을 변경하면 도커가 재시작되고,  명령어를 입력하면 로그인이 가능해져요.
  • Docker 서버 설정:   파일을 열어서 "insecure-registries"에 Nexus 주소와 포트를 추가하고, Docker 데몬을 재시작하면 돼요.

마무리

리눅스 서버에서 컨테이너 오케스트레이션은 쿠버네티스와 도커 스웜을 통해 더욱 효율적으로 관리할 수 있어요. 각 도구는 장단점을 가지고 있기 때문에, 자신이 운영하는 환경과 애플리케이션의 특성에 맞춰 적절한 도구를 선택하는 것이 중요해요. 이 글이 여러분의 선택에 도움이 되었기를 바라며, 앞으로도 컨테이너 오케스트레이션에 대한 꾸준한 학습과 탐구를 통해 더욱 발전된 시스템을 구축할 수 있기를 응원합니다!

 

자주 묻는 질문 (FAQ)

Q1. 도커 스웜과 쿠버네티스 중 어떤 것을 선택해야 하나요?

 

A1. 도커 스웜은 간단한 컨테이너 관리나 빠른 설정이 필요할 때 유용하고, 쿠버네티스는 복잡한 애플리케이션이나 대규모 환경에 적합해요. 서비스 규모, 복잡도, 확장성 등을 고려하여 자신에게 맞는 도구를 선택하는 것이 중요해요.

 

Q2. Docker Swarm에서 서비스를 복제하는 이유는 무엇인가요?

 

A2. Docker Swarm에서 서비스를 복제하면, 하나의 서비스가 여러 서버에 걸쳐 실행되어, 하나의 서버에 장애가 발생하더라도 다른 서버에서 서비스를 계속 제공할 수 있기 때문에, 서비스의 가용성을 높일 수 있어요.

 

Q3. Docker Hub는 왜 필요한가요?

 

A3. Docker Hub는 여러 서버에서 사용할 Docker 이미지를 저장하고 공유하는 데 필요해요. Docker Swarm을 사용하여 여러 서버에 서비스를 배포할 때, 모든 서버에서 접근 가능한 Docker Registry가 필요하기 때문에 Docker Hub를 구축하고 설정해야 해요.

 

키워드 리눅스,컨테이너,Docker,Swarm,쿠버네티스,Kubernetes,오케스트레이션,컨테이너오케스트레이션,클러스터,서버관리,자동화,고가용성,레플리카,DockerHub,Nexus,젠킨스,Maven,투자플랫폼,테스트서버,재구축,배포,스케일아웃,마이크로서비스,서비스디스커버리,로드밸런싱,DevOps,LinuxServer,ContainerOrchestration,Microservices,Scalability,Availability,FaultTolerance,AutomatedDeployment,CloudNative,SwarmMode,ManagerNode,WorkerNode,ServiceDiscovery,LoadBalancing,CI_CD,IT인프라,클라우드,Cloud