쿠버네티스(Kubernetes)의 개요와 주요 개념

쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 오픈 소스 플랫폼이다. 아래에서 쿠버네티스의 주요 개념과 아키텍처, 그리고 서비스 및 네트워킹에 대해 설명한다.

쿠버네티스 API 개요

쿠버네티스 API는 클러스터와 상호 작용할 수 있는 기본 인터페이스를 제공한다. 사용자는 쿠버네티스 객체를 생성, 업데이트, 삭제하거나 조회할 수 있다. 쿠버네티스의 모든 기능은 API를 통해 노출되며, 이를 통해 클러스터의 상태를 제어하고 원하는 상태로 유지할 수 있다.

API는 RESTful 인터페이스를 제공하며, JSON 형식으로 요청과 응답을 처리한다. 또한, 쿠버네티스 API는 버전 관리가 되며, 안정적인 API를 유지하기 위해 여러 단계의 안정성 수준(알파, 베타, 안정)을 사용한다.

쿠버네티스 객체

쿠버네티스 객체는 클러스터 내의 시스템 상태를 나타내는 지속 가능한 엔터티이다. 이러한 객체들은 특정 애플리케이션의 배포 및 런타임 환경을 정의한다. 주요 객체 유형으로는 Pod, Service, Deployment, ConfigMap, Secret 등이 있다.

  • Pod: 하나 이상의 컨테이너를 포함하는 가장 작은 배포 단위이다. Pod는 쿠버네티스에서 생성되고 관리되는 기본 실행 단위로, 동일한 네트워크 네임스페이스와 스토리지를 공유한다.
  • Service: 특정 Pod 집합에 대한 네트워크 접근 방식을 정의한다. 서비스는 클러스터 내에서의 로드 밸런싱을 제공하며, IP 주소를 통해 접근할 수 있다.
  • Deployment: 애플리케이션의 선언적 업데이트를 제공하는 객체이다. Deployment는 원하는 상태를 정의하고, 현재 상태를 원하는 상태로 자동으로 조정한다.
  • ConfigMap: 환경 설정 데이터를 저장하고 관리한다. ConfigMap은 설정 파일, 명령줄 인수, 환경 변수를 포함한 비밀이 아닌 설정 데이터를 저장하는 데 사용된다.
  • Secret: 민감한 데이터를 저장하고 관리한다. Secret은 비밀번호, OAuth 토큰, SSH 키와 같은 민감한 정보를 저장하는 데 사용된다.

manifest 예시 (deployment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

쿠버네티스 아키텍처

쿠버네티스 아키텍처는 여러 컴포넌트로 구성된다. 주요 구성 요소는 다음과 같다.

  • 마스터 노드: 클러스터의 제어 평면으로, API 서버, 컨트롤러 관리자, 스케줄러, etcd로 구성된다.
  • 노드: 실제 작업이 수행되는 워커 머신으로, kubelet, kube-proxy, 컨테이너 런타임을 포함한다.

마스터 노드 구성 요소

  • API 서버: 클러스터의 중앙 관리 지점으로, 모든 REST 요청을 처리한다. API 서버는 클러스터의 상태 정보를 etcd에 저장하고, 이를 기반으로 클러스터를 관리한다.
  • etcd: 모든 클러스터 데이터를 저장하는 키-값 저장소이다. etcd는 고가용성과 일관성을 제공하는 분산 키-값 저장소로, 쿠버네티스의 상태 데이터를 저장하는 데 사용된다.
  • 컨트롤러 관리자: 클러스터의 상태를 원하는 상태로 유지하기 위해 여러 컨트롤러를 실행한다. 컨트롤러 관리자에는 노드 컨트롤러, 레플리케이션 컨트롤러, 엔드포인트 컨트롤러 등이 포함된다.
  • 스케줄러: Pod를 적절한 노드에 할당한다. 스케줄러는 각 Pod의 리소스 요구 사항과 노드의 상태를 기반으로 최적의 노드를 선택한다.

노드 구성 요소

  • kubelet: 각 노드에서 실행되며, 컨테이너가 실행되도록 관리한다. kubelet은 API 서버와 통신하며, PodSpec에 따라 컨테이너를 실행하고 모니터링한다.
  • kube-proxy: 네트워크 프록시 및 로드 밸런서를 제공하여 서비스 간의 네트워크 트래픽을 관리한다. kube-proxy는 클러스터 내부의 네트워크 규칙을 설정하고, 서비스의 IP와 포트를 연결한다.
  • 컨테이너 런타임: 컨테이너를 실행하는 소프트웨어이다. (예: Docker, containerd) 컨테이너 런타임은 컨테이너 이미지를 다운로드하고, 컨테이너를 실행 및 관리하는 역할을 한다.

Kubernetes Architecture


쿠버네티스 아키텍처

쿠버네티스의 서비스 및 네트워킹

쿠버네티스에서 서비스는 하나 이상의 Pod에 대한 네트워크 접근 방식을 정의하는 추상화이다. 각 서비스는 클러스터 내에서 고유한 IP 주소를 가지며, 서비스 디스커버리와 로드 밸런싱을 제공한다.

주요 서비스 유형

  • ClusterIP: 클러스터 내에서만 접근 가능한 가상 IP를 할당한다. 이는 기본 서비스 유형으로, 내부 통신에 사용된다.
  • NodePort: 각 노드의 IP와 정해진 포트를 통해 접근할 수 있다. NodePort는 외부에서 클러스터의 서비스에 접근할 수 있도록 한다.
  • LoadBalancer: 클라우드 제공자의 로드 밸런서를 사용하여 외부에서 접근할 수 있다. LoadBalancer는 서비스에 대한 퍼블릭 IP를 제공하며, 클라우드 환경에서 주로 사용된다.
  • ExternalName: DNS 이름을 외부 서비스로 매핑한다. ExternalName은 서비스 이름을 외부 DNS 이름으로 변환하여 클러스터 외부의 서비스를 참조할 수 있게 한다.

네트워킹

쿠버네티스 네트워킹 모델은 Pod 간의 통신, Pod와 서비스 간의 통신, 외부와의 통신을 지원한다. 각 Pod는 고유한 IP 주소를 가지며, 동일한 네임스페이스 내에서는 IP로 직접 통신할 수 있다. 네트워킹 솔루션으로는 Flannel, Calico, Weave 등이 있다.

  • Flannel: 단순하고 간단한 오버레이 네트워크 솔루션으로, 각 노드에 vxlan 터널을 설정하여 Pod 간의 통신을 가능하게 한다.
  • Calico: 네트워크 정책을 지원하는 고성능 네트워킹 솔루션으로, BGP를 사용하여 네트워크 트래픽을 라우팅한다.
  • Weave: 간단한 설치와 자동화된 네트워크 구성 기능을 제공하는 네트워킹 솔루션으로, 네트워크 격리와 보안 정책을 지원한다.