-
도커와 쿠버네티스STUDY/Docker 2022. 10. 25. 23:59
애플리케이션 배포 환경 변화
Traditional Deployment(전통적 배포)는 오래전부터 쓰이던 가상화 이전 방식이다. 물리적인 컴퓨터 한 대에 하나의 OS를 깔고 여러가지 프로그램을 설치하는 방식이다. 가장 오래되고 단순한 방식이며 단일 목적 시스템이라면 별 무리가 없다. 하지만 이 방식은 한 대의 컴퓨터에서 모든 것을 처리하므로, 어떤 프로그램의 동작이 다른 프로그램의 동작을 간섭하거나, 특정 프로그램이 성능을 독점할 경우 또 다른 프로그램의 성능이 떨어지는 단점이 존재한다. 이에 대한 해결책은 서로 다른 여러 물리 서버에서 각 애플리케이션을 실행하는 것이 있다. 하지만 이 방법은 많은 비용이 든다.
이 문제를 해결하기 위해 등장한 것이 Virtualized Deployment(가상화 배포)이다.
Virtualized Deployment 방식은 가상머신(Virtual Machine)을 기반으로 배포하는 방법이다. 가상머신은 말 그대로 가상 컴퓨터로 CPU, 메모리, 저장장치 등을 개별적으로 할당할 수 있다. 서로 다른 두 개의 프로그램 간에 간섭이 일어난다면 두 프로그램을 각각의 가상머신에서 실행시킬 수 있다. 하나의 컴퓨터 안에서 두 개의 가상화된 컴퓨터가 동작하기 때문에 서로 간섭을 일으키지 않게 된다. 그리고 가상머신 성능을 조절해 CPU와 메모리를 적게 또는 더 많이 할당할 수 있다. 또한 서버와 같이 다중화와 분산 처리가 중요한 시스템이라면 시스템 자원 상황에 따라 가상머신 개수를 늘리고 줄이는 것도 유연하게 처리할 수 있다. 전통적 배포 방식보다는 효율적이지만, 가상머신은 완전한 컴퓨터이고 가상머신에 일일이 운영체제를 설치해야 하기 때문에 컨테이너 중심의 배포보다는 무거운 편이다.
마지막으로 살펴볼 것은 Container Deployment(컨테이너 중심의 배포)방식이다. 컨테이너 중심의 배포 방식에서는 가상화 배포 방식에서의 하이퍼바이저(하나의 시스템 상에서 가상 컴퓨터를 여러 개 구동할 수 있도록 해주는 중간 계층)가 Container Runtime으로 대체되었고, Virtual Machine 부분이 Container로 대체된다. 컨테이너는 가상머신과 달리 프로그램 구동을 위해서 OS를 매번 설치할 필요가 없다. 그림을 보면 전통적 배포 위에 Container Runtime이 올라가 있어 물리적인 컴퓨터 상에서만 유효한 것이라고 생각할 수 있는데, 컨테이너 기반 배포는 OS 하단이 어떻게 동작하는지 관심을 두지 않기 때문에 가상머신 위에 올라간 OS에서 컨테이너 기반 배포를 하는 것이 가능하다.
컨테이너 중심의 배포에서 각각의 컨테이너는 하나의 OS상에서 구동되는데, 여기서 전통적 배포와 다른 중요한 기술적 차이점은 ' 이 컴퓨터에서 나만 구동되고 있다'라고 판단할 수 있도록, 두 컨테이너 간에 간섭을 일으킬 수 없는 장벽을 친다. 장벽을 치는 것과 동시에 OS는 두 컨테이너가 사용할 수 있는 CPU, 메모리 등의 자원 또한 독립적으로 사용할 수 있도록 할당하고 관리한다. 이러한 과정을 통해 각 컨테이너는 서로 다른 컴퓨터에서 실행되고 있다고 보지만, OS 관점에서는 둘 다 OS 상에서 구동되는 프로그램이다. 이 같은 컨테이너 동작 방식을 OS 커널을 공유하는 가상화라고 한다.
이때 주의해야 할 점은 컨테이너는 OS를 공유하는 방식이기 때문에, 어떤 프로그램의 문제가 다른 프로그램을 간섭할 수는 없다. 하지만 프로그램의 문제가 OS에 문제를 일으킬 경우에는 OS에서 구동중인 전체 컨테이너의 문제가 될 가능성이 있다.
도커와 쿠버네티스
컨테이너 : 앱이 구동되는 환경까지 감싸서 실행할 수 있도록 하는 격리 기술
컨테이너 런타임 : 컨테이너를 다루는 도구
도커 : 컨테이너 기반의 오픈소스 가상화 플랫폼으로, 컨테이너를 관리하는 도구(컨테이너 런타임의 한 종류)
쿠버네티스 : 컨테이너 런타임을 통해 컨테이너를 오케스트레이션 하는 도구
오케스트레이션 : 여러 서버에 걸친 컨테이너 및 사용하는 환경 설정을 관리하는 행위
컨테이너란, 우리가 구동하려는 애플리케이션을 실행할 수 있는 환경까지 감싸서, 어디서든 쉽게 실행할 수 있도록 해주는 기술이다. 예를 들어 PC에 프로그램을 설치할 때 특정 경로에 맞춰 설치를 해야 하거나, 컴퓨터에 필요한 옵션을 일일이 맞춰야해서 설치 과정이 힘들 때가 있다. 컨테이너는 이러한 환경까지 모두 포함하여 독집적으로 프로그램을 실행할 수 있도록 도와주는 기술이다. 컨테이너 환경을 묶어서 배포한 컨테이너 이미지라는 프로그램을 내려받아 구동하면 실행되기 때문에, 각종 설정 과정이 줄어든다.
컨테이너를 사용할 때 필요한 도구가 컨테이너 런타임이다. 컨테이너를 쉽게 내려받거나 공유하고 구동할 수 있도록 해주는 도구인데, 여러 가지 종류가 있고 그 중 가장 유명한 것이 도커이다. 도커가 사용하는 컨테이너 규격은 표준화되어 있기 때문에 도커가 아닌 다른 컨테이너 런타임들도 도커로 만든 컨테이너를 사용할 수 있다.
쿠버네티스는 컨테이너 런타임을 통해 컨테이너를 다루는 도구이다. 쿠버네티스가 해주는 일은 여러 서버(노드)에 컨테이너를 분산해서 배치하거나, 문제가 생긴 컨테이너를 교체하거나, 컨테이너가 사용할 비밀번호나 환경 설정을 관리하고 주입해 주는 일 등이다.
여기서 오케스트레이션이란 다수의 컨테이너 실행을 관리 및 조율하는 시스템을 말한다. 오케스트레이션 엔진을 통해, 컨테이너의 생성과 소멸, 시작 및 중단 시점 제어, 스케줄링, 로드밸런싱, 클러스터링 등 컨테이너로 어플리케이션을 구성하는 모든 과정을 관리할 수 있다.
쿠버네티스 특징
- 서비스 디스커버리와 로드 밸런싱 : 쿠버네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있다. 컨테이너에 대한 트래픽이 많으면, 쿠버네티스는 네트워크 트래픽을 로드밸런싱하고 배포하여 배포가 안정적으로 이루어질 수 있다.
- 스토리지 오케스트레이션 : 쿠버네티스를 사용하면 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재 할 수 있다.
- 자동화된 롤아웃과 롤백 : 쿠버네티스를 사용하여 배포된 컨테이너의 원하는 상태를 서술할 수 있으며 현재 상태를 원하는 상태로 설정한 속도에 따라 변경할 수 있다. 예를 들어 쿠버네티스를 자동화해서 배포용 새 컨테이너를 만들고, 기존 컨테이너를 제거하고, 모든 리소스를 새 컨테이너에 적용할 수 있다.
- 자동화된 빈 패킹(bin packing) : 컨테이너화된 작업을 실행하는데 사용할 수 있는 쿠버네티스 클러스터 노드를 제공한다. 각 컨테이너가 필요로 하는 CPU와 메모리(RAM)를 쿠버네티스에게 지시한다. 쿠버네티스는 컨테이너를 노드에 맞추어서 리소스를 가장 잘 사용할 수 있도록 해준다.
- 자동화된 복구(self-healing) : 쿠버네티스는 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체하며, '사용자 정의 상태 검사'에 응답하지 않는 컨테이너를 죽이고, 서비스 준비가 끝날 때까지 그러한 과정을 클라이언트에 보여주지 않는다.
- 시크릿과 구성 관리 : 쿠버네티스를 사용하면 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리 할 수 있다. 컨테이너 이미지를 재구성하지 않고 스택 구성에 시크릿을 노출하지 않고도 시크릿 및 애플리케이션 구성을 배포 및 업데이트 할 수 있다.
쿠버네티스와 도커의 차이
예시
* 컨테이너 하나 띄워서 사용할 경우 => 도커
* 0월 0시에 100개의 컨테이너를 자동으로 생성할 경우 => 쿠버네티스쿠버네티스는 여러 컨테이너를 관리/예약하는 도구이고, 도커는 여러 컨테이너를 관리/예약하는 플랫폼이다. 도커는 '기술적인 개념이자 도구'이고 쿠버네티스는 '도커를 관리하는 툴'이라고 볼 수 있다. 이미지를 컨테이너에 띄우고 실행하는 기술이 도커이고, 이런 도커를 기반으로 컨테이너를 관리하는 서비스가 쿠버네티스라고 볼 수 있다.
즉, 도커는 '한 개의 컨테이너'를 관리하는 데 최적화되어 있고, 쿠버네티스는 '여러 개의 컨테이너'를 서비스 단위로 관리하는 데 최적화 되어있다.
참고
https://wooono.tistory.com/109
https://www.samsungsds.com/kr/insights/220222_kubernetes1.html
'STUDY > Docker' 카테고리의 다른 글
Dockerfile (0) 2023.02.22 도커와 도커 명령어 (0) 2023.02.21 컨테이너 (0) 2023.02.20 Docker (0) 2022.11.21 마이크로서비스 아키텍처 (0) 2022.10.18