Program/Software Architect

[마이크로서비스 7] Kubernetes

Health&Program 2024. 9. 3. 22:52

Kubernetes(K8s) 의 구조

  • 크게 Kubernetes Cluster가 있음
  • 그 안에 Master와 여러개의 node가 있음
  • DevOps (개발자)는 mater를 통해 개발하고 배포
  • User(사용자)는 외부에서 Service, Ingress Object를 통해 사용

  • kubectl 은 서비스 호출 클라이언트
  • master에 API 서버와 상태 저장소를 관리
  • node에 각 서버의 에이전트(kubelet)와 통신하는 구조

Master

  • Master는 API Server, Scheduler, Controller Manager, etcd로 구성됨
  • API Server
    • 대부분의 요청을 처리하는 담당, 중요한 역할 임으로 다중화를 함
    • 모든 컴포넌트들은 API 서버를 통해서 커뮤니케이션을 함
    • 인증 및 인가 기능도 보유함
  • Scheduler
    • 컨테이너를 어떤 노드에서 가동할지 결정하는 컴포넌트
    • 노드들의 정보를 파악하고 컨테이너를 가동할 노드 선택
  • Controller Manager
    • K8s 클러스터의 상태 모니터링
    • Desired state를 유지함
    • 실제 요청 된 state와 현재 시스템의 state에 차이가 있는지 감시 -> 다를 경우 같은 state가 되도록 조치
  • etcd
    • 분산 key-value 저장소임
    • 클러스터의 모든 설정, 상태 데이터를 저장함
    • Scheduler와 Controller Manager 등이 API 서버를 통해 etcd의 데이터 조회 및 갱신
    • 마스터에서 분리하여 독자적으로 구축이 가능

Node

  • Node는 kube proxy, kubelet, 다수의 pod로 구성됨
  • Kubelet
    • Master로 부터 생성 요청을 받으면 컨테이너 생성
    • 컨테이너의 상태를 모니터링
    • 컨테이너의 상태를 Master의 API 서버로 전송
  • kube proxy
    • 각 노드에서 실행되는 네트워크 프록시임
    • 노드의 네트워크 규칙을 유지 관리함
    • 내부 네트워크 세션이나 클러스터 바깥에서 컨테이너로 네트워크 통신을 할 수 있도록 
  • pod
    • 1개의 독립적인 컨테이너임
    • Kubelet이 생성 시킴

K8s Objects

  • 대규모 분산 환경에 필요한 요소들이 추상화 되어 있음
  • 컨테이너, 애플리케이션 수행 방식, 네트워크 등을 추상화 함
  • 추상화 한 것들을 Object라 함

K8s 는 기능 별로 아래와 같은 Object로 구성됨

  • Application 및 배포
    • Pod, ReplicaSet, Deployment, DaemonSet, StatefulSet...
  • 네트워크
    • Service, Ingress..
  • 설정 정보 관리
    • ConfigMap, Secrests
  • 배치 잡 관리
    • Job, CronJob

Pod

  • K8s에서 배포할 수 있는 가장 작은 단위
  • 한 개 이상의 컨테이너와 스토리지, 네트워크 속성을 가짐
  • Pod에 속한 컨테이너는 스토리지와 네트워크를 공유하고 서로 localhost로 접근 할 수 있음
  • 컨테이너를 하나만 사용하는 경우도 반드시 Pod로 관리해야함

ReplicaSet

  • Pod를 여러 개 복제하여 관리
  • Pod를 생성하고 개수를 유지하려면 ReplicaSet을 사용함
  • ReplicaSet는 아래의 설정 정보를 포함
    • 생성할 Pod를 복제할 개수
    • 생성할 Pod의 설정 정보

Deployment

  • K8s에서 실제 배포를 진행하는 기본 단위
  • 배포 전략 선택
    • Rolling Update
    • Recreate
  • 배포 Revision 관리 및 Roll Back 수행
  • 배포와 관련 된 다양한 기능 및 옵션 제공

DaemonSet

  • 클러스터 전체에 Pod를 띄울 때 사용하는 Controller
  • 항상 모든 Node에 특정 Pod가 실행 됨
  • 새로운 Node가 추가되면 자동으로 Pod 실행됨
  • 로그 수집기나 모니터링 에이전트 등 실행하는 용도

StatefulSet

  • K8s의 대부분의 Objet는 Stateless임
  • StatefulSet은 state를 유지하는 Pod를 위한 Object임
  • Volume을 사용해서 데이터를 저장하고 Pod 재기동 시에도 유지 가능
  • DB 등을 컨테이너화 할 때 사용 가능

Service

  • 네트워크와 관련된 Object임
  • Pod 간 연결 및 Pod와 외부 네트워크를 연결
  • 여러 개의 Pod에 대한 내부 로드밸런서
  • 내부 DNS에 서비스 등록하여 서비스 디스커버리 역할도 수행
  • Pod에 대한 L4 로드밸런싱 수행
  • 옵션 지정 가능
    • Cluster IP : 클러스터 내부에서만 통신 목적
    • Node Port : 외부로 IP Address를 노출
    • Load Balancer : 클라우드 서비스의 Load Balancer 기능 사용

Ingress

  • 외부 트래픽을 받는 Object임
  • http / https 등 L7 레벨로 라우팅 규칙, 로드밸런싱 규칙 등도 포함함
  • Service도 외부로 노출 가능하지만 L4 레벨만 가능
  • 일반적으로 K8s 클러스터를 외부로 노출 할 때에는 Ingress 사용

ConfigMap, Sercret

  • 설정 정보를 Key/Value 형태로 저장하고 Pod에서 참조

Job, CronKob

  • 배치 처리를 위해 특정 조건에 따라 작업이 수행 됨을 보장
  • 실패하면 자동 재 시작 하여 처리

Label과 Selector

  • K8s 내부 자원 관리를 위해 Label을 붙임
  • Selector를 이용해서 특정 Label이 붙여진 자원을 Filtering

Manifest 파일

  • K8s에서 선언적 설정을 위해 Manifest 파일을 사용함
  • YAML, Json 과 같은 파일로 작성 함
  • 리소스의 종류와 원하는 상태를 입력함
  • 식당 주문서와 유사함
  • Master 로 명세 파일을 제출하면 Master 에서 읽고 명세된 정보가 유지되도록 실행
  • 구성 요소
    • apiVersion : K8s API 버전 정보 
    • kind : Object의 종류
    • metadata.name : Object의 이름
    • spec : Object의 상세 정보