k8s

[k8s] Kubernetes Overview

hseoky 2024. 6. 14. 20:36
728x90

monolithic application과 micro service

 

하나의 애플리케이션에서 모든 서비스의 코드가 배포되는 기존의 `monolithic` 애플리케이션들은 높은 코드 복잡성, 긴 빌드 시간, 단일 프로세스에서 실행되기 때문에 개별 기능의 스케일링이 거의 불가능하다는 등의 단점 때문에, 많은 기업에서 개별 서비스로 나누어 관리하는 `micro service` 방식을 사용하고 있다.

 

마이크로 서비스(micro service)

  • 개별 서비스로 나누어 관리, 운영하는 소프트웨어 아키텍처 접근 방식
  • 별도의 서버에 개별적으로 배포할 수 있음
  • 각 서비스와 호스트 시스템에 필요한 리소스만을 사용하여 컴퓨팅 자원 비용 절감이 가능
  • 서비스 지향 아키텍쳐(SOA) 원칙과 일치하며 애플리케이션이 작은 독립된 프로세스로 구성됨
  • 프로세스가 분산되어 아키텍처 복잡성을 증가시키지만, 전체 애플리케이션이 모듈화되면서 각 마이크로 서비스는 개별 확장이 가능해짐
  • 무중단 업그레이드, 패치 프로세스 등이 가능하며, 개별 기능에 더 집중할 수 있음

 

서비스 지향 아키텍쳐(SOA)란?

서비스 지향 아키텍쳐(SOA)는 서비스라는 구성 요소를 통해 애플리케이션을 생성하는 소프트웨어 개발 방식으로, 각 서비스는 독립적으로 작동하고 서로 통신이 가능하다. SOA를 통해 서로 다른 시스템 내의 서비스를 재사용하거나, 독립적인 여러 서비스를 결합하여 복잡한 비즈니스 로직을 구현할 수 있다.

 

컨테이너(Container)

컨테이너를 사용하면 어떤 인프라에서도 고성능, 확장 가능한 애플리케이션을 제공할 수 있다. 위 사진처럼 컨테이너들은 도커(Docker)와 같은 Container Runtime 위에서 동작하면서 각 컨테이너들은 애플리케이션에서 필요한 종속성(라이브러리, 실행 파일 등)을 포함하여 독립된 환경에서 실행될 수 있다. 이러한 특징들 덕분에 격리된 환경에서 실행중인 다른 애플리케이션과 간섭 없이 실행될 수 있는 가상 환경을 제공하기 때문에, 마이크로 서비스에 적합하다.

 

Container Orchestration

 

개발 환경(dev)에서는 애플리케이션을 하나의 호스트에서 컨테이너를 통해 실행해도 상관 없지만, 특정 요구 사항을 언제나 만족해야 하는 prod, QA 환경에서는 Fault-tolerance, 확장 가능성, 적절한 자원의 사용과 같은 부분에서 문제가 발생할 수 있다. 컨테이너 오케스트레이션(Container Orchestration)은 이런 요구사항을 충족시키면서 컨테이너의 배포와 관리를 자동화하는 도구이다. 이러한 컨테이너 오케스트레이션을 제공하는 서비스가 바로 Kubernetes이고, 이외에도 Amazon Elastic Container Service (ECS), Docker Swarm 등이 있다.

 

Container Orchestration의 기능

  • 컨테이너 클러스터링
    • 여러 개의 컨테이너를 묶어 하나의 서버처럼 사용할 수 있도록 지원
    • 컨테이너를 실행하는 호스트의 자원을 효율적으로 분배
  • 자동 스케일링(Auto Scaling)
    • 애플리케이션의 트래픽 양에 따라 자동으로 컨테이너 수를 조절하여 자원 사용량을 최적화
  • 로드 밸런싱(Load Balancing)
    • 컨테이너들을 조절하여 트래픽을 균등하게 분배하며 애플리케이션의 성능을 최적화
  • 자동 복구
    • 컨테이너 장애 발생 시 자동으로 복구
  • 모니터링
    • 컨테이너 상태를 모니터링하고 로그 수집하여 애플리케이션 성능과 문제 분석

 

쿠버네티스(k8s)란?

"Kubernetes is an open-source system for automating deployment, scaling, and management of containerized applications".

