GDSC Sookmyung 활동/10 min Seminar

#야나도#쿠버네티스#들어봤어

NayeonKeum 2022. 2. 28. 17:48

Why Kubernetes?

  • VM
    • 2, 3학년 이상이신 분들은 아마 IT공이면 서버운영 및 보안, 소웨학부면 시스템프로그래밍에서 CentOS를 사용하기 위해 가상머신을 띄워보신 적이 있으실 것 같습니다.
    • 가상머신은 가상화라는 기법을 기반으로 운영하는데요, 가상화란 물리서버 1대에 여러개의 논리 서버를 설치하여 CPU와 메모리를 분할하여 사용하는 기술입니다. 여기서 물리 서버는 여러분의 노트북, 논리 서버는 가상머신으로 깐 리눅스 기반 서버입니다.
    • 저는 수업때 거의 100기가에 해당하는 용량 공간이 필요했었는데 여러분은 어떠셨나요? 가상머신을 사용하면, 장비 자체의 OS 더하기 vm 자체의 게스트 os가 하나 더 들어가기 때문에 굉장히 무겁습니다. 그리고 매번 config나 포트를 설정해야하므로 굉장히 귀찮습니다. web, was, jar, war등의 파일을 매번 똑같이 빌드하고 설치하는 어려움도 있습니다.
    • , 두개만 띄운다면 할만하겠지만, 실제 이 서버를 운영하면서 초기에 생각했던 것보다 너무 잘 돼서 하나씩 계속 증설을 한다고 가정한다면, 여간 귀찮은 일이 아닐 것입니다.
    • 또한, 지난 시간에 현애님께 배운 MSA가 유행함에 따라 재사용성을 높였기 때문에 작은 단위의 서비스들의 잦은 배포가 필요하게 되었습니다. 배포를 할 때마다 config 설정하고, 포트 설정하고, 이러기가 힘들어 등장한 것이 컨테이너 입니다.
  • 컨테이너
    • 컨테이너의 경우 도커 파일에다가 내가 쓰고 싶은 작은 OS를 올리고 웹어스 파일 올리고, 어플리케이션 빌드 파일 올리고, run 같은 CMD 명령어 같은거 몇 개 올리고 말아서 도커 레지스트리에 컨테이너 이미지로 저장을 해놓고, 서비스를 띄우고 싶을 때마다 커맨드로 docker run image를 하고 띄우면 빠른 수정이 가능합니다. 잘 되면 이미지만 계속 더 띄우면 되므로 매번 config같은 설정을 할 필요가 없어졌습니다. 무척 간편해졌죠?
    • 이렇게 서비스 배포가 쉽다보니 확장성이 매우 뛰어나고, vm 처럼 진짜 게스트 os가 올라가는 것이 아니라, 가벼운 알파인 같은 os나 호스트 os를 같이 사용하기 때문에 굉장히 가볍습니다. 자주, 빠르게 배포하는 MSA 환경에 적합하죠?
    • 그러나 문제도 있습니다. 컨테이너 환경에서 버전을 업데이트하려고 하면, 업데이트가 될 동안 업데이트 이전 버전의 컨테이너를 내리고 새로 띄우면, 업데이트를 하는 동안 사용자들이 이전 버전에 접속할 수가 없습니다. 그냥 싹 죽이고 띄운다고 하면, 업데이트 시간 만큼 접속 장애가 나게 됩니다.
    • 따라서 시간차이 없이, 항상 사용자들이 접속할 수 있으려면 컨테이너를 아주 잘 관리할 필요가 있습니다. 그래서 등장한 것이 쿠버네티스 입니다.
  • 쿠버네티스
    • 쿠버네티스는 K8s, kube(큐브)라고도 불립니다.  K8s는 앞 뒤글자만 남기고 가운 데 글자수가 8이라 짧게 부르는 말입니다. 쿠버네티스는 컨테이너 오케스트레이션 툴인데요, 이름이 너무 길죠?
    • 오케스트레이션은 오케스트라를 생각하시면 좋을 것 같아요. 악기 하나하나 조화를 이루고, 지휘자가 그것을 모두 지휘하듯, 서로 연관이 있는 컨테이너들을 통합 관리하는 방법이 바로 컨테이너 오케스트레이션입니다.
    • 컨테이너를 쉽고 빠르게 배포/확장하고 관리를 자동화해주는 오픈소스 플랫폼이 더 명확한 정의가 될 것 같습니다.
    • 그래서 도커 컨테이너를 관리해주는 것을 쿠버네티스라고 부릅니다. 도커 스왐이라는 것도 있는데 요새는 쿠버네티스를 훨씬 더 많이 쓴다고 합니다.
    • 앞서 말씀드린 버전 간 이동 뿐 아니라, 블루그린 배포, 카나리 배포를 실형할 수 있도록 다양한 배포 방식을 지원하고, 헬스체크 FAIL나는 거 있으면 죽였다가 새로 만들어서 다시 띄우는 일도 합니다.
    • 쿠버네티스의 사상은 망가진 것은 고쳐쓰지 않는다인데요, 따라서 재사용하지 않고 행 걸려있거나 헬스체크가 안 되는 컨테이너가 있으면 죽이고 다시 새로운 것을 띄웁니다.
    • 쿠버네티스는 원래 Google 엔지니어들이 개발하고 설계한 플랫폼입니다. Google은 초창기에 Linux 컨테이너 기술에 기여(cgroups)하였으며 Google 제품이 컨테이너에서 어떻게 작동하는지 대중에게 공개하였습니다. 이는 Google의 클라우드 서비스를 구동하는 기술이기도 합니다. Google은 내부 플랫폼인 Borg를 통해 일주일에 20억 개 이상의 컨테이너 배포를 생성하고 있습니다. Borg는 쿠버네티스의 전신이었으며 수년 동안 Borg를 개발하는 과정에서 축적된 경험은 쿠버네티스 기술의 주요 원동력이 되었습니다.

 

