쿠버네티스(Kubernetes) 개념과 이해 - 1
Intro
마이크로 서비스 아키텍처가 발전하고, 데브옵스에 대한 개념이 명확해지면서 컨테이너 기반의 환경이 주목받기 시작했다. Mesosphere, Swarm, Kubernetes등 다양한 환경이 있으나 현재는 쿠버네티스를 가장 많이 사용한다.
컨테이너 운영 환경
컨테이너를 하드웨어나 VM에 배포하여 사용하면 되는데, 왜 컨테이너 운영 환경이 필요할까?
작은 수의 컨테이너라면 수동으로 배포를 하면 되지만, 하드웨어와 VM의 수가 많아지고 컨테이너의 수가 많아지면 이 컨테이너를 어디에 배포해야 하는지도 결정해야 한다. 자원을 최대한 최적으로 사용하기 위해 적절한 위치에 배포해야한다. 특성에 따라 같은 물리서버에 배포하거나, 가용성을 위해 다른 서버에 배포하기도 한다. 이러한 역할을 스케쥴링이라고 한다.
스케쥴링을 포함하여 재기동, 모니터링, 삭제 관리 등 종합적 관리를 해주는 환경을 컨테이너 운영환경이라고 한다.
쿠버네티스란?
현재 컨테이너 운영환경 중 가장 널리 사용하는 솔루션이 쿠버네티스(Kubernetes, k8s)이다. 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성있고, 확장 가능한 오픈소스 플랫폼이다.
개념 이해
사실 k8s의 용어들이 생소해서 적용이 어렵다고 느끼는 경우가 많은 것 같다. 헷갈리는 용어를 이번 포스팅을 통해 모두 이해하고 넘어자가.
마스터와 노드
마스터란 클러스터 전체를 관리하는 컨트롤러 역할을 한다. 노드는 컨테이너가 배포되는 머신(가상머신 or 물리적 서버 머신)이라고 생각하면 쉽다.
오브젝트 (중요)
쿠버네티스의 가장 기본적인 구성단위가 기본 오브젝트이다. 이 기본 오브젝트를 생성하고 관리하는 것은 컨트롤러이다. 이 외, 추가적인 메타정보들로 구성되어 있다.
오브젝트 스펙
오브젝트들은 오브젝트의 특성을 기술한 오브젝트 스펙으로 정의가 된다. 방식은 아래와 같다.
- CommandLine을 통해 인자로 전달하여 정의
- yaml 혹은 json 파일로 스펙 정의
기본 오브젝트 (Basic Object)
기본 오브젝트는 쿠버네티스에 의해 배포, 관리된다. 종류는 Pod, Service, Volume, Namespace 4가지가 있다.
Pod는 컨테이너화된 애플리케이션, Volume은 디스크, Service는 로드밸런서, Namespace는 패키지명 정도로 생각하면 된다.
Object의 종류
Pod
쿠버네티스에서 가장 기본적인 배포 단위. k8s 특징 중 하나는 컨테이너를 개별 배포하는 것이 아닌, Pod 단위로 배포하는데 Pod는 하나 이상의 컨테이너를 포함한다.
apiVersion: v1 # k8s API버전
kind: Pod # 리소스 종류 정의
metadata: # 라벨이나 리소스 이름 등 각종 메타데이터
name: nginx
spec: # 리소스에 대한 상세 스펙
containers: # Pod는 container를 갖고 있어서 이를 정의한다.
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 8090
- Pod 내 컨테이너는 IP와 Port를 공유한다.
하나의 Pod에 두개의 컨테이너 배포시 localhost를 통해 통신이 가능. A를 8080포트에 배포하고, B를 7001에 배포하면 B에선 localhost:8080로, A에선 localhost:7001로 호출이 가능하다. - Pod 내 배포된 컨테이너 간에는 디스크 볼륨을 공유할 수 있다.
- 휘발성이기 때문에 삭제되고 재생성될 때마다 IP가 바뀐다.
Volume
Pod는 휘발성이다. 그렇기 때문에 영구적으로 파일을 저장해야 하는 경우 영속적으로 저장하는 곳을 Volume이라고 한다. 컨테이너의 외장 디스크로 생각하면 된다.
Service
여러개의 Pod를 서비스하면서 로드밸런서를 이용해 하나의 IP와 port로 묶어 서비스를 제공한다. 그런데 Pod는 매번 IP가 바뀌기 때문에 목록 지정을 할 때 IP 사용이 어렵다. 또한, 오토 스케일링으로 Pod가 동적으로 추가, 삭제될 때 로드밸런서가 중요 역할을 한다. 이 때 사용하는 것이 라벨과 라벨 셀렉터이다.
- 라벨 셀렉터
서비스 정의 시 어떤 Pod를 서비스로 묶을 것인지 정의 - 라벨
쿠버네티스의 리소스를 선택하는데 사용된다. 각 리소스마다 라벨을 가질 수 있다.
Namespace
쿠버네티스 클러스터 내의 논리적인 분리단위. Pod, Service 등은 네임 스페이스별로 생성, 관리된다. 사용자의 권한 역시 네임스페이스 별로 나눠서 부여할 수 있다. (Domain이라고 생각하면 이해하기 쉽다.)
- 사용자별 네임스페이스별 접근 권한을 다르게 운영 가능
- 네임스페이스 별 리소스 할당량 지정 가능 (개발계 - CPU 100, 운영계 - CPU 400 GPU 100 이런 식으로)
- 논리적인 분리 단위이므로 다른 네임 스페이스 간의 pod라도 통신은 가능