DevOps K8S(1) – 쿠버네티스를 ‘잘’ 쓰려면 필수적으로 알고 가야 하는 개념

안녕하세요, 베스핀글로벌 DevOps실 구연수 님이 작성해 주신 쿠버네티스를 잘 쓰려면 필수적으로 알고 가야 하는 개념에 대해 알아보도록 하겠습니다.

화물선에 비교한 쿠버네티스 

Master Node
  • 적재 방법을 계획하고, 선박을 식별하고, 컨테이너 위치를 감시 추적 감시하는 역할의 관제선
  • etcd : 어떤 컨테이너가 어느 배에 몇 시에 적재될 지 정보를 가짐 (고가용 키값 스토어)
  • kube scheduler : 컨테이너를 설치하기 위해 올바른 노드를 식별 (컨테이너 리소스 요구사항, 노드 용량, 정책, 테인트 등등..)
  • Controller Manager
    • Node Controller : 노드 관리. 새 노드를 클러스터에 온보딩하고 노드가 사용불가능하거나 파괴되는 상황을 처리
    • Replication Controller : 원하는 컨테이너의 수가 복제그룹에서 항상 실행되도록 보장
  • kube-apiserver : 서버나 클러스터 내에서 모든 작업을 오케스트레이션. 외부 사용자가 클러스터의 관리 작업을 수행할 수 있도록 인터페이스 제공
Worker Nodes : 클러스터의 작업자 노드. 컨테이너를 노드할 수 있음
  • kubelet : 선박의 선장 역할. 클러스터의 각 노드에서 실행되는 에이전트. kube apiserver의 지시를 듣고 노드에서 컨테이너를 배포하거나 파괴
  • kube proxy : 작업자 노드간의 통신. 쿠버네티스 위에 실행되는 컨테이너가 서로 닿을 수 있도록 함

ETCD
  • 쉽고 안전하고 빠른 분산 키-밸류 저장소
  • document, page 형식으로 데이터를 저장
  • 각 정보는 document 형식이고 파일별로 구분된다
    • 한 파일에 저장된 정보는 다른 파일에 영향을 주지 않음
ETCD version
  • etcdctl : ETCD와 통신하기 위해 사용되는 CLI 툴
  • v2.0 ~ v3.0 사이에 큰 변화가 있었고 etcdctl 명령어도 역시 많은 변화가 있었음
    • 기존 2 버전
  • 3 버전
  • etcdctl 명령어는 v2 와 v3가 함께 사용될 수 있음
    • etcdctl 버전 확인하는 명령어
  • 위와 같이 etcdctl 유틸리티 자체의 버전과 API 버전이 다를 수 있음. API 역시 v3로 통일시키고 싶다면?
  • etcdctl이 ETCD api server를 인증할 수 있도록 certificate 패스를 지정해야 함
  • api 버전과 인증 패스 지정을 함께 한다면 다음과 같음
ETCD role in K8S
  • 클러스터에 대한 많은 정보를 저장하는 공간
    • Nodes, Pods, Configs, Secrets, Accounts, Roles, Bindings, Others …
  • kubectl 명령어의 결과가 etcd 서버에 저장됨
    • 노드를 추가하거나, 파드나 복제본을 배포하는 등의 정보..
Kube apiserver

kubectl 명령어를 실행하면

  1. kubectl utility는 kube-apiserver에 접근함
  2. kube-apiserver에서 해당 요청을 인증하고 확인함
  3. 데이터를 받아 ETCD 클러스터에서 찾고 다시 응답 값을 명령어를 실행한 유저에게 전달함
  4. kube scheduler는 apiserver를 모니터링하고 있으며, 새 pod가 있는지 확인
  5. scheduler는 새 pod가 있어야 할 곳에 정착시키고 kube-apiserver에 이 상황을 전달함
  6. apiserver는 다시 ETCD cluster에 정보를 저장함
  7. apiserver가 적절한 worker node의 kubelet에 정보 전달함
  8. kubelet이 새 node를 생성하고, container runtime engine에게 애플리케이션 이미지를 배포할 것을 명령함
  9. kubelet은 상태값을 apiserver에 응답하면, apiserver는 상태 정보를 ETCD에 저장함

kube apiserver는 ETCD cluster와 소통하는 유일한 컴포넌트


Kube Proxy
  • 모든 Pod는 다른 모든 pod에 접근할 수 있음
  • Kube Proxy는 쿠버네티스 클러스터 내의 각 노드마다 운영되는 프로세스
Kube Proxy가 서비스를 설정하는 방법

새로운 서비스가 생겨날 때마다, 백엔드 파드에서 이 서비스들로 트래픽을 향하게 할 수 있도록 각 노드에 적절한 룰을 생성함

  • (ex) 클러스터 내 각 노드에 ip table이 서비스의 ip 를 향할 수 있도록 생성한다.

감사합니다:)

Written by 구 연수 / Yeonsoo koo

Software Engineer