Basics of Kubernetes

쿠버네티스란?

  • 컨테이너 오케스트레이션 도구

  • 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화

  • 구글의 컨테이너 워크로드 운영 경험에서 시작

  • 오픈소스 (최초의 CNCF 프로젝트)

  • 다양하고 빠르게 발전하는 컨테이너 Ecosystem의 중심

  • Helmsman, Pilot을 뜻하는 그리스어에서 유래

  • 코드명 "세븐" (스타트랙 1등 항해사 Seven of Nine에서 유래) - 로고에 그 뜻이 숨어있음

  • 쿠버네티스, 쿠버, 쿠베, 큐브, k8s 등으로 불림

쿠버네티스 기능

  • 서비스 디스커버리 : 유동적으로 생성되는 컨테이너간에 통신을 제

  • 오토스케일링 : 애플리케이션 부하에 따라 수직적 또는 수평적 확장

  • 로드 밸런싱 : 네트워크 트래픽을 다수의 컨테이너로 분산

  • 스토리지 오케스트레이션 : 원하는 스토리지 시스템을 자동으로 마운트할 수 있는 기능 제공

  • 자동화된 롤아웃과 롤백 : 현재 상태를 원하는 상태로 설정한 속도에 따라 변경

  • 자동화된 빈 배킹 : 각 컨테이너 필요한 CPU 및 메모리 양 설정

  • 자동화된 복구 : 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체하며 상태 검사에 응답하지 않는 컨테이너를 종료

  • 시크릿과 구성 관리 : OAuth 토큰 및 SSH 키와 같은 중요한 정보 저장 및 관리

쿠버네티스 아키텍쳐

  • Microservices

  • Decoupling

  • API driven

  • Declarative

컨트롤 플레인 구성요소

kube-apiserver

  • Kubernetes API를 노출하는 컴포넌트

  • kubectl 등으로부터 리소스를 조작하라는 지시를 받음

  • API 서버는 최종 사용자, 클러스터의 다른 부분 그리고 외부 컴포넌트가 서로 통신할 수 있도록 HTTP API를 제공

etcd

  • 고가용성을 갖춘 분산 키-값 스토어 (key-value store)

  • 쿠버네티스 클러스터에서 생성, 관리되는 모든 객체에 대한 정보를 저장

kube-scheduler

  • 노드를 모니터링하고 애플리케이션(Pod)을 배치할 적절한 노드를 선택

  • Pod에 명시된 요구 사항(CPU, 메모리등의 리소스) 및 제한 사항(특정 Pod와 같은 노드에 배포되어야 한다던지 특정 라벨을 가진 노드에 배포되어야 한다는 등등)과 노드의 리소스 현황 및 제한사항등을 확인

kube-controller-manager

  • Pod를 복제하거나 노드 운영 등 각 리소스를 제어하는 컨트롤러들을 감독하고 실행

  • 노드 컨트롤러, 레플리케이션 컨트롤러, 디플로이먼트 컨트롤러 등

cloud-controller-manager

  • AWS, Auzre, GCP 등의 퍼블릭 클라우드 및 VMware, OpenStack 등의 프라이빗 클라우드에 쿠버네티스 클러스터를 구축, 운영할 할때 해당 클라우드 제공자의 API에 통해서 VM, 로드밸런서, 볼륨등의 클라우드 리소스를 생성 및 관리

  • AWS를 예를 들면 Service 타입을 LoadBalancer로 지정할 경우 ELB가 생성되고 PersistentVolume을 생성할 경우 EBS 볼륨이 생성됨

노드 구성요소

kubelet

  • 클러스터의 각 노드에서 실행되는 에이전트

  • 컨트롤 플레인으로부터의 요청을 처리 (컨테이너 생성 및 상태 확인)

kube-proxy

  • 클러스터의 각 노드에서 실행되는 네트워크 프록시

  • 노드의 네트워크 규칙을 유지 관리하여 내부 네트워크 세션이나 클러스터 바깥에서 파드로 네트워크 통신을 할 수 있도록 함

container runtime

  • 컨테이너 런타임은 컨테이너 실행을 담당하는 소프트웨어

  • 도커(Docker), containerd 등

컨터이너 생성 프로세스

  1. 사용자가 생성할 컨테이의 정보가 명시된 Manifest 파일을 HTTP 요청으로 Kubernetes API 서버로 전송

  2. API 서버는 Manifest 파일에 명시된 정보를 ETCD에 저장

  3. 해당 객체(Pod, ReplicaSet, Deployment, StatefulSet, DaemonSet, etc) 를 담당하는 Controller가 객체를 생성 (해당 정보를 API 서버로 객체에 대한 정보를 보내고 API서버가 ETCD에 저장)

  4. Scheduler가 Pod를 배포할 노드를 지정

  5. Kubelet이 자신이 설치된 노드에 Pod가 배정된걸 확인하고 컨테이너 생성

  6. Kube Proxy가 컨테이너 생성을 감지하고 해당 컨테이너 IP 주소를 업데이트

  7. Kubelet 및 해당 객체를 담당하는 Controller가 객체 및 컨테이너의 상태 확인

Last updated