쿠버네티스는 클러스터 형태로 도커 컨테이너를 관리하는 오픈 소스 플랫폼입니다. 쿠버네티스는 컨테이너의 자동 배포 및 확장뿐만 아니라, 실패한 컨테이너를 자동으로 재시작하고 호스트가 죽으면 재배치하는 기능을 제공합니다. 이러한 기능은 애플리케이션의 가용성을 향상시킵니다.
쿠버네티스는 컨테이너 배포, 확장, 축소 및 로드 밸런싱을 자동화하는 오픈 소스 컨테이너 관리 도구입니다. Golang으로 작성되었으며, 처음에는 구글에서 개발한 CNCF에 기증되어 큰 커뮤니티를 형성하고 있습니다. 쿠버네티스는 많은 수의 컨테이너를 하나의 논리적 단위로 그룹화하여 쉽게 관리하고 배포할 수 있게 합니다.
쿠버네티스의 장점
- 자동화된 배포 및 관리: 쿠버네티스를 사용하여 애플리케이션을 배포하면 수동 개입이 필요 없으며, 쿠버네티스가 배포, 확장 및 컨테이너화된 애플리케이션을 자동으로 처리합니다. 이는 사람에 의한 오류를 줄여 배포를 더욱 효과적으로 만듭니다.
- 확장성: 쿠버네티스는 들어오는 트래픽에 따라 애플리케이션 컨테이너를 자동으로 수평 확장합니다.
- 고가용성, 비용 효율성, 개발자의 생상선 향상도 있습니다.
쿠버네티스를 사용한 컨테이너화된 애플리케이션 배포 및 관리
- 쿠버네티스 설치 및 클러스터 설정
- 최소한 하나의 마스터 노드와 두 개의 워커 노드가 있어야 합니다. 클라우드에서 쿠버네티스 서비스를 제공하는 곳에 클러스터를 설정할 수 있습니다.
- 배포 매니페스트 파일 생성
- 매니페스트 파일에 필요한 포드 수, 컨테이너 이밎, 필요한 리소스를 지정할 수 있습니다.
- 매니페스트 파일을 작성한 후 kubectl 명령을 사용하여 적용합니다.
- 서비스 노출
- 외부에 서비스를 노출하려면 서비스 유형, 포트, 셀럭터를 포함한 매니페스트 파일을 작성해야 합니다.
다른 컨테이너 오케스트레이션 플랫폼과의 비교
특징 | kubernetes | docker swarm | openshift | nomad |
배포 | 'kubectl' CLI로 배포 | docker compose로 배포 | 매니페스트 또는 CLI로 배포 | HCL 파일로 배포 |
확장성 | 고효율 확장 지원 | 쿠버네티스만큼 효율적이지 않음 | 쿠버네티스만큼 효율적이지 않음 | 쿠버네티스만큼 효율적이지 않음 |
네트워킹 | 다양한 플러그인 사용 | 간단한 사용 | 매우 고급 네트워킹 모델 | 다양한 플러그인 사용 |
스토리지 | 다양한 스토리지 지원 | 로컬 스토리지 사용 | 로컬 및 클라우드 스토리지 지원 | 로컬 및 클라우드 스토리지 지원 |
쿠버네티스의 특징
- 자동 스케줄링: 리소스 최적화를 위해 클러스트 노드에 컨테이너를 배포하는 고급 스케줄러 제공
- 셀프 힐링: 죽은 컨테이너를 재배치, 재시작
- 자동 롤아웃 및 롤백: 컨테이너화된 애플리케이션의 원하는 상태에 대한 롤아웃 및 롤백 지원
- 수평 확장 및 로드 밸런싱: 필요에 따라 애플리케이션을 확장 또는 축소
- 리소스 활용: 리소스 사용 모니터링 및 최적화를 통해 컨테이너가 효율적으로 리소스를 사용하도록 보장
- 멀티 클라우드 및 하이브리드 클라우드 지원: 다양한 클라우드 플랫폼에서 컨테이너화된 애플리케이션을 실행
- 확장성: 커스텀 플러그인 및 컨트롤러로 확장 가능
- 커뮤니티 지원: 활발한 커뮤니티로 자주 업데이트, 버그 수정 및 새로운 기능 추가
kubernetes vs docker swarm
특징 | docker swarm | kubernetes |
개발사 | docker inc | google개발, 현재 cncf 관리 |
자동 확장 | 지원하지 않음 | 자동 확장 지원 |
자동 로드 밸런싱 | 지원 | 수동 로드 밸런싱 설정 필요 |
롤링업데이트 | 바로 컨테이너에 적용 | 포드 전체에 롤링 업데이트 수행 |
스토리지 공유 | 다른 컨테이너와 공유 | 동일 포드 내 여러 컨테이너 간 공유 |
로깅 및 모니터링 | ELK와 같은 3rd 파티 도구 사용 | 내장 도구 사용 |
쿠버네티스의 아키텍처
쿠버네티스는 클라이언트-서버 아키텍처를 따르며, 마스터는 한 대의 머신에 설치되고 노드는 별도의 리눅스 머신에 설치됩니다. 마스터-슬레이브 모델을 사용하여, 마스터는 여러 쿠버네티스 노드에 걸쳐있는 도커 컨테이너를 관리합니다. 마스터와 워커 노드는 쿠버네티스 클러스터를 구성합니다. 개발자는 쿠버네티스 마스터의 도움을 받아 도커 컨테이너에 애플리케이션을 배포할 수 있습니다.
쿠버네티스의 주요 구성 요소
- 마스터 노드 구성 요소
- 쿠버네티스 마스터는 클러스터 전체를 관리하고 클러스터 내의 모든 활동을 조정하며, 워커 노드와 통신하여 쿠버네티스 및 애플리케이션을 유지합니다. 마스터 노드는 모든 관리 작업의 진입점입니다.
- API 서버: 클러스터를 제어하는 모든 REST 명령의 진입점입니다. 모든 관리 작업은 마스터 노드 내의 API 서버에서 수행됩니다. 쿠버네티스 객체를 생성, 삭제, 업데이트 또는 표시하려면 API 서버를 거쳐야 합니다. API 서버는 포트, 서비스, 복제본, 컨트롤러, 배포 등 API 객체를 검증하고 구성하며, 모든 작업에 대해 API를 노출하는 역할을 합니다. kubectl이라는 도구를 사용하여 이 API와 상호 작용할 수 있습니다. kubectl은 고 언어로 작성된 아주 작은 바이너리로 명령줄에서 실행하는 모든 작업을 수행하기 위해 API 서버와 통신합니다. 이것은 쿠버네티스 클러스터에 대한 명령을 실행하기 위한 명령줄 인터페이스입니다.
- 스케줄러: 작업 부하를 분산하는 마스터의 서비스입니다. 각 워커 노드의 작업 부하 활용도를 추적하고, 사용 가능한 리소스에 작업 부하를 할당합니다. 스케줄러는 구성 파일에 명시된 제약 조건에 따라 사용 가능한 노드에 파드를 스케줄링합니다. 스케줄러는 작업 부하 활용도와 새로운 노드에 파드를 할당하는 역할을 담당합니다.
- 컨트롤러 매니저: 무한루프에서 실행되는 데몬으로 API 서버에 정보를 수집하고 전송하는 역할을 합니다. 컨트롤러는 네임스페이스 생성 및 수명 주기 이벤트 가비지 컬렉션, 종료된 파드 가비지 컬렉션, 노드 가비지 컬렉션 등을 수행하며 쿠버네티스 클러스터를 조정합니다. 기본적으로 컨트롤러는 클러스터의 원하는 상태를 감시하며, 현재 상태가 원하는 상태와 일치하지 않으면 제어 루프가 수정 조치를 취하여 현재 상태를 원하는 상태로 맞춥니다. 주요 컨트롤러는 복제, 엔드포인트, 네임스페이스, 서비스 계정 등이 있습니다. 이와 같이 컨트롤러는 스펙 파일에 명시된 대로 올바른 파드가 실행되도록 하여 클러스터 전체의 상태를 유지합니다.
- etc: 분산 키-값 경량 데이터베이스입니다. 쿠버네티스에서는 현재 클러스터 상태를 저장하는 중앙 데이터베이스로 사용되며, 서브넷, 구성 맵 등의 구성 세부 정보를 저장하는 데에도 사용됩니다.
- 워커 노드 구성 요소
- 워커 노드는 컨테이너 간 네트워킹을 관리하고, 마스터 노드와 통신하며, 스케줄링된 컨테이너에 리소스를 할당하는 데 필요한 모든 서비스를 포함합니다.
- Kubelet: 각 워커 노드 내에서 실행되며 마스터 노드와 통신하는 주요 노드 에이전트입니다. kubelet은 api 서버를 통해 파드 사양을 받아 연관된 컨테이너를 실행하고, 파트 내 컨테이너가 실행 중인지 확인합니다. kubelet이 워커 노드에서 실행 중인 파드에 문제가 있음을 감지하면 해당 파드를 동일한 노드에서 다시 시작하려고 합니다. 워커 노드 자체에 문제가 있는 경우 쿠버네티스 마스터 노드는 노드 실패를 감지하고 다른 노드에서 파드를 재생성합니다.
- kube-proxy: 쿠버네티스 클러스터 내 핵심 네트워킹 구성 요소입니다. 전체 네트워크 구성을 유지하고, 모든 노드, 파드, 컨테이너 간의 분산 네트워크를 유지하며, 외부로 서비스를 노출합니다. kube-proxy는 단일 워커 노드에서 서비스에 대한 네트워크 프록시 및 로드 밸런서 역할을 하며, TCP 및 UDP 패킷에 대한 네트워크 라우팅을 관리합니다. kube-proxy는 각 서비스 엔드포인트 생성 및 삭제에 대한 api 서버를 수신하여 각 서비스 엔드포인트에 도달할 수 있도록 경로를 설정합니다.
- 파드: 파드는 동일한 호스트에 함께 배포되는 컨테이너 그룹입니다. 파드를 통해 여러 종속 컨테이너를 함께 배포할 수 있으며, 이러한 컨테이너를 관리하기 위해 주로 파드를 통해 상호 작용할 수 있습니다.
- 도커: 도커는 애플리케이션과 모든 종속성을 컨테이너 형태로 패키징하여 개발, 테스트, 프로덕션 환경에서 원활하게 애플리케이션이 작동하도록 하는 컨테이너화 플랫폼입니다. 도커는 컨테이너를 사용하여 애플리케이션을 쉽게 생성, 배포 및 실행할 수 있도록 설계된 도구입니다.
쿠버네티스의 응용
- 마이크로서비스 아키텍처: 쿠버네티스는 복잡한 애플리케이션을 독립적으로 배포하고 관리할 수 있는 더 작은 모듈형 구성 요소로 분할하는 마이크로서비스 아키텍처를 관리하는 데 적합합니다.
- 클라우드 네이티브 개발: 쿠버네티스는 클라우드 인프라에서 실행되도록 설계되고 클라우드의 확장성, 유연성 및 복원력을 활용하는 애플리케이션을 구축하는 클라우드 네이티브 개발의 핵심 구성 요소입니다.
- 지속적 통합 및 배포: 쿠버네티스는 CI/CD 파이프라인과 잘 통합되어 배포 프로세스를 자동화하고 애플리케이션의 새 버전을 최소한의 다운타임으로 롤아웃할 수 있습니다.
- 쿠버네티스 배포에서 현재 버전에 버그가 발견되면 이전 버전으로 되돌릴 수 있습니다.
'Kubernetes(K8S)' 카테고리의 다른 글
[K8S] 쿠버네티스 아키텍처 (0) | 2024.06.21 |
---|