https://kubernetes.io/docs/concepts/overview/

 

Overview

Kubernetes is a portable, extensible, open source platform for managing containerized workloads and services, that facilitates both declarative configuration and automation. It has a large, rapidly growing ecosystem. Kubernetes services, support, and tools

kubernetes.io

이 글은 쿠버네티스 공식 영어 문서를 제 임의대로 약간(?) 수정하여 한국어로 수정하였습니다. 따라서 쿠버네티스에 대한 정확한 개요를 원하시는 분께서는 공식 영어 문서를 참조해주세요.

개요

Kubernetes는 선언적 구성과 자동화를 모두 촉진하는 컨테이너화된 워크로드 및 서비스를 관리하기 위한 이식 가능하고 확장 가능한 오픈 소스 플랫폼입니다. 규모가 크고 빠르게 성장하는 생태계를 가지고 있습니다.

Kubernetes라는 이름은 조타수 또는 조종사를 의미하는 그리스어에서 유래되었습니다. K8s는 "K"와 "s" 사이의 8개 문자를 세어 만든 약어입니다. Google은 2014년에 Kubernetes 프로젝트를 오픈소스화했습니다. Kubernetes는 Google이 15년 넘게 대규모로 프로덕션 워크로드를 실행한 경험과 커뮤니티의 동급 최고의 아이디어 및 사례를 결합합니다.

 

 

과거에는. . .

과거와 비교하며 Kubernetes가 왜 유용한지 살펴보겠습니다.

기존 배포 방식 (Traditional Deployment):

초기에 조직은 물리적 서버에서 애플리케이션을 실행했습니다. 물리적 서버에서는 애플리케이션에 대한 리소스 경계를 정의할 방법이 없었으며 이로 인해 리소스 할당 문제가 발생했습니다. 예를 들어, 여러 애플리케이션이 물리적 서버에서 실행되는 경우 한 애플리케이션이 대부분의 리소스를 차지하여 결과적으로 다른 애플리케이션의 성능이 저하되는 경우가 있을 수 있습니다. 이에 대한 해결책은 각 애플리케이션을 서로 다른 물리적 서버에서 실행하는 것입니다. 그러나 리소스 활용도가 낮기 때문에 확장이 불가능했고 조직에서 많은 물리적 서버를 유지하는 데 비용이 많이 들었습니다.

가상화 배포 방식 (Virtualized Deployment):

솔루션으로 가상화가 도입되었습니다. 이를 통해 단일 물리적 서버의 CPU에서 여러 가상 머신(VM)을 실행할 수 있습니다. 가상화를 사용하면 VM 간에 애플리케이션을 격리할 수 있으며, 한 애플리케이션의 정보를 다른 애플리케이션에서 자유롭게 액세스할 수 없으므로 보안 수준을 제공합니다.

가상화를 사용하면 물리적 서버의 리소스 활용도가 향상되고 애플리케이션을 쉽게 추가하거나 업데이트할 수 있고 하드웨어 비용을 절감할 수 있으므로 확장성이 향상됩니다. 가상화를 사용하면 일련의 물리적 리소스를 일회용 가상 머신 클러스터로 제공할 수 있습니다.

각 VM은 가상화된 하드웨어 위에 자체 운영 체제를 포함한 모든 구성 요소를 실행하는 완전한 시스템입니다.

컨테이너 배포 방식 (Container Deployment)

컨테이너는 VM과 유사하지만 애플리케이션 간에 운영 체제(OS)를 공유하기 위한 완화된 격리 속성을 가지고 있습니다. 따라서 컨테이너는 경량으로 간주됩니다. VM과 유사하게 컨테이너에는 자체 파일 시스템, CPU 공유, 메모리, 프로세스 공간 등이 있습니다. 기본 인프라에서 분리되므로 클라우드와 OS 배포판 간에 이식 가능합니다.

 

컨테이너의 이점

  • 민첩한 애플리케이션 생성 및 배포: VM 이미지 사용에 비해 컨테이너 이미지 생성의 용이성과 효율성이 향상되었습니다.
  • 지속적인 개발, 통합 및 배포: 빠르고 효율적인 롤백을 통해 안정적이고 빈번한 컨테이너 이미지 빌드 및 배포를 제공합니다(이미지 불변성으로 인해).
  • 개발 및 운영의 우려 사항 분리: 배포 시간이 아닌 빌드/릴리스 시간에 애플리케이션 컨테이너 이미지를 생성하여 인프라에서 애플리케이션을 분리합니다.
  • 관찰 가능성: OS 수준 정보 및 지표뿐만 아니라 애플리케이션 상태 및 기타 신호도 표시합니다.
  • 개발, 테스트, 생산 전반에 걸친 환경적 일관성: 클라우드에서와 마찬가지로 노트북에서도 동일하게 실행됩니다.
  • 클라우드 및 OS 배포 이식성: Ubuntu, RHEL, CoreOS, 온프레미스, 주요 퍼블릭 클라우드 등 어디에서나 실행됩니다.
  • 애플리케이션 중심 관리: 가상 하드웨어에서 OS를 실행하는 것에서 논리적 리소스를 사용하여 OS에서 애플리케이션을 실행하는 것으로 추상화 수준을 높입니다.
  • 느슨하게 결합되고, 분산되고, 탄력적이고, 자유로운 마이크로 서비스: 애플리케이션은 더 작고 독립적인 조각으로 분할되며 하나의 큰 단일 목적 시스템에서 실행되는 모놀리식 스택이 아니라 동적으로 배포 및 관리될 수 있습니다.
  • 리소스 격리: 예측 가능한 애플리케이션 성능.
  • 자원 활용: 높은 효율성과 밀도.

 