쿠버네티스(k8s)는 앞서 설명한 컨테이너 오케스트레이션을 지원하는 서비스 중 하나로, 컨테이너를 쉽고 빠르게 배포, 확장, 관리를 자동화해주는 오픈소스 플랫폼이다.

 

쿠버네티스 특징

  • Automatic bin packing
    • 리소스가 필요한 정도와 제약에 따라 자동으로 컨테이너들을 스케줄링하여 사용성을 극대화 한다.
  • Self-healing
    • 자동으로 문제가 발생한 노드의 컨테이너를 대체
  • Horizontal scaling
    • CPU와 메모리 같은 리소스 사용에 따라 자동으로 애플리케이션을 확장
  • Service discovery and load balancing
    • 컨테이너에 고유한 IP를 부여하고, 컨테이너 집합을 단일 서비스로 부여하는 경우 하나의 DNS 이름으로 접근하도록 로드 밸런싱을 제공
  • Automatic rollouts and rollbacks
    • 다운타임 없이 애플리케이션의 새로운 버전 및 설정에 대한 롤아웃 / 롤백이 가능
  • Secret and configuration management
    • 애플리케이션의 secret과 configuration 정보를 이미지와 독립적으로 구분하여 별도의 이미지 재 생성 없이 관리

 

쿠버네티스 컴포넌트

출처: https://kubernetes.io/ko/docs/concepts/overview/components/

쿠버네티스를 배포하면 클러스터를 얻는다. 쿠버네티스 클러스터는 노드라고 하는 작업 머신들로 이루어져 있는데, 각 노드들은 컨테이너화된 애플리케이션을 실행한다. 또한 가장 작은 작업 단위를 가지는 파드는 특정 노드에 배치되어 동작하게 된다. 이제 컨트롤 플레인과 노드, 파드의 역할에 대해 더 자세히 알아보자.

 

컨트롤 플레인(Control Plane) 컴포넌트

  • kube-apiserver
    • 쿠버네티스 컨트롤 플래인의 프론트엔드
    • 쿠버네티스 클러스터로 들어오는 요청을 가장 먼저 처리
    • kubectl 등의 명령어를 수행하면 kube-apiserver로 전송되고, 이를 적절한 컴포넌트로 전달해준다.
  • etcd
    • 쿠버네티스 클러스터, 리소스 구성 정보, 상태 정보, 명세 정보 등을 키-값(key-value) 형태로 저장하는 저장소
  • kube-scheduler
    • 새로 생성된 파드를 감지하여 어떤 노드로 배치할지 결정하는 작업인 스케줄링을 담당한다.
  • kube-controller-manager
    • 다운된 노드가 없는지, 파드가 의도한 복제 숫자를 유지하는지, 서비스와 파드는 적절하게 연결되어 있는지 등을 확인하고 이를위한 적절한 조치를 담당한다.

 

노드(Node) 컴포넌트

  • kubelet
    • 노드에서 컨테이너가 동작하도록 관리해 주는 핵심 요소.
    • 각 노트에서 파드를 생성하고 정상적으로 동작하는지 관리하는 역할을 담당.
    • 파드를 관리하기 위한 YAML을 적용하기 위해 kubectl 명령어를 사용하면 YAML이 kube-apiserver로 전송된 후 kubelet으로 전달된다. 이 YAML을 통해 전달된 파드를 생성하거나 변경하고, 정상적으로 작동하는지 확인한다.
  • container runtime
    • 파드에 포함된 컨테이너의 실행을 실질적으로 담당하는 애플리케이션
  • kube-proxy
    • 쿠버네티스 클러스터 내부에서 네트워크 요청을 전달하는 역할을 담당

 

파드(Pod)

  • 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위
  • 하나 이상의 컨테이너의 그룹으로, 이 그룹은 스토리지와 네트워크를 공유한다.

 

참고 글

https://kubernetes.io/
https://www.edx.org/learn/kubernetes/the-linux-foundation-introduction-to-kubernetes
https://kubernetes.io/ko/docs/concepts/overview/components/
https://kubernetes.io/ko/docs/reference/glossary/?fundamental=true
https://www.samsungsds.com/kr/insights/kubernetes-3.html
728x90