Kubernetes 알아보기
Kubernetes에 대해 알아보고 정리한 내용입니다.
1. Kubernetes
Kubernetes(K8S)는 컨테이너 오케스트레이션을 위한 플랫폼입니다. 컨테이너 오케스트레이션은 다수의 서버에 컨테이너를 배포, 운영하면서 관리를 자동화해주는 것을 의미합니다. 서비스 디스커버리 같은 기능을 이용하여 서비스 간의 연결을 구성하거나 서버에 장애가 발생한 경우엔 정상 동작중인 다른 서버에 애플리케이션을 띄워 장애를 방지하는 등의 기능을 제공합니다. 또한 컨테이너를 실행하는 호스트 그룹을 클러스터링하고 효율적으로 관리할 수 있습니다.
쿠버네티스는 Google에서 만든 내부 플랫폼인 Borg가 2014년에 오픈소스화 되어 만들어진 플랫폼입니다. GO 언어로 구현되어있고 플랫폼 종속적이지 않은 구조이기 때문에 Google Cloud, AWS, Azure 같은 퍼블릭 클라우드나 프라이빗 클라우드, 베어메탈 등에 배포가 가능합니다.
쿠버네티스를 이해하기 위해선 컨테이너 운영 환경에 대해 생각해봐야합니다. 도커를 이용하여 적은 수의 컨테이너를 운영한다면 VM 또는 베어메탈에 배포하고 관리하면 되지만, 배포 환경이 변경되거나 컨테이너 수가 많아지고 CPU나 메모리 같은 자원을 적절하게 분배해야할 경우가 생기면 여러가지 상황에 대한 결정이 필요합니다.
또한 위와 같이 애플리케이션을 배포하는 방식이 하드웨어에 직접 배포하는 것에서 가상화 방식을 거쳐 컨테이너 방식에 이른 것을 보면 쿠버네티스가 운영 환경에서 왜 유용하게 사용되는지에 대해 확인할 수 있습니다.
1.1. 도커와 쿠버네티스의 차이
- Docker
이미지를 실행하여 컨테이너를 생성하는 기술.
컨테이너 기반의 오픈소스 가상화 플랫폼. 기술적인 개념이자 도구로 사용.
한 개의 컨테이너를 대상으로 배포, 관리하는 경우에 적합. - Kubernetes
도커를 기반으로 컨테이너를 관리하는 오케스트레이션 플랫폼.
여러 개의 컨테이너를 서비스 단위로 배포, 관리하는 경우에 적합.
스케줄링, 클러스터링, 서비스 디스커버리, 로깅, 모니터링 등의 기능을 제공.
2. Kubernetes 특징
쿠버네티스가 제공하는 특징은 다음과 같습니다.
- 서비스 디스커버리/로드 밸런싱 (load balancing)
DNS를 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출하는 것이 가능.
특정 컨테이너에 트래픽이 많아질 경우 로드 밸런싱 한 뒤에 안정적인 배포가 가능하도록 함. - Auto-scaling
CPU, Memory와 같이 자원의 사용량에 따른 확장과 함께 다양한 scaling 방식을 제공.
컨테이너 개수를 조정하는 HPA(Horizontal Pod Autoscaler), 컨테이너 리소스 할당량을 조정하는 VPA(Vertical Pod Autoscaler), 서버 개수를 조정하는 CA(Cluster Autoscaler) 방식을 제공. - 저장소 오케스트레이션 (storage)
로컬 저장소나 퍼블릭 클라우드와 같이 경우에 따라 원하는 저장소를 자동화하여 탑재 가능. - 롤아웃/롤백 자동화 (roll-out/roll-back)
배포된 컨테이너의 상태를 확인 가능하고 원하는 상태로 변경 가능.
배포용도의 새로운 컨테이너를 생성할 경우 기존 컨테이너를 삭제하고, 기존 컨테이너의 리소스를 새로운 컨테이너에 적용 가능. - 빈 패킹 자동화 (bin packing)
컨테이너 작업을 실행할 수 있는 클러스터 노드를 제공.
해당 컨테이너가 필요로 하는 CPU, 메모리 등의 자원을 쿠버네티스에 요청하여 효율적인 자원 사용이 가능. - 복구 자동화 (self-healing)
컨테이너들을 모니터링하여 장애가 발생한 컨테이너를 재시작해줌. - 시크릿 구성 및 관리 (secret)
OAuth, SSH 키와 같이 중요한 정보를 저장하고 관리하는 것이 가능.
이 외에도 다음과 같은 몇가지 중요한 특징이 있습니다.
2.1. 다양한 배포 방식
쿠버네티스는 다양한 배포 방식을 지원합니다. 종류와 역할에 대해 간단하게 정리하면 다음과 같습니다.
- deployment/replicaset
새로운 버전의 애플리케이션을 다양한 전략을 사용하여 무중단으로 배포하는 방식. - statefulset
실행 순서를 보장하는 방식이며 호스트명과 볼륨을 일정하게 사용 가능.
순서나 데이터가 중요한 경우에 사용하는 방식. - daemonset
로깅, 모니터링이 필요한 경우에 사용하는 방식. - job/cronjob
배치 작업이 필요한 경우에 사용하는 방식.
2.2. Ingress 설정
Ingress는 쿠버네티스에서 동작하는 다양한 애플리케이션을 하나의 로드 밸런서를 이용하여 서비스하는 기능입니다. 클러스터 외부에서 내부로 접근이 가능한 HTTP/HTTPS URL, 트래픽 로드 밸런싱, SSL/TLS, 라우팅 등을 설정합니다.
ALB, Nginx, Apache와 같은 프록시 서버는 도메인 또는 path 조건에 따라 서버에 요청을 전달하는데 서버나 IP가 변경되면 매번 수정을 해줘야하는 문제가 있습니다. 쿠버네티스의 Ingress 설정은 이러한 문제를 자동화해주는 서비스입니다.
2.3. Namespace와 Label
Namespace는 쿠버네티스가 설치된 물리적인 클러스터를 논리적으로 구분하려는 경우에 사용합니다. 일반적으로는 기본으로 제공되는 system, default 네임스페이스 외에 구성에 따라 여러개의 네임스페이스를 만들어 사용합니다. Label은 세부적인 설정으로 좀 더 유연하고 확장성있는 리소스 관리가 가능하게 해줍니다.
2.4. RBAC (Role-Based Access Control)
RBAC은 쿠버네티스의 인가(Authorization) 모듈입니다. 쿠버네티스 내의 리소스들에 대해 사용자별로 CRUD 권한을 바인딩할 수 있습니다. 네임스페이스나 클러스터 단위로 적용이 가능합니다.
이상으로 Kubernetes의 기본적인 내용과 특징에 대해 간단하게 알아보았습니다.
※ Reference
- kubernetes.io, 쿠버네티스란 무엇인가?, https://kubernetes.io/ko/docs/concepts/overview/what-is-kubernetes/
- kubernetes.io, 인그레스란?, https://kubernetes.io/ko/docs/concepts/services-networking/ingress/
- redhat.com, 쿠버네티스(Kubernetes)란? 개념, 성능, 사용 방법 및 차이점, https://www.redhat.com/ko/topics/containers/what-is-kubernetes
- subicura.com, 쿠버네티스 시작하기 - Kubernetes란 무엇인가?, https://subicura.com/2019/05/19/kubernetes-basic-1.html
- bcho.tistory.com, 쿠버네티스 #1 - 소개, https://bcho.tistory.com/1255
- wooono.tistory.com, [Kubernetes] 도커와 쿠버네티스 간단 비교, https://wooono.tistory.com/109