[Kubernetes] 쿠버네티스란?

ryusudol·2023년 11월 9일
post-thumbnail

🐙 쿠버네티스란?

쿠버네티스(Kubernetes): 컨테이너를 쉽고 빠르게 배포/확장하고 관리를 자동화해주는 오픈소스 플랫폼

마이크로서비스, 클라우드 플랫폼 지향

Serverless, CI/CD, Machine Learning 등이 모두 쿠버네티스 위에서 작동


🐙 쿠버네티스 특징

  1. 글로벌 IT 기업들이 함께하는 Eco System
    → Google 등 거대 IT 기업들로 이루어져 세계적 스케일의 경험과 기술이 녹아 있음
  2. 다양한 배포 방식
    → Deployment, StatefulSets, DaemonSet, Job, CronJob 등 다양한 배포 방식 지원
  3. Ingress 설정
    → 설정한 Proxy 서버와 어플리케이션 간 연결 자동화, 1 Cluster N Ingress 가능
  4. Cloud 지원
    → Cloud Controller로 클라우드 연동 쉽게 확장
  5. Name Space & Label
    → 한 Cluster를 논리적으로 구분해서 사용
  6. RBAC (Role-Based Access Control)
    → 접근 권한 시스템
  7. CRD (Custom Resource Definition)
    → 쿠버네티스가 제공하지 않는 기능을 기본기능과 동일한 방식으로 사용 가능
  8. Auto Scaling
    → CPU / memory 사용랑, 현재 접속자 수에 따른 확장 가능
    → HPA, VPA, CA
  9. Federation, Multi Cluster
    → Cloud와 자체 서버 Cluster들을 하나로 묶어 사용 가능

🐙 쿠버네티스 기본 개념

Desired State

  • 쿠버네티스는 Current State를 Desired State와 비교하여 이에 맞추려 하는 로직으로 작동
  • 때문에 배포할 때 동작을 명령하지 않고 상태를 선언함 → 웹 서버 얼마나 많이? 어느 포트로?
  • 쿠버네티스를 사용하기 위해서는 어떤 State가 있고 이 State들을 어떻게 선언하는지 알아야 함

Kubernetes Object

1. Pod

  • 쿠버네티스 배포 최소 단위
    → 1개 이상의 Container와 Storage, Network 속성
    → Pod의 모든 Container는 Network와 Storage 공유 + 서로 localhost로 접근 가능

2. ReplicaSet

  • Pod을 하나 이상 복제하여 관리하는 객체
  • Pod을 생성하고 개수를 유지하기 위해서는 반드시 ReplicaSet 사용
  • 복제할 개수, 개수 확인할 Label 선택자, 생성할 Pod 템플릿 포함

3. Service

  • Network 관련 Object
  • Pod를 외부 네트워크와 연결 + 여러 개의 Pod를 바라보는 내부 Load Balancer 생성 시 사용
  • 내부 DNS에 서비스명을 도메인으로 등록하기 때문에 Service Discovery 역할도 수행

4. Volume

  • 저장소 관련 Object
  • 대부분의 저장 방식 지원

Object Spec

Object Specification은 YAML 파일로 정의
→ Object 종류, Desired State 선언

쿠버네티스 배포 방식

Desired State를 다양한 Object에 Label을 붙여 yaml 파일에 정의하고 API 서버에 전달


🐙 쿠버네티스 아키텍처

Master - Node 구조

Kubernetes = 전체 Cluster를 관리하는 Master + Container가 배포되는 Node

모든 명령은 Master의 API Server를 호출하는 것

Master

  • 명령이 들어오면 Node server와 통신하여 받은 응답을 전달
  • 기능 별로 나뉘어 있음
  • 보통 3대를 구성 → 안정성

Node

  • Master와 통신하며 필요한 Pod 생성하고 Network와 Volume 설정
  • Container들이 생성되는 곳으로, 수백~수천 대로 확장 가능
  • Label을 붙여 사용목적 정의 가능

Master 구성 요소

  • API server
    • 모든 요청(kubectl + 내부 req)을 처리하는, Master의 핵심 모듈
    • Desired State를 key-value 저장소에 저장 및 조회
    • Node에서 실행 중인 Container의 log를 보여주고 명령을 보내는 등 Debugger 역할도 수행
  • etcd (분산 데이터 저장소)
    • key-value 저장소 → 안정성, 속도 high
    • write, read 기능 뿐만 아니라 watch 기능도 있어 State 변하면 바로 확인하여 로직 실행
    • 오직 API server와 통신
  • scheduler
    • 아직 할당되지 않은 Pod을 조건에 따라 적절한 Node에 할당
  • kube-controller
    • 쿠버네티스에 있는 거의 모든 Object의 State 관리
    • Object들은 철저히 분업: Deployment → ReplicaSet → Pod ← Scheduler
  • cloud-controller
    • Node 추가/삭제, Load Balancer 연결, Volume attach

Node 구성 요소

  • kubelet
    • Node의 Pod 생명주기 관리
    • Pod에 상태 확인하면서 주기적으로 Master에 상태 전달
    • API server의 요청 받아 Container log 전달 or 특정 명령 대신 수행
  • kube-proxy
    • Pod으로 연결되는 Network 관리
    • TCP, UDP, SCTP 스트림 forwarding, 여러 개의 Pod를 Round-Robin 방식으로 서비스 제공
  • 추상화

🐙 하나의 Pod이 생성되는 과정

✓ 각 모듈은 오직 API server와 통신

kubectl

  • ReplicaSet Specification을 yml 파일로 정의 → kubectl 커맨드로 API server에 명령 전달
  • API server는 새 ReplicaSet을 etcd에 저장

Kube Controller

  • Kube Controller에 포함된 ReplicaSet Controller가 ReplicaSet 모니터링
    → ReplicaSet에 정의된 Label 선택자 조건 만족하는 Pod 존재하는지 확인
  • 해당하는 Label의 Pod이 없으면 ReplicaSet의 Pod 템플릿 보고 할당되지 않은 새로운 Pod 생성 (생성은 API server에 전달하고 API server는 etcd에 저장)

Scheduler

  • Scheduler는 할당되지 않은 Pod이 있는지 확인
  • 할당되지 않은 Pod 있으면 조건에 맞는 Node 찾아 해당 Pod 할당

Kubelet

  • 자신의 Node에 할당 되었지만 아직 생성되지는 않은 Pod 있는지 확인
  • 생성되지 않은 Pod 있으면 Specification 보고 Pod 생성
  • Pod 상태를주기적으로 API Server에 전달
profile
📜 코딩 공부 기록

0개의 댓글