Kubernetes가 필요한 이유와 Kubernetes가 수행할 수 있는 작업

컨테이너는 애플리케이션을 번들링하고 실행하는 좋은 방법입니다. 프로덕션 환경에서는 애플리케이션을 실행하는 컨테이너를 관리하고 가동 중지 시간이 없는지 확인해야 합니다. 예를 들어 컨테이너가 작동 중지되면 다른 컨테이너를 시작해야 합니다.

Kubernetes는 분산 시스템을 탄력적으로 실행할 수 있는 프레임워크를 제공합니다. 애플리케이션의 확장 및 장애 조치를 관리하고 배포 패턴 등을 제공합니다. 예시: Kubernetes는 시스템의 카나리아 배포를 쉽게 관리할 수 있습니다.

 

Kubernetes가 제공할 수 있는 이점

  • 서비스 검색 및 로드 밸런싱 Kubernetes는 DNS 이름 또는 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있습니다. 컨테이너에 대한 트래픽이 높으면 Kubernetes는 배포가 안정적이도록 네트워크 트래픽의 부하를 분산하고 분산할 수 있습니다.
  • 스토리지 오케스트레이션 Kubernetes를 사용하면 로컬 스토리지, 퍼블릭 클라우드 공급자 등 원하는 스토리지 시스템을 자동으로 마운트할 수 있습니다.
  • 자동화된 롤아웃 및 롤백 Kubernetes를 사용하여 배포된 컨테이너에 대해 원하는 상태를 설명할 수 있으며 실제 상태를 제어된 속도로 원하는 상태로 변경할 수 있습니다. 예를 들어 Kubernetes를 자동화하여 배포를 위한 새 컨테이너를 생성하고, 기존 컨테이너를 제거하고, 모든 리소스를 새 컨테이너에 채택할 수 있습니다.
  • 자동 바이너리 패킹 쿠버네티스에게 컨테이너화된 작업을 실행할 수 있는 노드 클러스터를 제공합니다. 쿠버네티스에게 각 컨테이너가 얼마나 많은 CPU와 메모리(RAM)가 필요한지 알려줍니다. 쿠버네티스는 리소스를 최적으로 활용하기 위해 컨테이너를 노드에 맞게 배치할 수 있습니다.
  • 자가 치유(Self-healing) 쿠버네티스는 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체하며, 사용자가 정의한 헬스 체크에 응답하지 않는 컨테이너를 종료하고, 클라이언트에게 제공 준비가 될 때까지 이를 공개하지 않습니다.
  • 비밀 및 구성 관리 쿠버네티스는 비밀과 같은 민감한 정보(비밀번호, OAuth 토큰, SSH 키 등)를 저장하고 관리할 수 있습니다. 컨테이너 이미지를 다시 빌드하지 않고 비밀 및 애플리케이션 구성을 배포하고 업데이트할 수 있으며, 스택 구성에서 비밀을 노출시키지 않습니다.
  • 배치 실행 서비스 외에도 쿠버네티스는 원하는 경우 실패한 컨테이너를 교체하여 배치 및 CI 워크로드를 관리할 수 있습니다.
  • 수평 스케일링 CPU 사용량에 따라 간단한 명령, UI 또는 자동으로 애플리케이션을 확장하고 축소합니다.
  • IPv4/IPv6 이중 스택 Pod 및 서비스에 IPv4 및 IPv6 주소를 할당합니다.
  • 확장성을 위해 설계 상위 소스 코드를 변경하지 않고 쿠버네티스 클러스터에 기능을 추가할 수 있도록 설계되었습니다.

 

쿠버네티스가 아닌 것 What Kubernetes is not

