[Cloud] 컨테이너, 도커, 쿠버네티스(k8s)
용어 간단 정리
컨테이너
애플리케이션을 실행할 수 있는 환경까지 감싸서 어디서든 쉽게 실행 가능하게 하는 기술
- 앱, 바이너리, 라이브러리 등을 패키지로 묶어 배포하며 서로 다른 컴퓨팅 환경에서 앱을 실행 할 수 있게 하며, 개발환경에 구애 받지 않고 빠른 개발과 배포가 가능.
- 이식성이 좋고 가볍다.
- VM 이미지 보다 컨테이너 이미지 생성이 효율적이다.
도커(Docker)
리눅스 컨테이너를 만들고 사용할 수 있도록 하는 컨테이너화 기술, 컨테이너를 다루는 도구
- 컨테이너를 가벼운 모듈식 가상머신처럼 다룰 수 있게 함
- 컨테이너를 구축, 배포, 복사하고 한 환경에서 다른 환경으로 이동하는 등 유연하게 사용할 수 있어, 애플리케이션을 클라우드에 최적화하도록 지원
- 애플리케이션을 개별 프로세스로 세분화하도록 권장하고 이를 위한 툴을 제공
장점
- 모듈성 : 업데이트 또는 복구를 위해 애플리케이션의 일부를 분해하는 기능
- 계층 및 이미지 버전 제어 : 계층은 이미지가 변경될 때 생성
- 롤백 : 현재의 이미지 반복이 적절하지 않은 경우 이전 버전으로 롤백, CI/CD 에 도움 됨
- 신속한 배포
but 도커로 수백개의 컨테이너 관리가 어려워짐 -> 컨테이너 그룹화가 필요 -> 쿠버네티스(k8s) 이용
쿠버네티스(k8s)
컨테이너화 된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장 가능한 오픈소스 플랫폼.
여러 서버(노드)에 컨테이너를 분산해서 배치, 문제가 생긴 컨테이너를 교체, 컨테이너가 사용할 비밀번호나 환경 설정을 관리하고 주입하는 것 등. 이것을 컨테이너 오케스트레이션이라고 한다.
* EKS : AWS에서 쿠버네티스를 쉽게 다루게 해주는 도구
쿠버네티스 클러스터(Kubernetes Cluster)
Kubernetes를 배포하면 Cluster를 얻는다. Kubernetes Cluster는 컨테이너화된 애플리케이션을 실행하는 Node 라고 하는 워커 머신의 집합으로, 모든 Cluster는 최소 한 개의 Worker Node를 가진다.
쿠버네티스의 컴포넌트는 컨트롤 플레인(Control Plane) 컴포넌트, 노드(Node) 컴포넌트로 나누어진다. 비유하자면 본사, 지사의 개념이다.
컨트롤 플레인(Control Plane) 컴포넌트
kube-apiserver
쿠버네티스 컨트롤 플레인의 프론트 엔드. 쿠버네티스 클러스터로 들어오는 요청을 가장 앞에서 접수하는 역할이다.
예를 들어 쿠버네티스 커맨드 라인 도구인 kubectl을 사용해 각종 명령을 수행할 경우, 이 명령은 kube-apiserver로 전송된다. 이렇게 전달된 요청에 대하여 kube-apiserver는 이 요청의 처리 흐름에 따라 적절한 컴포넌트로 요청을 전달하는 역할까지 맡고 있습니다.
etcd (엣시디)
클러스터 및 리소스의 구성 정보, 상태 정보 및 명세 정보 등을 키-값(key-value) 형태로 저장하는 저장소이다.
kube-scheduler
기본적인 작업 단위라고 할 수 있는 Pod(파드)는 여러 노드 중 특정 노드에 배치되어 동작하게 된다. 이때 새로 생성된 파드를 감지하여 어떤 노드로 배치할지 결정하는 작업을 스케줄링이라고 하고, 담당하는 컴포넌트가 kube-scheduler.
회사로 비유하자면, 각 부서 인력 소요 계획과 신입사원 역량을 고려해 적절한 부서로 배치하는 인사 담당 부서에 비유할 수 있다.
kube-controller-manager
다운된 노드가 없는지, 파드가 의도한 복제(Replicas) 숫자를 유지하고 있는지, 서비스와 파드는 적절하게 연결되어 있는지, 네임스페이스에 대한 기본 계정과 토큰이 생성되어 있는지를 확인하고, 적절하지 않다면 적절한 수준을 유지하기 위해 조치하는 역할을 한다.
노드(Node) 컴포넌트
kubelet (쿠블릿)
노드에서 컨테이너가 동작하도록 관리해 주는 핵심 요소. 각 노드에서 파드를 생성하고 정상적으로 동작하는지 관리하는 역할을 담당하고 있으며, 실제로 우리가 쿠버네티스의 워크로드를 관리하기 위해 내려지는 명령은 kubelet을 통해 수행된다고 볼 수 있다.
우리가 쿠버네티스 파드를 관리하기 위해 작성하는 YAML을 쿠버네티스 클러스터에 적용하기 위해 kubectl 명령어를 사용할 때, 이 YAML이 kube-apiserver로 전송 > kubelet으로 전달 > kubelet은 이 YAML을 통해 전달된 파드를 생성 or 변경 > 이 YAML에 명시된 컨테이너가 정상적으로 실행되고 있는지 확인한다.
지사에서 본사의 업무 요청을 받아 확인하는 막중한 역할을 수행하고 있다.
container runtime
컨테이너 런타임은 파드에 포함된 컨테이너 실행을 실질적으로 담당하는 애플리케이션을 의미.
쿠버네티스가 컨테이너를 제어하기 위해 제공하는 표준 규약인 컨테이너 런타임 인터페이스(CRI)를 준수하여 쿠버네티스와 함께 사용할 수 있는 외부 애플리케이션들을 의미한다.
규약을 따르는 대표적인 컨테이너 런타임은 컨테이너디(containerd), 크라이오(CRI-O) 등이 있다. 컨테이너 런타임은 쿠버네티스 구성 요소에 기본적으로 포함되어 있거나, 특정 소프트웨어를 지칭하는 것은 아님.
컨테이너의 표준화가 이뤄진 후 컨테이너 시장은 OCI와 CRI(Container Runtime Interface)를 중심으로 성장하고 있다. 그 과정에서 사실상 컨테이너 표준으로 사용되던 도커의 역할을 대신하는 다양한 기술이 나오고 있으며 그 중 Buildah, Podman, Skopeo는 도커의 기능을 역할별로 나눠 구현하고 있다.
kube-proxy
쿠버네티스 클러스터 내부에서 네트워크 요청을 전달하는 역할. 쿠버네티스는 파드 IP가 매번 바뀌는데서 오는 어려움을 해결하기 위해 오브젝트를 통해 고정적으로 파드에 접근할 수 있도록 하는 방법을 제공한다.
- Node는 실제 Container로 구성된 SW를 구동하는 서버
- Pod는 Container의 모음
참고자료
https://www.samsungsds.com/kr/insights/kubernetes-3.html
쿠버네티스 알아보기 3편: 쿠버네티스를 이루고 있는 여러 가지 구성 요소 | 인사이트리포트 | 삼
쿠버네티스 구성 요소인 쿠버네티스 컴포넌트에 대해 살펴보겠습니다.
www.samsungsds.com