Kubernetes 기본 개념 정리

신동수·2024년 2월 26일
0

K8S

목록 보기
1/14

Kubernetes

쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션을 배포, 관리, 확장할 때 수반되는 다수의 수동 프로세스를 자동화하는 오픈소스 컨테이너 오케스트레이션 플랫폼이다.

쿠버네티스 아키텍처


쿠버네티스를 배포하면 클러스터를 얻는다. 그리고 이 클러스터는 노드들의 집합이다. 노드들은 크게 두 가지 유형으로 나눠지는데, 각각이 컨트롤 플레인과 데이터 플레인이 있다.

컨트롤 플레인(Control Plane)/마스터 노드(Master Node)
워커 노드와 클러스터 내 파드를 관리하고 제어한다.

구성 요소

  • kube-apiserver
    • k8s API를 사용하도록 요청을 받고 유형이 유효한지 검사
    • 쿠버네티스 클러스트의 중심 역할을 하는 통로
    • 그 밖의 요소들도 API 서버를 중심에 두고 통신하므로 역할이 매우 중요
  • etcd
    • key-value 타입의 저장소
    • 구성 요소들의 상태 값이 모두 저장되는 곳 (쿠버네티스 상태 정보, 워커 노드의 상태 정보, 컨테이너 상태, 이미지 상태 등)
    • etcd는 분산 저장이 가능한 Key-Value 저장소이므로, 복제해 여러 곳에 저장해 두면 하나의 etcd에서 장애가 나타나고 시스템의 가용성 확보 가능
  • kube-controller manager
    • 쿠버네티스 클러스터의 오브젝트 상태를 관리
    • 워커 노드에서 통신이 되지 않는 경우, 상태 체크와 복구는 쿠버네티스 클러스터에 속한 노드 컨트롤러에서 이루어진다.
  • kube-scheduler
    • 노드의 상태와 자원, 레이블, 요구 조건 등을 고려해 파드를 어떤 워커 노드에 생성할 것인지를 결정하고 할당
    • 파드를 조건에 맞는 워커 노드에 지정하고, 파드가 워커 노드에 할당되는 일정을 관리하는 역할을 담당

데이터 플레인(Data Plane)
워커 노드(Worker Node)들로 구성되어 있으며 컨테이너화된 애플리케이션의 구성 요소인 파드를 호스팅한다.

구성 요소

  • kubelet
    • 모든 노드에서 실행되는 k8s 에이전트로 데몬 형태로 동작
    • 파드의 구성 내용(PodSpec)을 받아서 컨테이너 런타임으로 전달하고, 파드 안의 컨테이너들이 정상적으로 작동하는지 모니터링 (cadvisor 라는 컨테이너 모니터링 툴이 포함)
  • kube-proxy
    • k8s의 네트워크 동작을 관리하며 iptables rule을 구성
  • container runtime
    • 컨테이너를 실행하는 엔진 (docker, containerd, CRI-O 등)

쿠버네티스 동작순서


1. kubectl을 통해 API 서버에 파드 생성 요청
2. (업데이트가 있을 때 마다 매번) API 서버에 전단될 내용이 있으면 API 서버는 etcd에 전달된 내용을 모두 기록해 클러스터의 상태 값을 최신으로 유지, 각 요소가 상태를 업데이트 할 때마다 모두 API서버를 통해 etcd에 기록
3. API서버에 파드 생성이 요청된 것을 컨트롤러 매니저가 인지하면 컨트롤러 매니저가 파드를 생성하고, 이 상태(생성했다!)를 API 서버에 전달. (아직 어떤 워커 노드에 파드를 적용할지는 결정되지 않은 상태로 파드만 생성)
4. API 서버에 파드에 생성됐다는 정보를 스케줄러가 인지. 스케쥴러는 생성된 파드를 어떤 워커 노드에 적용할지 조건을 고려해 결정하고 해당 워커 노드에 파드를 띄우도록 요청(API 서버에 요청)
5. API 서버에 전달된 정보대로 지정한 워커 노드에 파드가 속해있는지 스케줄러가 kubelet으로 확인(내 말대로 잘 띄웠니?)
6. kubelet에서 컨테이너 런타임으로 파드 생성을 요청
7. 파드가 생성이 되며, 사용 가능한 상태로 변경

쿠버네티스 오브젝트


Pod
파드는 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위이다. 이는 쿠버네티스 애플리케이션의 최소 단위, 즉, 웹 서비스를 구동하는 데 필요한 최소 단위로 하나 이상의 컨테이너를 포함한다.

Deployment
디플로이먼트는 쿠버네티스에서 상태가 없는 앱을 배포할 때 사용하는 가장 기본적인 컨트롤러이다. 실행시켜야 할 파드 개수를 유지하는 것 뿐 아니라, 앱을 배포할 때 롤링 업데이트하거나, 배포 도중 잠시 멈췄다가 다시 배포할 수 있다. 앱 배포 후 이전 버전으로 롤백할 수도 있다.

