CKA 자격증 준비 과정에서 Udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests 강의를 수강하고 정리한 내용입니다. 대부분의 자료는 해당 강의의 자료이며, 이외 레퍼런스는 관련 내용 상단에 표기하였으니 참고 바랍니다.
1. Kubernetes(쿠버네티스)란?
Kubernetes : 컨테이너 오케스트레이션 도구
* 컨테이너 : 가상화 기술의 일종으로, 애플리케이션 실행 환경을 OS 레벨로 가상화하여 격리시키는 것 (e.g. 도커)
* 오케스트레이션 : 컴퓨터 자원과 애플리케이션, 서비스에 대한 자동화된 설정, 관리 및 제어체계
즉, 다시 말해 Kubernetes란 컨테이너화된 애플리케이션에 대한 자동화된 설정, 관리, 제어체계
입니다.
Kubernetes를 잘 이해하기 위해서는 먼저 가상화 기술과 컨테이너란 어떤 개념인지를 먼저 이해해야 합니다.
2. 가상화 기술
가상화(假像化, virtualization)는 컴퓨터에서 컴퓨터 리소스의 추상화를 일컫는 광범위한 용어이다. "물리적인 컴퓨터 리소스의 특징을 다른 시스템, 응용 프로그램, 최종 사용자들이 리소스와 상호 작용하는 방식으로부터 감추는 기술"로 정의할 수 있다. 이것은 다중 논리 리소스로서의 기능을 하는 것처럼 보이는 서버, 운영 체제, 응용 프로그램, 또는 저장 장치와 같은 하나의 단일 물리 리소스를 만들어 낸다. 아니면 단일 논리 리소스처럼 보이는 저장 장치나 서버와 같은 여러 개의 물리적 리소스를 만들어 낼 수 있다. - Wikipedia
2.1. 가상화 기술이 왜 필요할까?
https://www.redhat.com/ko/topics/virtualization/what-is-virtualization
가상화는 물리적 머신을 효율적으로 활용하기 위해 필요합니다.
용도가 다른 3개의 서버를 운영할 때, 물리적 머신을 사용한다면 아래와 같이 구성해야 합니다.
3개의 서버가 각각 평균 30%의 자원만 사용한다면 물리적 머신의 각 70%는 유휴자원으로 남게 되는데요.
물리적 머신의 환경에서 한 서버에서 여러 개의 서비스를 처리하기 위해 각 서비스의 동작하는 환경과 네트워크 상황 등을 고려하는 것이 쉽지 않습니다.
OS와 라이브러리 버전, 환경변수, 네트워크 등을 모두 고려해야 하기 때문입니다.
이런 경우에 가상화 기술을 활용하면 한 서버에서 여러 개의 서비스를 별도의 환경에서 처리하는 것이 쉬워집니다.
위와 같이 가상화를 통해 한 서버에 메일 서비스와 레거시 애플리케이션 서비스를 가상화된 환경에서 따로 동작시킬 수 있습니다.
이 경우 첫 번째 서버의 사용률을 60%까지 높이고, 세 번째 서버를 다른 테스크를 처리하는 용도로 사용할 수 있고요.
가상화의 장점을 정리해보자면 대표적으로 4가지가 있습니다.
- 리소스 효율성 : 위에서 설명한 한 서버에서 여러 VM 운영으로 사용률 향상
- 관리 편의성 : 오류가 발생하기 쉬운 환경의 내부 설정 등을 자동화하여 관리
- 가동 중단 시간 최소화 및 장애 복구 탄력성 향상 : 다수의 복제 서버 운영하여 이슈 발생 시 다른 복제 서버로 운영 및 재구축
- 프로비저닝 고속화 : 가상 머신의 파괴 후 재구축 시간 최소화
2.2 컨테이너 가상화
https://itwiki.kr/w/컨테이너_가상화
컨테이너 가상화란, OS 레벨에서 어플리케이션 실행 환경을 격리함으로써 마치 다른 OS에서 동작하는 것과 같은 가상 실행 환경
을 제공하는 기술입니다.
Hypervisor : 가상머신을 생성하고 구동하는 소프트웨어
- Traditional Deployment
- 초기 조직은 애플리케이션을 물리 서버에서 실행
- 한 물리 서버에서 여러 애플리케이션의 리소스 한계를 정의할 방법이 없었기에, 리소스 할당의 문제 발생
- 물리 서버 하나에서 여러 애플리케이션을 실행하면, 리소스를 과다 사용하는 인스턴스가 다른 애플리케이션의 성능이 저하 유발
- 서로 다른 여러 물리 서버에서 각 애플리케이션을 실행하는 것은 리소스가 충분히 활용되지 않으며, 유지 비용 과다
- Virtualized Deployment
- 단일 물리 서버의 CPU에서 여러 가상 시스템 (VM)을 실행
- VM 간에 애플리케이션을 격리하고 애플리케이션의 정보를 다른 애플리케이션에서 자유롭게 액세스 할 수 없으므로, 일정 수준의 보안성을 제공
- 리소스를 보다 효율적으로 활용할 수 있으며, 쉽게 애플리케이션을 추가하거나 업데이트할 수 있고 하드웨어 비용을 절감할 수 있어 더 나은 확장성 제공
- 하지만 리소스를 VM에 미리 할당하기 때문에 실제로 사용하지 않더라도 할당한 리소스는 사용할 수 없게 묶여있으며, Guest OS의 리소스 사용이나 Host OS와의 통신 문제로 성능 상 오버헤드가 발생
- e.g. VMWare, Hyper-V, Virtual box
- Container Deployment
- Hypervisor 기반과 달리 Guest OS가 따로 없으며, 가상화된 환경은 Host OS(Linux Kernel)를 공유한다.
- 대부분의 경우 리눅스 컨테이너 기반이기에, 리눅스 환경에서만 동작하며 가상화할 수 있는 컨테이너도 리눅스만 가능하다.
- 실제 사용하는 만큼만 리소스가 할당되며, 성능 상의 오버헤드가 거의 없기에 물리 환경에서 실행하는 것과 성능이 유사하다.
- e.g. Docker, LXC, podman, containerd
3. 컨테이너 오케스트레이션이 왜 필요할까?
https://seongjin.me/kubernetes-core-concepts/
https://docs.microsoft.com/ko-kr/azure/architecture/guide/architecture-styles/microservices
마이크로서비스 아키텍처(MSA)에서는 프로젝트에 포함된 세부 기능들이 작은 서비스 단위로 분리되어 구축됩니다.
예를 들어 카카오톡의 유저가 뷰탭에 접근할 경우 아래와 같은 프로세스로 동작할 듯합니다. (예상)
- 클라이언트(유저)가 뷰탭 방문
- 카카오톡의 API Gateway에서
뷰탭 서비스(Microservice 1)
에 REST API 요청 - 뷰탭 서비스에서
뷰탭 추천 서비스(Microservice 2)
에 REST API 요청 - 뷰탭 추천 서비스에서 추천한 리스트대로 뷰탭 서비스에서 유저에게 결과 노출
위와 같이 대규모 프로젝트에서는 하나의 서비스는 수많은 마이크로 서비스들로 구성되어 있고, API를 통해 서로 통신하고 동작하는 형태로 동작합니다.
그리고 하나의 마이크로 서비스는 위에서 설명한 컨테이너 가상화 환경에서 개발되는 것이 흔합니다.
따라서 대규모 프로덕션 환경에서는 수십, 수백개의 컨테이너를 사용하고, 이런 수많은 컨테이너를 수동으로 관리하는 것은 불가능에 가까우며 가장 큰 4가지 이슈를 해결해야만 합니다.
- 배포 관리 : 어떤 컨테이너를 어느 호스트에 배치하여 구동시킬 것인가? 각 호스트가 가진 한정된 리소스에 맞춰 어떻게 최적의 스케줄링을 구현할 것인가? 어떻게 하면 이러한 배포 상태를 최소한의 노력으로 유지 관리할 수 있을 것인가?
- 제어 및 모니터링 : 구동 중인 각 컨테이너들의 상태를 어떻게 추적하고 관리할 것인가?
- 스케일링 : 수시로 변화하는 운영 상황과 사용량 규모에 어떻게 대응할 것인가?
- 네트워킹 : 이렇게 운영되는 인스턴스 및 컨테이너들을 어떻게 상호 연결할 것인가?
이런 4가지 이슈를 해결하고자 하는 것이 컨테이너 오케스트레이션이며, 그 중 현재 시장의 지배자가 된 것이 바로 Kubernetes(쿠버네티스)입니다.
참고로 쿠버네티스는 그리스어로 “키잡이"라는 뜻을 가지고 있는데, 문자 그대로 배가 컨테이너를 잘 실어 나를 수 있도록, 즉 컨테이너를 잘 관리할 수 있도록 하는 것을 목표로 구글 엔지니어들이 모여 개발하고 2014년에 발표된 프로젝트입니다.
또한 Kubernetes의 앞뒤글자를 제외한 ubernetes가 8자이기 때문에, k8s로 축약해서 부르기도 합니다.
'스터디 > DevOps' 카테고리의 다른 글
[Kubernetes] #4 ReplicaSet (0) | 2022.10.29 |
---|---|
[Kubernetes] #3 Pod (2) | 2022.10.08 |
[Kubernetes] #2 Kubernetes Architecture (0) | 2022.09.29 |
[Kubernetes] 쿠버네티스(Kubernetes)에서 주피터허브(JupyterHub)에 Random Port 설정하기 (0) | 2022.04.17 |
[Kubernetes] 쿠버네티스(Kubernetes)에서 주피터허브(JupyterHub) 구성하기 (2) | 2022.04.17 |