안녕하세요, 베스핀글로벌 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 버전
etcdctl backup
etcdctl cluster-health
etcdctl mk
etcdctl mkdir
etcdctl set
- 3 버전
etcdctl snapshot save
etcdctl endpoint health
etcdctl get
etcdctl put
- etcdctl 명령어는 v2 와 v3가 함께 사용될 수 있음
- etcdctl 버전 확인하는 명령어
./etcdctl --version
# etcdctl version : 3.3.11
# API version : 2
- 위와 같이 etcdctl 유틸리티 자체의 버전과 API 버전이 다를 수 있음. API 역시 v3로 통일시키고 싶다면?
export ETCDCTL_API=3
# etcdctl version : 3.3.11
# API version : 3.3
- etcdctl이 ETCD api server를 인증할 수 있도록 certificate 패스를 지정해야 함
--cacert /etc/kubernetes/pki/etcd/ca.crt
--cert /etc/kubernetes/pki/etcd/server.crt
--key /etc/kubernetes/pki/etcd/server.key
- api 버전과 인증 패스 지정을 함께 한다면 다음과 같음
kubectl exec etcd-master -n kube-system -- sh -c "ETCDCTL_API=3 etcdctl get / --prefix --keys-only --limit=10 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key"
ETCD role in K8S
- 클러스터에 대한 많은 정보를 저장하는 공간
- Nodes, Pods, Configs, Secrets, Accounts, Roles, Bindings, Others …
- kubectl 명령어의 결과가 etcd 서버에 저장됨
- 노드를 추가하거나, 파드나 복제본을 배포하는 등의 정보..
Kube apiserver
kubectl 명령어를 실행하면
- kubectl utility는 kube-apiserver에 접근함
- kube-apiserver에서 해당 요청을 인증하고 확인함
- 데이터를 받아 ETCD 클러스터에서 찾고 다시 응답 값을 명령어를 실행한 유저에게 전달함
- kube scheduler는 apiserver를 모니터링하고 있으며, 새 pod가 있는지 확인
- scheduler는 새 pod가 있어야 할 곳에 정착시키고 kube-apiserver에 이 상황을 전달함
- apiserver는 다시 ETCD cluster에 정보를 저장함
- apiserver가 적절한 worker node의 kubelet에 정보 전달함
- kubelet이 새 node를 생성하고, container runtime engine에게 애플리케이션 이미지를 배포할 것을 명령함
- 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