쿠버네티스는 전통적인 모든 기능이 포함된 PaaS(Platform as a Service) 시스템이 아닙니다. 쿠버네티스는 하드웨어 수준이 아닌 컨테이너 수준에서 작동하기 때문에 배포, 확장, 로드 밸런싱과 같은 PaaS 제공 기능에 일반적으로 적용되는 몇 가지 기능을 제공하지만 사용자가 로깅, 모니터링 및 경고 솔루션을 통합할 수 있도록 합니다. 그러나 쿠버네티스는 단일체가 아니며 이러한 기본 솔루션은 선택 사항이며 플러그인 가능합니다. 쿠버네티스는 개발자 플랫폼을 구축하기 위한 기본 블록을 제공하지만 사용자의 선택과 유연성을 중요시합니다.

 

쿠버네티스는. . .

  • 쿠버네티스가 지원하는 애플리케이션 유형을 제한하지 않습니다. 쿠버네티스는 상태가 없는(stateless), 상태를 유지하는(stateful), 데이터 처리 작업 등 다양한 작업 유형을 지원하기 위해 노력합니다. 애플리케이션이 컨테이너에서 실행될 수 있다면, 쿠버네티스에서도 잘 실행될 것입니다.
  • 쿠버네티스는 소스 코드를 배포하거나 애플리케이션을 빌드하지 않습니다. 지속적 통합, 전달 및 배포(CI/CD) 워크플로는 조직 문화와 선호도 및 기술적 요구에 따라 결정됩니다.
  • 쿠버네티스는 미들웨어(예: 메시지 버스), 데이터 처리 프레임워크(예: 스파크), 데이터베이스(예: MySQL), 캐시, 클러스터 스토리지 시스템(예: Ceph)과 같은 응용 프로그램 수준의 서비스를 제공하지 않습니다. 이러한 구성 요소는 쿠버네티스에서 실행될 수 있으며, Open Service Broker와 같은 이식 가능한 메커니즘을 통해 쿠버네티스에서 실행 중인 애플리케이션에서 액세스할 수 있습니다.
  • 쿠버네티스는 로깅, 모니터링 또는 경고 솔루션을 지시하지 않습니다. 몇 가지 통합을 개념 증명으로 제공하고 메트릭을 수집하고 내보내는 메커니즘을 제공합니다.
  • 쿠버네티스는 구성 언어/시스템(예: Jsonnet)을 제공하거나 채택하지 않습니다. 임의의 형태의 선언적 명세를 대상으로 하는 선언적 API를 제공합니다.
  • 쿠버네티스는 종합적인 기계 구성, 유지 관리, 관리 또는 자가 치유 시스템을 제공하거나 채택하지 않습니다.
  • 또한, 쿠버네티스는 단순한 오케스트레이션 시스템이 아닙니다. 실제로, 오케스트레이션의 필요성을 제거합니다. 오케스트레이션의 기술적 정의는 정의된 워크플로를 실행하는 것입니다: 먼저 A를 하고, 그 다음에 B를 하고, 그 다음에 C를 합니다. 반면에 쿠버네티스는 현재 상태를 지속적으로 제공된 원하는 상태로 이동시키는 독립적이고 조립 가능한 제어 프로세스 집합으로 구성됩니다. A에서 C로 가는 방법이 중요하지 않아야 합니다. 중앙 집중식 제어도 필요하지 않습니다. 이로 인해 사용하기 쉽고 강력하며 견고하고 탄력적이며 확장 가능한 시스템이 됩니다.

 

추가적인 내용

  1. kubelet:
    • kubelet은 각 노드에서 실행되는 Kubernetes의 에이전트입니다. 마스터 노드에서 발행된 명령을 수신하고 노드 상태를 보고합니다.
    • kubelet은 각 노드에서 Pod을 관리하고, Pod을 구성하는 컨테이너를 실행하고 모니터링합니다.
    • kubelet은 API 서버와 통신하여 배치할 Pod의 목록을 받고, 해당 노드에서 Pod을 실행하고 상태를 유지 관리합니다.
  2. kube-proxy:
    • kube-proxy는 Kubernetes 클러스터에서 서비스의 네트워크 트래픽을 관리하는 데 사용됩니다.
    • 서비스가 생성될 때 kube-proxy는 해당 서비스를 위한 가상 IP 주소와 포트를 할당하고, 서비스에 대한 요청을 실제 Pod으로 라우팅합니다.
    • 이를 통해 클러스터 외부에서 서비스에 접근할 수 있고, 서비스의 로드 밸런싱 및 고가용성을 제공할 수 있습니다.
  3. Container Runtime:
    • 컨테이너 런타임은 컨테이너를 실행하고 관리하는 데 사용되는 소프트웨어입니다. Kubernetes는 여러 가지 컨테이너 런타임을 지원하며, 대표적으로 Docker, containerd, CRI-O 등이 있습니다.
    • 컨테이너 런타임은 Docker와 같은 도구를 사용하여 컨테이너 이미지를 다운로드하고 실행하며, 컨테이너의 라이프사이클을 관리합니다.
    • Kubernetes는 컨테이너 런타임과 통신하여 Pod을 생성하고 관리합니다.

+ Recent posts