Kubernetes란?
2014년부터 대규모 컨테이너 운영 노하우를 가진 Google이 개발을 주도하고, 현재는 CNCF(Cloud Native Computing Foundation)에서 관리되고 있는 오픈소스 컨테이너 오케스트레이션 툴
Google, Microsoft, Red Hat, IBM 등에 소속된 다수의 엔지니어들이 개발에 참여하고 있으며, 컨테이너 오케스트레이션 툴 중에서 사실상 표준으로 여겨지고 있다.
비슷한 제품으로 HashiCorp의 Nomad, Docker에 내장된 Swarm, Apache 재단의 Mesos/Marathon이 존재한다.
또한 여러 클라우드 프로바이더(AWS, Azure, GCP 등)들은 Kubernetes를 Managed Service로 제공한다.
특징
-
서비스 디스커버리와 로드 밸런싱
쿠버네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있다. 컨테이너에 대한 트래픽이 많으면, 쿠버네티스는 네트워크 트래픽을 로드밸런싱하고 배포하여 배포가 안정적으로 이루어질 수 있다. -
스토리지 오케스트레이션
쿠버네티스를 사용하면 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재 할 수 있다. -
자동화된 롤아웃과 롤백
쿠버네티스를 사용하여 배포된 컨테이너의 원하는 상태를 서술할 수 있으며 현재 상태를 원하는 상태로 설정한 속도에 따라 변경할 수 있다. 예를 들어 쿠버네티스를 자동화해서 배포용 새 컨테이너를 만들고, 기존 컨테이너를 제거하고, 모든 리소스를 새 컨테이너에 적용할 수 있다. -
자동화된 빈 패킹(bin packing)
컨테이너화된 작업을 실행하는데 사용할 수 있는 쿠버네티스 클러스터 노드를 제공한다. 각 컨테이너가 필요로 하는 CPU와 메모리(RAM)를 쿠버네티스에게 지시한다. 쿠버네티스는 컨테이너를 노드에 맞추어서 리소스를 가장 잘 사용할 수 있도록 해준다. -
자동화된 복구(self-healing)
쿠버네티스는 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체하며, ‘사용자 정의 상태 검사’에 응답하지 않는 컨테이너를 죽이고, 서비스 준비가 끝날 때까지 그러한 과정을 클라이언트에 보여주지 않는다. -
시크릿과 구성 관리
쿠버네티스를 사용하면 암호, OAuth 토큰 및 ssh 키와 같은 중요한 정보를 저장하고 관리 할 수 있다. 컨테이너 이미지를 재구성하지 않고 스택 구성에 비밀을 노출하지 않고도 비밀 및 애플리케이션 구성을 배포 및 업데이트 할 수 있다
기본개념
-
Immutable Infrastructure
"인프라는 항상 변한다"는 가정하에 한 번 만들어진 인프라는 "일회용"으로 사용한다. 즉, 한 번 만들어진 인프라의 변경은 코드를 통한 재생성을 통해 교체되는 방식으로 이뤄져야 한다.
그리고 인프라는 쉽게 다시 만들 수 있어야 하며, 설계 변경 이력을 관리할 수 있어야 한다. 이를 위해 Declarative Configuration Management를 활용할 수 있다. -
Declarative Configuration Management
사용자가 "최종적으로 원하는 상태"를 정의하는 구성 정의 파일로 인프라를 관리한다. 이 파일은 VCS에서 버전관리하여 변경이력을 관리해야 한다. -
Reconciliation Loops
Kubernetest는 Declarative Configuration Management에 정의된 최종 상태와 현재 상태를 계속 비교하고, 상태가 상이할 경우 이를 일치시킨다.
-
Level Trigger
Kubernetes는 Level Trigger 방식을 사용하여 'Edge Trigger 방식처럼 이벤트 발생시에만 상태를 제어'하는 것이 아니라 계속해서 상태를 확인하는 방식으로 관리한다. 따라서 문제발생 시에도 최종 상태를 계속해서 유지할 수 있다.
-
Event Chain
Kubernetes의 각 컴포넌트는 자신의 역할에만 집중하도록 설계되었다.
Controller Manager는 API Server를 (Level Trigger 방식에 따라) 계속 Watch하고, 각 오브젝트가 최종 상태를 유지할 수 있도록 Reconciliation Loops를 거쳐 API Server로 상태 변경을 요청한다.
아키텍처
Kubernetes는 클러스터를 관리/오케스트레이션하는 Master와 실제 컨테이너를 배치/구동하는 Node로 구성되어 있다. (Master-Node 구조)
-
API Server
Kubernetes의 리소스 정보를 관리하기 위한 REST API를 제공하고, 리소스 정보를 데이터 스토어(etcd)에 저장한다. -
Controller Manager
Kubernetes 클러스터 내의 리소스를 감시하고, 본래 유지되어 있어야 할 상태를 유지하도록 관리한다. -
Scheduler
Pod를 어느 노드에 배치할지 결정한다. -
etcd
Kubernetes 클러스터의 구성 정보를 유지하는 Key-Value Storage. -
kubelet
각 노드에서 실행되어 컨테이너 실행 또는 스토리지 마운트를 하거나 상태를 감시하여 API Server에 전달하는 Agent. -
kube-proxy
다양한 중계 및 변환을 수행하는 네트워크 프록시
오브젝트
컨테이너 배포 관련 오브젝트 관계
네트워크 관련 오브젝트 관계
분류
- 컨테이너
- Pod
- ReplicaSet
- Deployment
- StatefulSet
- 네트워크
- Service
- Ingress
- 볼륨
- PersistentVolume
- 설정관리
- ConfigMap
- Secret
Pod
Kubernetes에서 배포할 수 있는 가장 작은 단위이며, 한 개 이상의 컨테이너의 묶음이다. Pod 안에 하나의 컨테이너만 실행할 경우 기존에 사용되던 VM과 비슷하다고 볼 수 있다.
ReplicaSet
한 개 이상의 Pod를 복제하여 기동되도록 유지하는 기능을 제공하는 오브젝트이다.
Deployment
다수의 Pod로 구성된 ReplicaSet의 배포전략(RollingUpdate, Re-Create)을 세우고, 이력관리(롤백)를 할 수 있는 오브젝트이다.
StatefulSet
기본적으로 컨테이너는 Stateless 하다는 개념으로 사용한다. 그러나 DB와 같이 영구적으로 데이터를 보존해야 하거나 Pod의 이름, IP 등의 정보를 유지해야할 경우 StatefulSet을 사용할 수 있다.
Service
L4 스위치 역할을 수행한다. Kubernetes에 생성된 Pod로 접근하기 위한 네트워크를 정의하며 로드 밸런스 기능을 지원한다.
클러스터 내 Pod 간 연결을 위해 Private IP가 할당되는 Cluster IP와 클러스터 외부에서의 연결을 위해 제공되는 External IP가 존재한다.
외부에 Pod를 노출하기 위한 4가지 종류(타입)이 존재한다. :
-
ClusterIP
클러스터 내에서 내부 IP 에 대해 서비스를 노출해준다. 이 방식은 오직 클러스터 내에서만 서비스가 접근될 수 있도록 해준다. -
NodePort
NAT가 이용되는 클러스터 내에서 각각 선택된 노드들의 동일한 포트에 서비스를 노출시켜준다. :를 이용하여 클러스터 외부로부터 서비스가 접근할 수 있도록 해준다. CluserIP의 상위 집합이다. -
LoadBalancer
(지원 가능한 경우) 기존 클라우드에서 외부용 로드밸런서를 생성하고 서비스에 고정된 공인 IP를 할당해준다. NodePort의 상위 집합이다. -
ExternalName
이름으로 CNAME 레코드를 반환함으로써 임의의 이름(스펙에서 externalName으로 명시)을 이용하여 서비스를 노출시켜준다. 프록시는 사용되지 않는다. 이 방식은 kube-dns 버전 1.7 이상에서 지원 가능하다.
Ingress
L7 스위치 역할을 수행한다. 로드 밸런싱, URL 기반 라우팅, SSL Offloading, Virtual Hosting 등의 기능을 지원한다.
PersistentVolume
기본적으로 컨테이너는 Stateless 하다는 개념으로 사용한다. 따라서 컨테이너 삭제시 그 안에 포함된 데이터도 모두 삭제된다. PersistentVolume을 통해 외부 스토리지에 컨테이너가 삭제되어도 보관할 데이터를 저장할 수 있다.
PersistentVolumeClaim
PersistentVolume을 Pod에서 사용하기 위한 리소스
ConfigMap
어플리케이션의 설정정보, 설정파일, 명령인자 등을 etcd에 Key-Value 형태로 저장하는 기능. Pod에서 볼륨으로 마운트하여 사용할 수 있다.
Secret
비밀번호, API 토큰, 인증서 등 보안 유지가 필요한 정보를 저장한다는 점을 제외하곤 ConfigMap과 동일하다.
부가기능
-
Namespace
한 클러스터 내에서 팀/조직/서비스 등의 단위로 경계를 나눠 논리적인 클러스터를 만드는 기능. -
Label & Selector
각 오브젝트에 사전에 정의된 Label이나 Custom Label을 할당할 수 있다. 이를 바탕으로 각 오브젝트 간에 관계를 설정(Selector)하거나, 각 서비스/타입 등으로 구분하여 분류할 수 있다. -
QoS
하나의 Pod가 모든 자원을 점유하지 않도록 Resource Quota / Limit을 지정할 수 있다. Scheduler는 이 값을 사용하여 Pod를 노드에 배치한다. -
HPA(Horizontal Pod Autoscaler)
CPU 사용량(또는 Beta 버전으로 제공되는 다른 Metric)을 관찰하여 Deployment, ReplicaSet, StatefulSet, Replication Controller의 Pod 개수를 자동으로 Scale-In/Out 한다. -
Drain
Kubernetes 노드 관리를 위해 특정 노드에 더 이상 배치되지 않도록 상태를 지정하고, 이미 배치된 Pod를 다른 노드로 점진적으로 이사한다.
관련 툴
- Package Manager
- helm
- CI/CD
- JenkinsX
- Spinnaker
- Service Mesh
- Istio
- Linkerd
- Service Proxy
- envoy
- traefik
출처
'IT 인프라 > DevOps' 카테고리의 다른 글
Kubernetes Secret으로 기밀정보 관리하기 (0) | 2019.11.27 |
---|---|
Kubernetes ConfigMap으로 설정정보 관리하기 (0) | 2019.11.26 |
Docker 이미지 용량을 줄이는 Tip (0) | 2019.11.19 |
나만의 Docker Compose Cheat Sheet (0) | 2019.11.18 |
나만의 Dockerfile Cheat Sheet (0) | 2019.11.18 |