쿠버네티스는 컨테이너화된 워크로드를 관리하기 위한 오픈소스 플랫폼이다.
- 워크로드 : 워크로드는 쿠버네티스에서 구동되는 애플리케이션
쿠버네티스는 Container
화된 애플리케이션을 자동화된 배포 , 선언적 구성를 용이하게 한다.
또한 애플리케이션의 확장과 장애 조치를 처리하고, 배포 패턴 등을 제공한다.
❓ 쿠버네티스는 어떻게 동작해서 컨테이너화된 애플리케이션을 관리할까?
컨테이너화된 애플리케이션을 실행하는 노드라고하는 워커 머신의 집합. 모든 클러스터는 최소 한 개의 워커 노드를 가진다.
Node
: 애플리케이션의 구성요소인 Pod
를 호스트한다.Component
가 상호작용한다.컨테이너의 라이프 사이클을 정의, 배포, 관리하기 위한 API와 인터페이스를 노출하는 컨테이너 오케스트레이션 레이어
마스터
: Control Plane component 를 실행하는 호스트를 마스터라 한다.key-value
저장소이다. 백업은 필수!kube-apiserver
로 수평 확장이 가능해 더 많은 인스턴스를 배포할 수 있다.노드 컴포넌트는 동작 중인 파드를 유지시키고 쿠버네티스 런타임 환경을 제공한다.
Node
에서 실행함으로 워크로드를 구동한다.docker
가 있다.
❓ 쿠버네티스는 컨테이너를 파드내에 배치하고 Node
에서 실행해 관리한다. Pod는 무엇일까?
쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위
Container
의 그룹이다.스토리지
및 네트워크
를 공유하고, 해당 컨테이너를 구동하는 방식에 대한 명세
를 갖는다.마스터의 컨트롤 매니저 는 클러스터의 상태를 관찰해 의도한 상태에 가깝게 만들어주는 컨트롤러를 실행한다.
api 서버
를 통해 클러스터의 상태를 감시한다.Deployment
, ReplicaSet
, Deployment
, StatefulSet
, DaemonSet
, Job
, CronJob
등이 있다.Pod 를 여러 개 복제하여 관리하는 오브젝트
파드와 레플리카셋에 대한 선언적 업데이트를 제공한다.
** 선언적 업데이트 : YAML 파일을 통해 정의한 상태를 시스템이 알아서 판단하고 수행해주는 것
클러스터와 통신하기 위해
kubectl
커맨드-라인 툴 설치가 필요하다.
brew install kubectl
kubectl version --client
클러스터를 구성하는 것은 어려우므로
minikube
를 활용해 로컬에서 단일 노드 쿠버네티스 클러스터를 실행한다.
brew install minikube
minikube version
Docker Desktop
를 설치한 후, Docker
드라이버를 사용한다.minikube start
minikube dashboard
nginx:1.14.2
이미지를 실행하는 컨테이너로 구성되는 파드 예시
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
해당 파드 생성 위해 다음 명령어 실행
kubectl apply -f https://k8s.io/examples/pods/simple-pod.yaml
kubectl delete pod/nginx
3개의 nginx 파드를 불러오기 위한 레플리카 셋을 생성하는 Deployment
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
.metadata.name
: nginx-deployment
이름으로 디플로이먼트가 생성된다..spec.replicas
: 디플로이먼트는 3개의 레플리카 파드를 생성한다.spec.selector
: 디플로이먼트가 관리할 파드를 찾는 방법을 정의한다. 이 사례에서는 파드 템플릿에 정의된 레이블(app: nginx
)을 선택spec.selector.matchLabels
:는 .spec.template.metadata.labels
과 일치해야 하며, 그렇지 않으면 API에 의해 거부된다.template.spec
: 파드가nginx
1.14.2 버전 이미지를 실행하는 nginx
컨테이너 1개를 실행하는 것을 나타낸다.app:nginx
레이블을 가지고 관리할 Pod 를 인식한다.[DEPLOYMENT-NAME]-[RANDOM-STRING]
형식으로 된 것을 알 수 있다Pod-template-hash 레이블
: 이 레이블은 디플로이먼트 컨트롤러에 의해서 디플로이먼트가 생성 또는 채택한 모든 레플리카 셋에 추가된다. 다른 자식 레플리카 셋과 겹치지 않도록 보장하므로 변경하면 안된다.pod 는 컨테이너를 관리하는 쿠버네티스의 가장 작은 오브젝트이다.
Deployment 는 클러스터의 컨트롤 도메인에 속하는 컨트롤러 중 하나로 레플레카셋을 관리하여 복제된 다수의 Pod
를 생성, 관리한다.