쿠버네티스(Kubernetes)
지난번 도커 포스팅에서는 도커에 대해 알아봤다.
이번 포스팅에서는 도커에 이어서 쿠버네티스(Kubernetes)에 대해 간단히 알아보고자 한다.
쿠버네티스(Kubernetes)
쿠버네티스는 쉽게 말하면 컨테이너를 관리해주는 오픈소스 시스템이라고 할 수 있다.
대표적인 컨테이너로는 지난 포스팅에서 소개했던 도커 컨테이너가 있다.
컨테이너는 어플리케이션을 생성하고 배포하는데 있어 좋은 가상화 방법이고 많은 장점이 있다.
하지만, 컨테이너가 중지되면 컨테이너를 새로 시작해야 하고 컨테이너의 수가 많아질수록 관리가 힘들어진다.
이런 문제를 해결하기 위해 컨테이너를 관리하는 컨테이너 오케스트레이션(Container Orchestration)이라는 방법이 만들어졌다.
쿠버네티스는 컨테이너 오케스트레이션 외에도 아래와 같이 여러 기능들을 제공한다. (참고)
- Service discovery & load balancing
- Storage orchestration
- Automated rollouts and rollbacks
- Automatic bin packing
- Self-healing
- Secret and configuration management
쿠버네티스를 간단하게 아래와 같이 그림으로 표현할 수 있다.
쿠버네티스 구조
Master & Node
쿠버네티스는 전체 클러스터를 통제하는 Master와 컨테이너들이 배포되는 Node가 존재한다.
명령들은 Master의 API를 호출함으로써 수행된다.
Node 서버들은 Master 서버와 통신하면서 Pod를 생성하고 배포한다.
kubectl
명령어를 사용해 Master 서버의 API들을 호출한다.
Pod
쿠버네티스의 가장 작은 단위이며, 하나의 pod는 한개 이상의 컨테이너를 포함한다.
또한, 네트워크와 스토리지를 가지며 pod안에 있는 컨테이너들은 이 네트워크와 스토리지를 공유한다.
ReplicaSet
쿠버네티스에서는 Pod를 한개 이상 복제하여 관리한다.
ReplicaSet에서 복제된 Pod를 유지하고 관리한다.
아래 그림처럼 ReplicaSet을 정의하면 Pod를 3개까지 복제해서 사용할 수 있다.
Deployment
컨테이너화된 어플리케이션을 배포하기 위해 인스턴스들을 어떻게 생성하고 업데이트할지를 지정하는 설정이라고 할 수 있다.
보통 Deployment안에 ReplicaSet을 정의해서 사용한다.
yaml 파일을 작성하고 kubectl create -f (파일이름)
명령어로 Deployment를 생성할 수 있다.
Service
쿠버네티스에서는 하나 이상의 Pod를 Service로 제공한다.
하나의 Pod를 하나의 Service로 만드는 것은 드물고, 보통 여러개의 Pod를 로드밸런서로 묶어서 Service를 제공한다.
Pod는 동적으로 생성되고 제거되기 때문에 ip가 고정되어 있지 않다.
그렇기 때문에 Label과 Selector를 사용한다.
Label과 Selector를 사용해 외부로 제공할 Pod들을 선택하고 바인딩해서 Service로 제공한다.
Namespace
쿠버네티스는 동일한 물리적 클러스터를 기반으로 하는 복수의 가상 클러스터 기능을 지원한다.
이 가상 클러스터를 Namespace라고 한다.
하나의 Namespace내에서 리소스들의 이름은 중복될 수 없다.
Label은 오브젝트에 주어지는 key와 value의 쌍이다.
Selector를 정의해서 특정 라벨을 가지고 있는 리소스들을 선택해서 사용할 수 있다.
아래와 같이 yaml 파일을 작성해서 사용하면 app
이라는 Label이 test-app
인 Pod만 선택해서 서비스에 바인딩할 수 있다.
kind: Service
apiVersion: v1
metadata:
name: test-service
spec:
selector:
app: test-app
ports:
- protocol: TCP
port: 80
targetPort: 8888
Volume
쿠버네티스에서 Pod를 생성하면 컨테이너 내부에 로컬 저장소가 만들어지는데, 이 저장소는 영구적이지 않다.
그렇기 때문에 컨테이너가 새로 생기면 내부의 데이터들도 유실된다.
Volume을 생성해서 컨테이너에 마운트하면 이러한 문제를 해결할 수 있다.
또한 Volume은 Pod내의 컨테이너들이 서로 공유할 수 있다.
아래는 자주 사용되는 Volume의 유형들이다.
-
hostPath
로컬 저장소를 Pod의 컨테이너에 마운트한다.
로컬의 저장소를 사용하기 때문에 A라는 Node에서 Pod를 만들어서 데이터를 Write하고 Pod가 B라는 Node에 재생성 될 경우, 이전에 Write 했던 데이터를 사용할 수 없다.
-
gitRepo
git 저장소를 clone해서 사용한다.
html이나 스크립트 파일들을 손쉽게 배포할 수 있다.
-
PV(PersistentVolume) & PVC(PersistentVolumeClaim)
물리적으로 저장소를 생성하고 이 디스크를 PV으로 쿠버네티스에 등록한다.
Pod를 생성할 때, PVC를 지정하여 등록된 PV와 연결한다.
Leave a comment