쿠버네티스(Kubernetes)란?
쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장 가능한 오픈소스 플랫폼입니다. 한마디로 정의하자면, ‘오픈소스 컨테이너 오케스트레이션 플랫폼’입니다.
쿠버네티스란 명칭은 키잡이(helmsman)나 파일럿을 뜻하는 그리스어에서 유래했습니다. 그리고 K8s라고도 불리는데, K8s라는 표기는 "K"와 "s"와 그 사이에 있는 8글자를 나타내는 약식 표기입니다.
1주일에 수십억 개의 컨테이너를 생성하는 Google이 내부 배포 시스템으로 사용하던 'Borg'를 기반으로 2014년 프로젝트를 시작했고, 여러 커뮤니티의 아이디어와 좋은 사례들을 모아 빠르게 발전하였습니다. 이후 Google이 CNCF(Cloud Native Computing Foundation)에 코드를 기부함으로써, 쿠버네티스는 오픈 소스 프로젝트가 되었습니다.
쿠버네티스는 왜 필요하고 어떤 기능이 있을까?
위 이미지는 애플리케이션 배포 환경의 변화를 보여줍니다. 여기서 주목할 부분이 'Container Deployment'입니다.
앞서 말씀드렸듯이 쿠버네티스는 '컨테이너 오케스트레이션 플랫폼'입니다. 사실 컨테이너가 한두 개만 만든다면, 컨테이너 오케스트레이션이 필요 없었겠지요... 하지만 Google의 예시처럼 1주일에 수십억 개의 컨테이너를 배포, 확장, 관리를 '수동'으로 하나씩 해야 한다면 어떨까요? 또는 운영 환경에서 컨테이너가 다운된다면 다른 컨테이너를 다시 시작하여 가동 중지 시간을 최소화하여야 하는데, 이러한 동작을 시스템에 의해 처리할 수 있다면 어떨까요? 이러한 문제를 시스템에 의해 관리되도록 하는 것이 쿠버네티스의 역할이고, 쿠버네티스가 필요한 이유입니다.
그렇다면 쿠버네티스에서 제공하는 기능에는 어떤 것들이 있을까요?
- 서비스 검색(Discovery) DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있다.
- 로드 밸런싱 컨테이너에 대한 트래픽이 많으면, 네트워크 트래픽을 로드밸런싱한다.
- 스토리지 오케스트레이션 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재(Mount)할 수 있다.
- 자동화된 롤아웃과 롤백 배포된 컨테이너의 의도한 상태(Desired State)를 서술(Describe)할 수 있으며, 현재 상태를 의도한 상태(Desired State)로 설정한 속도에 따라 변경할 수 있다. 또한 장애 시 애플리케이션의 롤백도 지원한다.
- 자동화된 빈 패킹(bin packing) 각 컨테이너가 필요로 하는 CPU와 메모리(RAM)를 제공하면, 쿠버네티스는 리소스를 최대한 활용하기 위해 컨테이너를 노드에 맞출 수 있다.
- 자동화된 복구(self-healing) 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체할 수 있다.
- 시크릿과 구성 관리 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리한다.
- 수평 확장(Horizontal scaling) 간단한 명령, UI를 통해, 또는 CPU 사용량에 따라 자동으로 애플리케이션을 확장 및 축소할 수 있다.
쿠버네티스 컴포넌트
클러스터(Cluster)
쿠버네티스 클러스터는 쿠버네티스의 여러 리소스를 관리하기 위한 집합체이다. 그리고 컨트롤 플레인 및 하나 이상의 노드로 구성된다.
컨트롤 플레인 컴포넌트(Control Plane Component)
컨트롤 플레인 컴포넌트는 클러스터에 관한 전반적인 결정을 수행하고 클러스터 이벤트를 감지하고 반응한다.
kube-apiserver API
- API 서버는 쿠버네티스 컨트롤 플레인의 프론트 엔드이다.
- 쿠버네티스 클러스터로 들어오는 요청을 가장 앞에서 접수하는 역할을 한다.
- 전달된 요청에 대하여 처리 흐름에 따라 적절한 컴포넌트로 요청을 전달하는 역할을 한다.
etcd
- 클러스터 및 리소스의 구성 정보, 상태 정보 및 명세 정보 등을 키-값(key-value) 형태로 저장하는 저장소이다.
- 안정적인 동작을 위해 자료를 분산해서 저장하는 구조를 채택했다.
- etcd는 오직 API 서버와 통신하고, 다른 모듈은 API 서버를 거쳐 etcd 데이터에 접근한다.
kube-scheduler
- 새로 생성된 파드를 감지하여 어떤 노드로 배치할지 결정하는 작업을 스케줄링이라고 하는데, 이런 스케줄링을 담당하는 컴포넌트이다.
- 스케줄링을 위해 노드 및 파드의 각종 요구사항과 제약사항을 종합적으로 판단할 필요가 있는데, 이러한 판단 또한 kube-scheduler의 역할이다.
kube-controller-manager
- 다운된 노드가 없는지 확인한다.
- 파드가 의도한 복제(Replicas) 숫자를 유지하고 있는지, 서비스와 파드는 적절하게 연결되어 있는지 확인한다.
- 네임스페이스에 대한 기본 계정과 토큰이 생성되어 있는지를 확인하고 적절하지 않다면 적절한 수준을 유지하기 위해 조치하는 역할한다.
cloud-controller-manager
- 클라우드별 컨트롤 로직을 포함하는 쿠버네티스 컨트롤 플레인 컴포넌트이다
노드 컴포넌트(Node Component)
노드 컴포넌트는 동작 중인 파드를 유지시키고 쿠버네티스 런타임 환경을 제공하며, 모든 노드 상에서 동작한다
kubelet
- 클러스터의 각 노드에서 실행되는 에이전트
- 파드에서 컨테이너가 정상적으로 동작하는지 관리하는 역할을 한다.
- 쿠버네티스를 통해 생성되지 않는 컨테이너는 관리하지 않는다.
kube-proxy
- 쿠버네티스 클러스터 내부에서 네트워크 요청을 전달하는 역할을 한다.
container-runtime
- 파드에 포함된 컨테이너 실행을 실질적으로 담당하는 애플리케이션이다.
- 특정 소프트웨어를 지칭하는 것이 아닌, 컨테이너 런타임 인터페이스(CRI)를 준수하여 쿠버네티스와 함께 사용할 수 있는 외부 애플리케이션들을 의미한다. 대표적인 컨테이너 런타임은 컨테이너디(Containerd), 크라이오(CRI-O) 등이 있다.
참고자료
https://kubernetes.io/docs/concepts/overview/
https://www.codestates.com/blog/content/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4
'컨테이너 > Kubernetes' 카테고리의 다른 글
쿠버네티스 환경 구성하기(VirtualBox + Vagrant) (0) | 2023.11.21 |
---|