Docker/Kubernetes의 이해 - 2
1. What is Kubernetes?
- 구글에서 개발하고 있는 컨테이너 배포, 확장, 운영 툴
- 사실상 현 시점 컨테이너 오케스트레이션 표준
- 대규모에 적합
- 장점
- 다양한 생태계 구축되어 있음
- 다양한 환경 지원
- 훌륭한 확장성
- 단점
- 알아야 할 내용이 너무 많아서 복잡한 클러스터를 구성하는게 아니라면 비추천. 득실을 잘 따져봐야 함
- 설치가 너무 어려움. 가급적이면 클라우드 이용하는 것이 좋음
- 환경이 무거움. 기본적으로 실행되는 프로그램이 많고, 그에 따라 기본 리소스 사용량이 많음
- Docker Swarm에 비해 설정 파일이 복잡함
2. Kubernetes 특징/Architecture
2.1. 기본 기능
- 상태 관리: 상태를 선언하고 선언한 상태를 유지, 노드가 죽거나 컨테이너 응답이 없을 경우 자동 복구
- 스케줄링: 클러스터의 여러 노드 중 조건에 맞는 노드를 찾아 컨테이너를 배치
- 클러스터링: 가상 네트워크를 통해 하나의 서버에 있는 것처럼 통신
- 서비스 디스커버리: 서로 다른 서비스를 쉽게 찾고 통신할 수 있음
- 리소스 모니터링: cAdvisor를 통한 리소스 모니터링
- 스케일링: 리소스에 따라 자동으로 서비스를 조정함
- RollOut/RollBack: 배포/롤백 및 버전 관리
2.2. Architecture
- Master - 명령을 받아 쿠버네티스 클러스터를 관리
API Server
운영자 및 내부 노드와 통신하기 위한 인터페이스. HTTP(S) RestAPI로 노출되어 있고, 모든 명령이 통하는 곳Controller Manager
다양한 컨트롤러를 관리하고 API Server와 통신하여 작업을 수행etcd
가볍고 빠른 분산형 key-value 저장소. 설정 및 상태를 저장Scheduler
서비스를 리소스 상황에 맞게 적절한 노드에 배치하는 역할
- Node - 서비스(컨테이너)가 실행되는 서버. 마스터의 API Server와 통신하며 서비스 생성 및 상태 관리
kubelet
서비스(컨테이너)를 실행 및 중지하고 상태를 체크하여 계속해서 살아있는 상태로 관리. master와 worker node 간의 통신 역할Proxy
네트워크 프록시와 load balancer 역할cAdvisor
리소스 모니터링Docker
도커뿐만 아니라 다양한 컨테이너 엔진을 지원
3. Kubernetes Object
- 모든 object는 특정 namespace 안에 존재
- 하나의 물리적 클러스터를 논리적인 가상 클러스터로 관리
- 지정하지 않으면 기본값은 default
- 모든 object는 유일한 name을 가짐
- label은 key-value로 구성하고, 여러 object를 의미있게 관리하기 위해 사용
- annotation은 주로 API의 설정값으로 활용
3.1. Pod
- 쿠버네티스는 컨테이너를 pod이라는 최소 개념으로 관리
- 하나의 pod은 여러 개의 컨테이너를 가질 수 있지만 대부분 한 개 또는 두 개.
- 하나의 pod 안에 여러 개의 컨테이너가 있으면
exec -it pod/example-redis -c app sh
와 같이 컨테이너를 지정해 주어야 함
- 하나의 pod 안에 여러 개의 컨테이너가 있으면
- pod 내부에서 컨테이너는 네크워크(서로 localhost로 통신 가능)와 volume을 공유
- pod은 고유한 자체 IP가 있지만 직접 IP로 통신하지 않음. pod은 언제든지 죽을 수 있고, 다른 노드로 이동할 수 있고 확장되거나 축소될 수 있기 때문
- pod에 연결할 수 있는 서비스를 만들고 해당 서비스의 IP, port를 통해 통신
3.2. Controller
ReplicaSet
(Replication Controller) pod을 확장할 때 사용- 동일한 pod의 개수가 많아질수록 pod을 일일이 정의하는 것은 매우 비효율적
- pod이 삭제되거나 pod이 위치한 노드에 장애가 발생해 더이상 pod에 접근하지 못하게 되었을 때, 관리자가 직접 삭제 후 다시 생성하지 않는 한 해당 pod은 다시 복구되지 않음
- ReplicaSet은 정해진 수의 동일한 pod이 항상 실행되도록 관리함
replicas
몇 개의 pod을 유지할 것인지 설정template
어떤 pod을 생성할 것인지 설정.- 예를 들어 replicas는 2이고 template에서 label을 {service: example, type: app}로 설정한 상황에서 어떤 pod의 type key를 삭제하면 {service: example, type: app} label을 갖는 pod 1개가 자동 생성됨. 삭제했던 type key를 다시 추가하면 하나의 pod을 랜덤하게 골라 종료시킴
- 노드 장애 등의 이유로 pod을 사용할 수 없다면 다른 노드에서 pod을 다시 생성
Deployment
배포와 관련된 다양한 설정을 가지고 있는 컨트롤러- 어떤 pod이 완전히 delete 되는 과정
Deployment
>ReplicaSet
>Pod
- 어떤 pod이 완전히 delete 되는 과정
StatefulSet
pod을 만들 때 0부터 순서를 붙여줌. pod을 순서대로 생성하거나 순번에 따라 관리가 필요할 때 사용DaemonSet
모든 노드에 pod을 생성할 때 사용. 보통 모니터링을 위한 pod을 생성할 때 사용Job
한 번 실행되고 종료되는 서비스를 위한 컨트롤러. 보통 컨테이너의 상태가 종료되면 다시 살리려고 하지만 Job은 정상적으로 종료되었는지 체크함Cronjob
특정 주기로 실행되고 종료되는 Job을 위한 컨트롤러- pod은 컨테이너를 관리하고, controller는 pod을 관리하는 것
3.3. Service
ClusterIP
- 여러 개의 pod을 중앙에서 load balancing하는 서비스
- ClusterIP는 클러스터 내부에서만 통신할 수 있음. 보통 Deployment에 할당하고 서로 다른 Deployment나 StatefulSet과 통신이 필요할 때 사용.
- 내부적으로
endpoint
object로 IP 리스트를 관리함. 여러 개의 복제된 pod에 서비스를 연결하면 여러 개의 pod IP를 관리함.
NodePort
- ClusterIP는 내부 통신용이기 때문에 외부에서 접속하려면 각 노드에 외부에서 접속할 수 있는 port를 오픈해야 함
- NodePort는 각 VM에 port를 오픈하고 들어온 요청을 내부의 ClusterIP로 연결함
- NodePort를 만들면 ClusterIP가 자동으로 생성됨
Loadbalancer
- NodePort를 외부에 연결된 LoadBalancer와 연결
LoadBalancer
>NodePort
>ClusterIP
순으로 연결됨
Ingress
- Loadbalancer는 IP로만 생성되기 때문에 service마다 IP를 계속 만들어야 해서 비용 발생 → 하나의 IP를 사용하되 도메인 또는 Path에 따라 내부 ClusterIP와 연결하는 것이 Ingress (보통 모든 노드에 80/443 port로 오픈)
- 기본 내장되어 있지 않고 상황에 따라 Ingress Controller를 pod으로 배포하여 사용할 수 있도록 유연한 구조로 설계되어 있음
- nginx ingress, gce ingress 등
3.4. Storage
- 데이터를 저장하기 위해 기본적인
Volume
외에도 다양한 종류의 volume 지원 PersistentVolume
관리자가 여러 개의 volume을 미리 생성해 두면 pod에서 volume을 요청할 때 조건(용량/라벨)에 맞는 volume을 사용PersistentVolumeClaims
관리자가 미리 volume을 생성하는 것이 아니라 pod을 생성할 때 동적으로 volume을 만드는 역할- storage의 class(등급)을 지정해 둠
3.5. ConfigMap / Secret
ConfigMap
공개되어도 괜찮은 설정 정보를 관리Secret
암호화하여 저장할 정보를 관리- pod에서는 환경변수 또는 파일로 바인딩하여 사용 가능
Reference
This post is licensed under CC BY 4.0 by the author.