StatefulSet
스테이트풀셋은 애플리케이션의 스테이트풀을 관리하는데 사용하는 워크로드 API 오브젝트이다.
파드 집합의 디플로이먼트와 스케일링을 관리하며, 파드들의 순서 및 고유성을 보장한다 .
디플로이먼트와 유사하게, 스테이트풀셋은 동일한 컨테이너 스펙을 기반으로 둔 파드들을 관리한다. 디플로이먼트와는 다르게, 스테이트풀셋은 각 파드의 독자성을 유지한다. 이 파드들은 동일한 스팩으로 생성되었지만, 서로 교체는 불가능하다. 다시 말해, 각각은 재스케줄링 간에도 지속적으로 유지되는 식별자를 가진다.

Service
서비스는 동일한 서비스를 제공하는 Pod 그룹의 단일 진입점을 제공한다.
클러스터 내부에서 실행되는 Pod들은 언제든지 삭제되고 생성될 수 있으며 한군데에 고정해서 실행되지 않는다. Pod가 생성될 때마다 새로운 내부 IP를 할당하게 되므로, 클러스터 내/외부와 통신을 계속 유지하기 어렵기에 서비스를 통해 이렇게 동적으로 변하는 파드들에 고정적으로 접근할 수 있다.

Service 종류

  • ClusterIP : 가장 기본이 되는 Service 타입이며, 클러스터 내부 통신만 가능하고 외부 트래픽은 받을 수 없다.
  • NodePort : 클러스터 내부 및 외부 통신이 가능한 Service 타입이며, 노드의 포트를 사용한다. (30000-32767 사이의 포트 사용)
  • LoadBalancer : LoadBalancer는 기본적으로 외부에 존재하며, 보통 클라우드 프로바이더(AWS, GCP 등)와 함께 사용되어 외부 트래픽을 받는 역할을 받는다.

Ingress
Ingress는 HTTP나 HTTPS를 통해 클러스터 내부의 서비스를 외부로 노출한다.
클러스터 외부에서 접근해야 할 URL을 사용할 수 있도록 하고, 트래픽 로드밸런싱, SSL 인증서 처리, 도메인 기반 가상 호스팅도 제공한다.

Ingress 컨트롤러 종류

  • NGINX Ingress Controller
  • Kong Ingress Controller
  • AWS Load Balancer Controller
  • Google Load Balancer Controller
  • 등등...

참고

Deployment, StatefulSet 의 주요 차이점

  • Service vs Headless Service
    Deployment는 Service를 통해서 외부에 노출이 되고, Service로 request를 하면 random 하게 Pod가 선택된다.
    StatefulSet은 Headless Service를 통해 외부에 노출이 되고, 각 Pod별 고유한 DNS를 가지며 원하는 Pod를 지정해서 request를 해야 한다. (Service에 request 하는것은 불가능)
  • Rollback 및 ReplicaSet
    Deployment 는 내부적으로 ReplicaSet을 생성하여 Pod를 관리하며, rollback 이 가능하다. (rolling update시에 새로운 replicaset이 생성되며 기존 ReplicaSet의 개수는 줄고, 새로운 ReplicaSet의 개수가 늘어나는 방식)
    StatefulSet은 내부적으로 ReplicaSet을 생성하지 않으며 rollback이 불가하다.

쿠버네티스가 왜 필요한가?


프로덕션 환경에서는 애플리케이션을 실행하는 컨테이너를 관리하고 가동 중지 시간이 없는지 확인해야 한다. 예를 들어, 컨테이너가 다운된다면 다른 컨테이너를 다시 시작하여 가동 중지 시간을 최소화하여야 합니다.
이러한 동작을 시스템에 의해 처리할 수 있도록 하는 것이 쿠버네티스의 역할이다.

쿠버네티스에서 제공하는 기능


서비스 디스커버리와 로드 밸런싱 - DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출
스토리지 오케스트레이션 - 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재
자동화된 롤아웃과 롤백 - 원하는 상태를 서술하고 현재 상태를 원하는 상태로 설정한 속도에 따라 변경 가능
자동화된 빈 패킹 - 각 컨테이너가 필요로 하는 CPU와 메모리(RAM)를 제공
자동화된 복구(self-healing) - 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체
시크릿과 구성 관리 - 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리

참고 : 쿠버네티스의 개념과 기본 사용법
쿠버네티스 이해
왜 StatefulSet을 사용할까 (feat. deployment와의 차이점)

profile
조금씩 성장하는 DevOps 엔지니어가 되겠습니다. 😄

0개의 댓글

관련 채용 정보