
쿠버네티스는 여러 대의 컨테이너가 여러 대의 물리적 서버에 걸쳐 실행된다
도커(Docker)는 한 대의 서버 안에서 컨테이너를 다룬다. 서비스 규모가 작을 때는 이걸로 충분하지만, 트래픽이 늘어 여러 대의 서버에 컨테이너를 나눠 띄워야 하는 순간부터는 한계점이 생긴다. 어떤 서버에 무엇을 몇 개 올릴지, 컨테이너 하나가 죽으면 어느 서버에 다시 살릴지를 사람이 일일이 챙겨야 하기 때문이다.
쿠버네티스(Kubernetes)는 여러 대의 서버에 걸쳐 컨테이너를 다룰 수 있다. 도커 컴포즈 파일과 비슷한 정의 파일(매니페스트)에 "이런 컨테이너를 이만큼 띄운다"고 선언해두기만 하면 쿠버네티스가 그 정의에 맞춰 여러 대의 서버에 컨테이너를 배치하고 상태를 유지한다.

쿠버네티스 클러스터는 역할이 다른 두 종류의 노드로 구성된다.
워커 노드는 컨테이너가 실제로 동작하는 서버이다. 컨테이너가 동작해야 하므로 컨테이너 엔진이 필요하다.
마스터 노드(컨트롤 플레인 노드)는 워커 노드에서 실행되는 컨테이너를 관리한다. 이 둘을 묶어 클러스터라 부른다.
➡️ 이 둘을 묶어 클러스터라 부른다
※ 클러스터의 특징은 사람이 개입하지 않아도 굴러간다는 점이다. 컨트롤 플레인(마스터)에 설정된 내용에 따라 워커 노드가 자동으로 관리되어서, 보통 초기 구성 이후에는 가끔씩만 조정한다.
쿠버네티스 본체와 CNI(컨테이너 간 통신을 담당하는 네트워크 플러그인)는 마스터·워커 양쪽 노드에 설치된다.
반면 etcd는 마스터 노드에만, 컨테이너 엔진은 워커 노드에만 설치된다.

※ ETCD
etcd는 클러스터의 모든 리소스 상태(컨테이너 상태, 클러스터 정보 등)를 저장하는 키-값 저장소다. 매니페스트 파일을 클러스터에 등록하면 그 내용이 etcd에 "바람직한 상태"로 저장되고, 쿠버네티스는 이 상태를 기준으로 클러스터를 관리한다.
마스터 노드(컨트롤 플레인 노드)가 워커 노드를 관리한다고 했는데, 실제로 그 일을 하는 것은 컨트롤 플레인을 구성하는 다섯 개의 컴포넌트다.
kube-apiserver: kubectl로부터 명령을 전달받아 실행한다. 외부와의 통신 창구이자 모든 컴포넌트가 거쳐 가는 유일한 통로다.kube-controller-manager: 여러 컨트롤러를 통합 관리 및 실행한다.kube-scheduler: 새로 생성된 파드를 어느 워커노드에 배치할지 결정한다cloud-controller-manager: 클라우드 서비스(AWS 등)와 연동해 로드밸런서 등의 리소르를 생성한다etcd: 클러스터의 모든 상태가 저장되는 키-값 저장소 (앞 절 참고)kubelet: 워커노드에서 파드를 실제로 실행하는 에이전트kube-proxy: 노드의 네트워크 규칙을 관리한다. 서비스로 들어온 요청이 파드까지 도달하도록 라우팅을 담당한다.kubectl 명령어를 실행하면 명령이 컨트롤 플레인의 kube-apiserver에 전달된다."쿠버네티스는 항상 바람직한 상태를 유지한다"
= 항상 yaml 파일 설정 값을 유지한다
yaml(매니페스트)에 파드 4개로 정의된 상태에서,
➡️ 쿠버네티스의 기능은 이렇게 "자동으로 상태를 유지하는 것" 이다.
따라서 파드를 삭제하고 싶다면 삭제 명령어가 아니라(사람이 개입X) 매니페스트 파일을 수정해야 한다. 도커 명령어로 파드를 직접 삭제하면, 좀비처럼 자동으로 1개를 보충한다.
쿠버네티스에서 하나의 프로그램을 실행시키는 단위
워커 노드는 컨테이너가 실제 동작하는 "서버"이고, 쿠버네티스에서 컨테이너는 낱개가 아니라 파드 단위로 관리된다.
파드 = 컨테이너 + 볼륨. 볼륨은 컨테이너와 정보를 공유하기 위해 사용한다. (단, 볼륨이 없는 파드도 있음)
워커 노드는 컨테이너가 동작해야 하는 "컨테이너 엔진"이 필요하다

