쿠버네티스란?
- 쿠버네티스는 컨테이너화된 애플리케이션을 관리하고 배포하기 위한 오픈소스 툴입니다.
- 쿠버네티스를 사용하면 애플리케이션의 상태를 관리하고, 자동 배포, 스케일링, 로드 밸런싱, 복구, 모니터링 등 다양한 기능을 수행할 수 있습니다.
- 확장성과 가용성이 높아 대규모 컨테이너 기반 애플리케이션을 관리하기에 적합합니다.
- 쿠버네티스는 다양한 클라우드 환경에서 동작할 수 있도록 설계되어 있어 클라우드 네이티브 애플리케이션 개발 및 운영에 유용합니다.
왜 사용할까?
- 쿠버네티스는 컨테이너화된 애플리케이션의 배포와 관리를 단순화해 줍니다.
- 컨테이너화된 애플리케이션을 자동화된 방식으로 배포하고, 확장하고, 컨테이너가 실패할 경우 모니터링하는 방법과 컨테이너를 교체하는 방법을 정의할 수 있고 관리할 수 있습니다.
- 쿠버네티스는 클라우드 네이티브 애플리케이션(클라우드 환경에서 구축, 운영 및 확장 가능)을 구축할 수 있는 기반 기술입니다.
- 쿠버네티스는 클라우드 환경(자원의 유연한 확장성과 높은 가용성, 안정성 등 제공)의 특징을 최대한 활용하여 애플리케이션의 확장성과 가용상, 안정성 등을 보장받는 기술입니다. 즉, 쿠버네티스를 이용하면 클라우드 네이티브 애플리케이션을 안정적으로 구축할 수 있습니다.
수동 배포의 문제점
- 컨테이너를 수동으로 배포할 경우 컨테이너화된 애플리케이션 내부에 문제가 발생하면 컨테이너가 충돌이 발생할 때마다 수동으로 모니터링해야 하며, 수동으로 컨테이너를 다시 시작해야 합니다.(새 컨테이너로 교체)
- 트래픽이 증가하거나 감소함에 따라 실행 중인 인스턴스의 수를 늘리거나 줄여야 합니다.
쿠버네티스 아키텍처와 핵심 개념
쿠버네티스는 마스터 노드와 워커 노드로 구성되며, 마스터 노드는 클러스터 전반의 제어와 관리를 담당하고 워커 노드는 애플리케이션의 실행과 관리를 담당합니다.
Pod
- 하나 이상의 컨테이너를 갖는 가장 작은 배포 단위입니다. 단순히 컨테이너를 보유합니다.
- Pod는 워커노드에서 자신을 실행합니다.
- 워커노드는 특정양의 cpu와 메모리가 있는 머신으로 Pod를 실행할 수 있습니다.
- 각 워커노드에 다수의 파드가 실행될 수 있습니다.
Kube-proxy
- 쿠버네티스에서 워커노드에는 다수의 파드가 실행될 수 있는데 Pod는 내부 IP 주소를 가지며, 다른 Pod 또는 외부로 직접 통신할 수 없기 때문에 각 파드간의 통신이나 외부와의 통신 등을 위해 프록시가 필요합니다.
- 쿠버네티스의 프록시 기능을 사용하여 파드간의 통신, 로드 벨런싱, 서비스 등을 수행합니다.
마스터 노드
마스터 노드는 클러스터 전체를 관리하고 조정하는 역할을 합니다.
마스터 노드는 API 서버, etcd, 스케줄러, 컨트롤러 매니저 등의 컴포넌트로 구성되어 있습니다.
- API 서버: API서버로 워커노드와 통신합니다. 쿠버네티스 클러스터 내에서 모든 컴포넌트 간의 상호작용을 담당합니다.
클러스터 내에서 API 호출을 받아들이고, 각가의 리소스를 생성, 읽기, 업데이트, 삭제 등의 작업을 수행합니다.
- 스케줄러: 새로운 Pod를 어느 노드에 배치할지 결정하고 워커노드에 **무엇을 해야 하는지 API 서버에 알리는 역할**을 합니다. 파드의 요구사항(자원 요구사항, 스토리지 요구 사항 등)을 고려하여 최적의 노드를 선택합니다.
- 컨트롤러: 워커노드 전체를 감시하고 제어하며 적당한 수의 Pod를 가동 중에 있는지 확인하는 역할을 합니다.
- etcd: 클러스터의 모든 상태 정보를 저장하는 분산 저장소입니다. 모든 노드 etcd에 저장된 클러스터의 상태 정보를 읽고 업데이트합니다.
워커 노드
- 워커노드는 실행중인 ec2 인스턴스와 같은 특정량의 cpu와 메모리가 있는 컴퓨터 머신입니다.
- 마스터 노드에서 관리됩니다.
- Pod가 워커노드에서 실행됩니다.
- kubelet 소프트웨어로 마스터노드와 통신하여 마스터 노드가 워커노드의 Pod를 제어할 수 있도록 합니다.
- kube-proxy 네트워크 프록시는 워커노드에서 실행되며 로드 밸런싱과 같은 기능을 수행하여 클러스터 내에서 서비스를 연결합니다.
서비스
서비스는 클러스터 내부의 네트워크 트래픽을 관리하고 분산하는 역할을 합니다.
라벨 셀레터를 사용하여 특정 파드를 식별하고 로드 밸런싱하거나 DNS 이름을 할당하여 클러스터 내에서 서비스를 식별할 수 있도록 해줍니다. 또 서비스는 클러스터 내부의 파드를 모니터링하고 동적으로 업데이트하므로 파드가 새로 생성되거나 삭제되더라도 서비스에는 영향을 주지 않습니다.
- ClsterIP: 클러스터 내부에만 접근이 가능한 가상 IP 주소를 제공합니다.
- NodePort: 모든 노드의 IP 주소와 지정된 포트를 사용하여 접근할 수 있습니다.
- LoadBalancer: 클라우드 제공 업체가 제공하는 로드 밸런서를 사용하여 서비스를 외부 트래픽에 노출합니다.
- ExternalName: CNAME 레코드를 사용하여 다른 서비스의 외부 DNS의 이름을 내부 DNS 이름으로 매핑합니다.
NodePort와 LoadBalancer
각 노드에서 포트를 열어 외부에서 접근할 수 있는 방법입니다.
- NodePort 각 노드에서 포트를 열어 노출된 서비스의 IP 주소와 포트를 이용하여 외부에서 접근할 수 있도록 하는 방법입니다. 간단하고 쉽게 설정할 수 있지만 보안상 취약점이 있을 수 있고 각 노드에서 포트를 열어야 하는 단점이 있습니다.
- LoadBalancer는 클라우드 프로바이더가 제공하는 로드 밸런서를 사용하여 각 노드의 IP와 포드를 숨기고 로드 밸런서에서 관리하는 IP와 포트를 이용하여 외부에서 접근할 수 있도록 하는 방법입니다. 이 방식은 각 노드에서 포트를 열지 않아도 되므로 보안성이 높고, 클라우드 프로바이더가 제공하는 로드 밸런서의 기능을 활용할 수 있습니다. 하지만 클라우드 프로바이더가 아닌 경우 구현하기 어렵습니다.
클라우드 프로바이더를 사용하는 경우 LoadBalancer를 사용하고, 그렇지 않은 경우 NodePort를 사용하는 것이 일반적입니다.