Kubernetes (K8s)

2024. 1. 8. 09:00Cloud Native

    목차
반응형

K8s 목적

Kubernetes는 컨테이너의 배포와 운영을 자동화하는 툴 입니다. 

크게 다음의 목적들을 달성하는데 사용됩니다. 

  • 컨테이너들을 서버에 배포 및 구동
  • 컨테이너가 배포된 팟(pod)의 HA(고가용성) 및 Auto-scaling 등의 운영 기능 제공

 

K8s 구성요소

K8s는 master node와 worker node로 구성됩니다. 

마스터 노드는 여러 워커 노드들을 관리하는 노드이며 사용자의 제어에 따라 워커 노드들의 운영 방법을 수행합니다. 

 

마스터노드

다음은 마스터 노드의 주요 구성 요소를 나타냅니다.

 

  • 마스터 노드의 역할
    • 워커노드들을 관리
    • 클러스터 제어, 감지등을 수행
    • etcd에 서비스 디스커버리, 스케줄링, 설정등 모든 상태와 데이터를 Key-Value로 저장 (etcd snapshot은 S3에 백업 가능)
  • kubectl
    • K8s에 명령을 전달하는 CLI tool
  • API server
    • 사용자의 요청을 처리 (단, 권한 검사 후 권한이 없을 시 이를 차단)
      • 다양한 내부 컴포넌트들과 연계하여 작업을 수행함
    • REST API로 etcd 제어 및 조회
  • Controller
    • Node, 복제, endpoint 등 여러가지 주요 요소들을 제어하는 Controller들
    • 하나의 porcess로 구성
  • Scheduler
    • 팟의 lifecycle 관리/제어
    • 팟을 노드에 바인드

 

워커노드

다음은 워커 노드의 주요 구성을 나타냅니다. 

워커노드는 실제 컴퓨팅 자원을 제공하는 물리적머신 혹은 가상머신 입니다. 

마스터 노드와 통신하며 서비스 제공을 위해 필요한 할당된 테스크를 요청대로 수행합니다. 

 

  • kubelet
    • 팟의 lifecycle을 제어합니다.
      • Docker API를 사용해 Docker daemon과 통신하여 container를 실행합니다.
  • kube-proxy
    • 내/외부 통신을 위한 노드 내 네트워크 프록시입니다.
      • 팟 간 혹은 노드간의 통신을 수행합니다.
    • Load balancing 기능도 수행ㅎ압니다.
  • pod
    • 하나 이상의 컨테이너들의 "논리적인" 그룹입니다.
      • 컨테이너들을 실행하는 단위입니다.
    • 클러스터 내에서 팟 별로 고유 IP를 할당받습니다.
      • 팟 내 컨테이너들은 네트워크 네임스페이스와 IP를 공유합니다. 즉, localhost로 서로 통신이 가능합니다. 
      • 단, IP는 팟이 restart 시 재 할당되기에 IP로 팟을 고유하게 식별할 수 없습니다. 고유식별은 레이블을 사용합니다. 
    • 팟 별로 독립적인 파일 시스템을 지닙니다.

 

Volumn

팟은 컨테이너들의 묶음입니다. 컨테이너는 영구저장 장치를 지니지 않습니다. 컨테이너가 사용하는 local disk는 volatile 합니다. 그래서 영구 저장을 위해서는 Volume이라는 저장소를 사용해야 합니다. 

 

Service

서비스는 보통 여러개의 팟들을 묶어서 제공합니다. 

LB로 하나의 IP 와 포트로 묶어 팟들에 요청을 전달합니다. 

서비스는 'deployment'를 생성하고 이들 중 외부로 노출(expose)할 것들 결정하여 외부에서 접근하는데 사용하게 합니다. 

 

다음의 제어를 통해 팟들의 배치 및 서비스를 생성할 수 있습니다.

# deployment 생성 (팟들의 배치 생성)
kubectl create development service1

# 서비스 생성 (5000 포드로 접속)
kubectl expose deployment service1 --port=5000 --type=NodePort

# 서비스 접근 IP 확인
kubectl get service service1

NAME     TYPE      CLUSTER-IP    ... PORT(S)...
service1 NodePort  10.90.411.30      5000:30948/TCP ...

 

생성된 팟들과 서비스는 다음과 같은 구조를 형성합니다. 

 

HPA(auto scaling)으로 팟들이 동적으로 추가/삭제되기에 팟 목록을 LB가 유연하게 관리해야 하며 이때 레이블과 레이블 셀렉터가 사용됩니다. 

  • 레이블
    • 팟에 할당되어 팟을 식별하는데 사용합니다.
    • 하나의 레이블에는 여러 팟들이 생성될 수 있습니다.
      • 반대로 하나의 팟에 여러 레이블이 할당될 수 있습니다.
      • 팟의 이름은 K8s가 자동할당하나 레이블명은 보통 사용자가 yaml 파일을 통해 지정합니다. 
    • 서비스는 특정 레이블을 가지고 있는 팟들에게만 LB를 적용하여 요청을 전달함으로 서빙을 수행합니다. 

 

Namespace

하나의 팟 내에서 여러 namespace를 지닙니다. 

CPU, GPU, memory 등에 대해 고유의 namespace를 적용하여 접근 권한을 달리합니다.

논리적인 구분이므로 물리적 고립이 되지는 않습니다. 즉, 외부에서 접근이 가능합니다. 

반응형

'Cloud Native' 카테고리의 다른 글

About Nginx  (0) 2024.10.17
Prometheus (프로메테우스)  (0) 2024.03.11
Backpressure algorithm  (0) 2023.08.14
Fluent-bit  (0) 2023.08.14
REST client on vscode  (0) 2023.06.27