
공식문서에는 이렇게 쿠버네티스의 배포에 대해 이렇게 나와있다.
statefull vs stateless
- statefull : 데이터 저장이 필요하고, Pod가 교체되면 데이터가 사라져서 Pod가 죽으면 안되는 것
ex) MySQL, Redis, Elasticsearch
- stateless : 요청 받고 응답만 하면 되기 때문에 Pod가 새로 떠도 상관없는 것
ex) Nginx, Node.js, Spring 웹서버
차근차근 한 단어씩 뜯어서 이해했다.
ReplicaSet은 지정된 수의 파드가 항상 실행 중이도록 보장해주는 쿠버네티스의 컨트롤러이다.
한개 이상의 컨테이너를 유지하는 것이 파드라면, 이 파드들을 유지해주는 것을 레플리카셋이라고 한다.
레플리카셋은 보통 명시된 파드 개수에 대한 가용성을 보증하는데 사용한다.
-> 즉, 파드의 개수를 일정하게 유지해주는 관리자다.
(파드가 너무 많으면 제거하고, 죽으면 새로 만들어서 특정 개수를 계속 유지시켜준다.)
레플리카셋은 식별이 가능한 명시된 셀렉터, 유지해야하는 파드 개수를 명시하는 레플리카의 개수, 그리고 레플리카 수 유지를 위해 생성하는 신규 파드에 대한 데이터를 명시하는 파드 템플릿을 포함한다.
-> 정리하자면 ReplicaSet에는 세 가지 주요 정보가 들어 있다.
|---------항목----------|--------------역할------------|------예시-------------------|
| 셀렉터(selector) | 어떤 파드들을 관리할지 식별한다. |app:nginx 라벨을 가진 파드만 관리|
| 레플리카 수 (replicas) | 유지할 파드 개수 |replicas: 3 |
| 템플릿 (template) | 신규 파드에 대한 데이터를 명시 |nginx 이미지를 사용하는 파드 정의 |
즉, ReplicaSet은 위 예시를 통해 보자면
"셀렉터(app= nginx)을 가진 파드를 항상 3개를 유지하고 필요하면
템플릿을 통해 새 파드를 만들어라" 라고 스스로 판단하고 조정한다.
쿠버네티스는 "명령형"이 아니라 "선언형(declarative)"업데이트를 제공한다
즉, 어떻게 변경할지가 아니라, 어떤 상태로 되어 있어야 하는지를 선언한다는 것이다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 3
template:
spec:
containers:
- name: nginx
image: nginx:1.27
이렇게 사용자가 직접 파드를 수정하거나 교체 명령을 내리지 않고, yaml파일에 "원하는 상태"(위 파일에서는 파드 3개를 띄워서 유지해라 라는 선언적 명령)를 정의를 하면 쿠버네티스는 그 상태를 보고 실제 환경을 자동으로 맞춰준다는 것이다.
선언적 업데이트를 이해했으니
"배포는 파드와 ReplicaSet에 대한 선언적 업데이트를 제공한다."
라는 의미에 대해서는
배포는 실제 파드를 직접 제어하지 않고 대신 ReplicaSet(파드의 복제본을 관리하는 컨트롤러)를 만들어서 그 레플리카셋이 파드를 일정 개수를 유지하게 한다는 것이다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
이 코드에 대한 설명은 다음과 같다
minikube는 다양한 os에서 로컬 쿠버네티스 클러스터를 빠르게 구축할 수 있도록 도와준다.
즉, 개발 용도에 적합한 쿠버네티스 구성 방법이다.
다만 운영환경에서는 절대 사용하지 않는다.
쿠버네티스의 기능을 로컬에서 연습용으로 흉내내는 도구일 뿐, 실제 서비스 운영용은 아니다.
Minikube는 구조적으로 단일 노드 구조를 구성한다.
또한 로컬에서 돌리기 때문에 로컬 머신 자원에 의존한다
따라서 규모가 있는 트래픽이나 수백 개의 파드를 돌릴 수 없다.
-> Minikube는 단일 노드로 동작하며, Docker나 VirtualBox 같은 가상화 드라이버 위에서 실행된다.
실제 운영환경에서는 매니지먼트 쿠버네티스 서비스
학습 및 개발 환경을 넘어 실질적으로 활용 가능한 쿠버네티스 클러스터를 활용하고 싶을 때 사용할 수 있는 것이 K3s이다.
K3s는 CNCF(Cloud Native Computing Foundation)가 관리하는 경량 쿠버네티스 배포판이다.
단일 파일로 이루어진 K3s 실행 파일을 통해 서버와 에이전트만 구동하면 쿠버네티스의 각 구성 요소가 간편하게 설치되어 쿠버네티스 클러스터를 쉽게 구성할 수 있다.
내장 구성 요소 중 각종 환경 정보를 저장하는 ETCD는 경량의 내장 데이터베이스인 SQLite로 대체되어 가볍게 동작한다.
따라서 초소형 컴퓨터에서도 사용이 가능하다
다만 구성요고가 매우 단순화되어 있기 때문에 높은 성능, 안정성을 요구하는 시스템에는 부적절하다.
참고자료
[쿠버네티스 공식 홈페이지 - Deployments]
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
[쿠버네티스 공식 홈페이지 - ReplicaSet]
https://kubernetes.io/ko/docs/concepts/workloads/controllers/replicaset/
[삼성 SDS - 쿠버네티스 알아보기 2편: 쿠버네티스를 만나는 여러 가지 방법]
https://www.samsungsds.com/kr/insights/kubernetes-2.html
[minikube 공식 홈페이지 - minikube start]
https://minikube.sigs.k8s.io/docs/start/?arch=%2Fmacos%2Farm64%2Fstable%2Fbinary+download