K8s 클러스터 아키텍처

  • 작동 중인 쿠버네티스 배포를 클러스터라고 합니다. 쿠버네티스 클러스터는 컨트롤 플레인과 컴퓨팅 머신(또는 노드)의 2개 부분으로 시각화할 수 있습니다. 각 노드는 자체 Linux® 환경이며 물리 또는 가상 머신일 수 있습니다. 각 노드는 컨테이너로 이루어진 포드(Pod)를 실행합니다.

 

  • 컨트롤 플레인

쿠버네티스 클러스터의 신경 중추라 할 수 있는 컨트롤 플레인부터 살펴보겠습니다. 여기에는 클러스터를 제어하는 쿠버네티스 구성 요소와 클러스터의 상태 및 구성에 관한 데이터가 함께 있습니다. 이 핵심 쿠버네티스 구성 요소는 컨테이너가 필요한 리소스를 갖고 충분한 횟수로 실행되도록 하는 중요한 작업을 맡습니다.

컨트롤 플레인은 컴퓨팅 노드와 상시 연결되어 있습니다. 클러스터가 일정한 방식으로 실행되도록 구성했다면 컨트롤 플레인은 해당 방식에 따라 실행됩니다.

 

  • kube-apiserver

쿠버네티스 클러스터와 상호 작용해야 하나요? API에 요청하세요. 쿠버네티스 API는 쿠버네티스 컨트롤 플레인의 프론트엔드로, 내부 및 외부 요청을 처리합니다. API 서버는 요청이 유효한지 판별하고 유효한 요청을 처리합니다. REST 호출이나 kubectl 커맨드라인 인터페이스 또는 kubeadm과 같은 기타 CLI(command-line interface)를 통해 API에 액세스할 수 있습니다.

 

  • kube-scheduler

클러스터가 양호한 상태인가? 새 컨테이너가 필요하다면 어디에 적합한가? 쿠버네티스 스케줄러는 이러한 것들을 주로 다룹니다.

스케줄러는 CPU 또는 메모리와 같은 포드의 리소스 요구 사항과 함께 클러스터의 상태를 고려합니다. 그런 다음 포드를 적절한 컴퓨팅 노드에 예약합니다.

 

  • kube-controller-manager

컨트롤러는 실제로 클러스터를 실행하고 쿠버네티스 controller-manager에는 여러 컨트롤러 기능이 하나로 통합되어 있습니다. 하나의 컨트롤러는 스케줄러를 참고하여 정확한 수의 포드가 실행되게 합니다. 포드에 문제가 생기면 또 다른 컨트롤러가 이를 감지하고 대응합니다

 

  • etcd

설정 데이터와 클러스터의 상태에 관한 정보는 키-값 저장소 데이터베이스인 etcd에 상주합니다.

 

K8s Object

  • 노드

쿠버네티스 클러스터에는 최소 1개 이상의 컴퓨팅 노드가 필요하지만 일반적으로 여러 개가 있습니다. 포드는 노드에서 실행하도록 예약되고 오케스트레이션됩니다. 클러스터의 용량을 확장해야 한다면 노드를 더 추가하면 됩니다.

 

  • 포드

포드는 쿠버네티스 오브젝트 모델에서 가장 작고 단순한 유닛으로, 애플리케이션의 단일 인스턴스를 나타냅니다. 각 포드는 컨테이너 실행 방식을 제어하는 옵션과 함께 컨테이너 하나 또는 긴밀히 결합(로컬호스트)된 일련의 컨테이너로 구성되어 있습니다

 

  • 컨테이너 런타임 엔진

컨테이너 실행을 위해 각 컴퓨팅 노드에는 컨테이너 런타임 엔진이 있습니다. 그중 한 가지 예가 Docker입니다. 하지만 쿠버네티스는 rkt, CRI-O와 같은 다른 Open Container Initiative 호환 런타임도 지원합니다.

 

  • kubelet

각 컴퓨팅 노드에는 컨트롤 플레인과 통신하는 매우 작은 애플리케이션인 kubelet이 있습니다. kublet은 컨테이너가 포드에서 실행되게 합니다. 컨트롤 플레인에서 노드에 작업을 요청하는 경우 kubelet이 이 작업을 실행합니다.

 

  • kube-proxy

각 컴퓨팅 노드에는 쿠버네티스 네트워킹 서비스를 용이하게 하기 위한 네트워크 프록시인 kube-proxy도 있습니다. kube-proxy는 운영 체제의 패킷 필터링 계층에 의존하거나 트래픽 자체를 전달하여 클러스터 내부 또는 외부의 네트워크 통신을 처리합니다.

 

 

 

 

 

참고자료: 쿠버네티스/레드 공식 홈페이지

'GDSC Sookmyung 활동 > 10 min Seminar' 카테고리의 다른 글

Shader란?  (0) 2022.03.07
Promise와 async/await  (0) 2022.02.28
http와 https  (0) 2022.02.21
Microservice Architecture  (0) 2022.02.07
CS를 공부하는 이유  (0) 2021.06.28