컨테이너 엔진은 파드 안의 컨테이너를 실제로 실행하는 소프트웨어다.
위 그림에서, 컨테이너 엔진은 모든 것을 떠받치는 것처럼 바닥에 깔려있다.
"쿠버네티스 자체는 컨테이너를 직접 실행하지 않는다"
단지 "이 노드에 이런 파드를 띄워라"라고 지시할 뿐이고, 그 지시를 받아 이미지를 내려받고 컨테이너 프로세스를 실제로 띄우는 것은 컨테이너 엔진의 몫이다.
동작 순서
1. kubelet이 "파드를 실행하라"는 지시를 받으면
2. CRI(Container Runtime Interface)라는 표준 규격으로 컨테이너 엔진에 요청하고
3. 컨테이너 엔진이 이미지를 받아 컨테이너를 띄운다
여러 파드를 이끄는 반장
같은 종류의 파드를 하나의 서비스가 관리한다

여러 워커 노드에 걸쳐 실행되더라도 동일한 구성의 파드는 하나의 서비스가 관리한다

요청(외부에서 들어오는 트래픽)을 배분하는 로드밸런서 역할을 한다
Cluster IP를 부여받는다Cluster IP로 접근하면 서비스가 뒤의 파드들로 요청을 적절히 분배한다
파드의 수를 관리하는 반장
정의 파일에 선언된 파드 수를 기준으로, 파드를 보충하거나 감소시킨다
앞서 본 "바람직한 상태 유지"가 바로 이 컴포넌트의 일이다.
ex) 파드 4개가 선언된 상태에서 하나가 죽으면 레플리카세트가 감지해 1개를 새로 만들고, 3개로 수정하면 1개를 지운다.
➡️ 결국, 파드는 두 명의 반장이 관리하는 셈이다 — 서비스(요청 배분) + 레플리카세트(개수 유지)

레플리카세트가 관리하는 "동일한 구성"의 파드

파드의 "배포"를 관리하며, 파드의 정보를 갖고 있다. 파드를 묶음으로 쉽게 관리한다
레플리카세트는 단독으로 쓰이는 경우가 드물다. 실무에서는 디플로이먼트만 만들고, 레플리카세트와 파드는 디플로이먼트가 알아서 생성한다.
※ 일반적으로 파드 생성은 디플로이먼트로 여러 개를 자동 배포
※ 디플로이먼트가 레플리카세트를 관리하고, 레플리카세트가 여러 파드를 관리한다

디플로이먼트의 장점

파드, 서비스에 대한 설정
매니페스트 파일은 파드, 서비스 같은 리소스에 대한 설정이다. YAML 또는 JSON으로 작성하며, 쿠버네티스에 업로드하면 그 내용이 etcd에 "바람직한 상태"로 등록된다.
매니페스트는 리소스 단위로 작성한다.
deployment.yml + service.yml처럼 따로 작성deser.yml처럼 한 파일에 작성하고, 리소스 사이를 ---로 구분※ ---는 YAML 표준의 문서 구분자(document separator). 한 파일 안에 여러 YAML 문서를 담는 YAML 자체의 기능

apiVersion: API 그룹 및 버전kind: 리소스 유형metadata: 메타데이터 — 이름, 레이블 등spec: 리소스 내용(스펙) — "어떤 리소스를 만들 것인가"apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-deployment
spec:
replicas: 3
selector:
matchLabels:
app: backend-app # 셀렉터: "이 레이블이 붙은 파드가 내 관리 대상"
template:
metadata:
labels:
app: backend-app # 레이블: 이 템플릿으로 생성되는 파드에 붙는 이름표
spec:
containers:
- name: backend
image: backend:1.0
도서 - 그림과 실습으로 배우는 도커 & 쿠버네티스
유튜브 - 비전공자도 이해할 수 있는 쿠버네티스 입문/실전