다들 쿠버네티스가 중요하다고 이야기 하곤 하는데, 어째서 중요한건지 ?? 또 어떨 때 사용할 수 있고 왜 사용하는 건지!
기본 개념부터 천천히 공부해 나갈 생각이다. 쿠버네티스를 겉핥기 식으로 살짝 만져보긴 했으나 아직 제대로 이해하지 못한것 같아서 글을 쓰면서 정리 해봐야겠다. 그럼 어디 한번 쿠버네티스를 처음부터 제대로 파헤쳐보자.!!
1. Kubernetes(kubernetes = k8s = 쿠버네티스)
kubernetes는 컨테이너를 자동으로 관리하고 배포할 수 있는 '컨테이너 오케스트레이션' 도구이다.
(kubernetes = k8s = 쿠버네티스)
쿠버네티스는 2014년도에 구글에서 오픈소스로 제공하며 많은 인기를 누리고 있는 플랫폼이다.
컨테이너를 관리하는 도구들은 쿠버네티스 이전에도 여러가지 (Docker swarm, mesosphere)가 있었지만 지금은 대세가 쿠버네티스로 사실상 표준 도구가 되었다.
쿠버네티스가 이처럼 많이 쓰이게 된 계기를 알아가려면, 이전에는 어떤식으로 애플리케이션이 배포되었는지 그 과정에 대해서 알아야 할 필요가 있다.
다음은 시간상의 순서대로 애플리케이션이 배포되는 방법에 대해서 나와있는 그림이다.
1. Traditional Deployment (초기 방식)
처음에는 애플리케이션을 물리 서버에서 실행했다. 하드웨어에 하나의 OS를 설치하고 그 위에 애플리케이션을 실행하는 방식이였는데, 이러한 방식은 리소스 할당의 문제가 발생하게 된다. 하나의 서버에서 여러 애플리케이션의 리소스 한계를 정의할 방법이 없었기 때문이다. 그 결과, 하나의 서버에서 애플리케이션을 실행하면, 리소스를 전부 차지하는 애플리케이션이 나타나고 성능이 저하될 수 있었다.
이에 대한 해결책으로는 여러대의 물리 서버에서 각 애플리케이션을 실행하는 것이 있는데, 이 방법도 리소스가 충분히 활용되지 않는다는 점에서 비효율적이다.
2. Virtualized Deployment (가상화 방식)
초기 방식의 해결책으로 가상화 시스템이 등장하였다. 하드웨어와 OS위에 하이퍼바이저를 사용해 하나의 물리 서버위에 여러개의 가상의 서버를 생성할 수 있게 되었다.
가상화를 사용하면 리소스를 보다 효율적으로 활용할 수 있고, 쉽게 애플리케이션을 추가하고 업데이트하며 더 나은 확장성을 제공한다.
3. Container Deployment (컨테이너 방식)
가상화 방식에서 더 나아가 등장한 것이 컨테이너이다. 컨테이너는 VM과 유사하지만 애플리케이션을 격리시켜서 독립적으로 관리하는 방식이다. 쿠버네티스는 이 컨테이너 이미지를 사용해 애플리케이션을 관리 및 배포한다.
이 컨테이너 방식이 왜 인기를 끌고 있는지 장점들에 대해 알아보자.
- VM 이미지를 사용하는 것에 비해 컨테이너 이미지 생성이 쉽고 효율적
- 주기적으로 컨테이너 이미지를 빌드해서 배포하면서 빠르고 효율적으로 롤백 가능
- 어느 한 OS에 구애되지 않고 Ubuntu,RHEL,온프레미스,퍼블릭 클라우드 어디서나 구동된다
- 리소스를 격리시켜 애플리케이션 성능을 예측할 수 있다.
때문에 기존 방식들에 비해서 컨테이너 이미지를 사용하는 방식을 선호하게 되면서 쿠버네티스가 각광받고 있다.
2. Kubernetes 아키텍처
위 그림은 쿠버네티스가 어떤식으로 동작하는지 나타내는 아키텍처이다.
쿠버네티스는 클러스터 구조로써, 클러스터 전체를 관리하는 컨트롤러인 마스터와 컨테이너가 배포되는 노드로 이루어져 있다.
우선, 마스터와 노드를 구성하는 리소스들에 대해서 살펴보자
Master
쿠버네티스 클러스터 전체를 컨트롤하는 시스템으로, 크게 다음과 같이 API서버, 스케줄러, etcd, 컨트롤러 매니저로 구성되어 있다.
1. Kube-api-server
쿠버네티스는 모든 명령과 통신을 api를 통해서 하는데, 그 중심이 되는게 kube-api-server이다. 쿠버네티스는 api서버를 통해 클로스터로 온 요청이 유효한지 검증하고, 다른 컴토넌트와 정보를 주고받는다. 특히 etcd에는 api서버만 접근가능
2. etcd
쿠버네티스의 데이터들을 Key-Value 구조로 저장하는 데이터베이스 역할을 한다. 클러스터의 상태나 설정 값들을 저장한다.
3. kube-scheduler
클러스터 안에서 자원 할당이 가능한 노드 중 알맞은 노드를 선택해서 파드나,서비스등 각 리소스들을 할당하고 실행해주는 역할을 한다.
4. kube-controller-manager
컨트롤러를 생성하고 각 노드에 배포하여 이를 관리하는 역할을 한다.
5. cloud-controller-manager
쿠버네티스의 컨트롤러들을 클라우드 서비스와 연결해서 관리하는 컴포넌트이다.
Node
노드는 마스터에 의해 명령을 받고 실제 워크로드를 생성하여 서비스하는 컴포넌트이다.
1. kubelet
파드 컨테이너의 실행을 직접적으로 관리하고 해당 컨테이너가 정상적으로 실행되는지 헬스 체크를 진행한다.
마스터의 API서버와 통신을 하면서, 마스터에에 노드의 상태를 전달하거나, 노드가 수행해야 할 명령을 받아서 수행한다.
2. kube-proxy
쿠버네티스는 클러스터 안에서 별도의 가상 네트워크를 생성하고 관리한다.
노드로 들어오려는 네트워크 트래픽을 적절한 컨테이너로 라우팅하고, 로드밸런싱을 통해 노드로 들어오고 나가는 네트워크 트래픽을 프록시하며 노드와 마스터간에 네트워크 통신을 관리한다.
3. container runtime
파드를 통해서 배포된 컨테이너를 실행하는 컴포넌트이다. 가장 많이 사용하는 런타임으로는 Docker를 사용한다.
쿠버네티스를 사용하는 가장 핵심적인 목표는!
컨테이너를 내가 원하는 상태로 지속적으로 관리하도록 하는것이 목표!
'DevOps > Kubernetes' 카테고리의 다른 글
[kubernetes] 쿠버네티스의 구성요소 ! (Controller) (0) | 2021.04.20 |
---|---|
[CKA] CKA 시험 합격 (1) | 2021.03.22 |
[kubernetes] kubectl 자동완성 및 약칭 (0) | 2021.03.18 |
[Kubernetes] Kubernetes의 구성요소 ! (Object) (0) | 2021.03.17 |
[kubernetes] kubectl 축약어 (0) | 2021.03.11 |