ECS
, 하시코프에서 Nomad
, 전통의 강호 Mesos에서 Marathon
을 발표Service discovery
)같은 기능을 이용하여 서비스 간 연결을 쉽게 해주는 것Rancher 2.0
, OpenShift
(Red Hat), Tectonic
(CoreOS), Docker Enterprise Edition
등이 쿠버네티스를 기반으로 플랫폼을 만들어 대세임을 증명하고 있고 AWS, Google Cloud, Azure, Digital Ocean, IBM Cloud, Oracle Cloud 등에서 관리형 서비스를 내놓음으로써 클라우드 컨테이너 시장을 평정쿠버네티스
(kubernetes
)가 너무 길어서 오타가 많아서 흔히 케이(에이)츠
(k8s
) 또는 큐브
(kube
)라고 줄여서 부름borg
를 기반으로 2014년 프로젝트를 시작했고 여러 커뮤니티의 아이디어와 좋은 사례를 모아 빠르게 발전하고 있음Tip! 추가내용: Kubernetes 목적
① 다중의 도커 서버를 하나의 Pool로 구성
- 쿠버네티스는 다중 서버의 도커 데몬에 연결하여 사용
- 사용자는 사용하는 서버에 서버가 몇 개인지 도커 컨테이너가 몇 개 실행 중인지 알 필요가 없음
- 쿠버네티스 마스터에게 사용자가 필요한 컨테이너를 어떤 목적에 맞는 이미지로 몇 개 만들지만 명령만 하면 됨
② 다중 서버에 분산되어 컨테이너 생성
- 두 개의 워커 노드에 3개의 컨테이너를 생성하게 되면 쿠버네티스에서 알아서 컨테이너를 A서버와 B서버에게 할당
- Idle 상태인 서버를 직접 찾을 필요가 없음
③ A서버와 B서버의 컨테이너 통신
- 각 서버 컨테이너는 각각의 Private IP가 있음
- A서버와 B서버에 있는 컨테이너 간의 통신은
kube-proxy
등을 통해 통신이 가능④ 컨테이너 재생성
- 단일 서버에서 도커 컨테이너를 생성하다 운영하다 보면 가끔은 불편한 상황을 마주할 수 있음
- 서버가 다운되거나 컨테이너가 fail 되어 exit 상태로 빠져나가는 경우
- 쿠버네티스는 이 상황을 방지하여 동일한 컨테이너를 생성하고 서비스를 지속적으로 제공
⑤ Load Balance
- 예를 들어 쿠버네티스 클러스터로 생성된 웹사이트에 3개의 컨테이너가 동작하고 있는데 그 웹사이트의 Public IP로 사용자가 접근할 때마다 container1 -> container2 -> container3 순서로 접근할 수 있도록
round-robin
형태의 로드밸런싱이 제공
Istio
, linkerd
), CI(Tekton
, Spinnaker
), 컨테이너 서버리스(Knative
), 머신러닝(kubeflow
)이 모두 쿠버네티스 환경에서 돌아감프론트엔드+백엔드
) 애플리케이션을 다루고 있지만, 실제 세상엔 더 다양한 형태의 애플리케이션이 있음Deployment
, StatefulSets
, DaemonSet
, Job
, CronJob
등 다양한 배포 방식을 지원Deployment
는 새로운 버전의 애플리케이션을 다양한 전략으로 무중단 배포할 수 있음StatefulSets
은 실행 순서를 보장하고 호스트 이름과 볼륨을 일정하게 사용할 수 있어 순서나 데이터가 중요한 경우에 사용할 수 있음DaemonSet
을 이용하고 배치성 작업은 Job
이나 CronJob
을 이용하면 됨Ingress
기능을 제공Ingress
는 이를 자동화하면서 기존 프록시 서버에서 사용하는 설정을 거의 그대로 사용할 수 있음Ingress
설정을 할 수 있어 관리자 접속용 Ingress
와 일반 접속용 Ingress
를 따로 관리 가능AutoScaling
)이 있고 IP를 할당받아 로드밸런스(LoadBalancer
)로 사용할 수 있음Cloud Controller
를 이용하여 클라우드 연동을 손쉽게 확장할 수 있음system
, default
)외에 여러 개의 네임스페이스를 사용하는 것이 일반적IAM
을 연동해서 사용할 수도 있음cert-manager
를 설치하고 Certificate
리소스를 이용하면 익숙한 쿠버네티스 명령어로 인증서를 관리할 수 있음Horizontal Pod Autoscaler
(HPA
), 컨테이너의 리소스 할당량을 조정하는 Vertical Pod Autoscaler
(VPA
), 서버 개수를 조정하는 Cluster Autosclaer
(CA
) 방식이 있음Anthos
를 이용하면 한 곳에서 여러 클라우드의 여러 클러스터를 관리할 수 있음YAML 설정 파일
은 너무 많고 클러스터를 만드는 것도 쉽지 않음Cloud Code
같은 플러그인을 이용하거나 helm
같은 패키지 매니저를 사용하면 비교적 편리하게 설정파일을 관리할 수 있음Tip! 추가내용: Kubernetes 용어
master
- 마스터 노드
- 다중 도커 데몬을 관리하는 일을 함
worker
- 도커가 설치되어 있으며 실제 컨테이너들이 생성되어 일하는 노드
- 예전에는
minion
이라는 이름을 가지기도 했음- 마스터의 관리를 받고 있음
pod
- 쿠버네티스의 기본 단위
- 컨테이너 혹은 컨테이너의 묶음이라고 불리는
pod
rc
rc
는replication controller
의 줄임말pod
를 자동으로 생성 복제해주는 컨트롤러
- 복제 개수 설정을 3으로 하게 되면 3개의
pod
가 서비스상에 계속 active 상태가 됨service
pod
의 group을 식별하는 라벨이라는 기준에 따라pod
들을 하나의service
로 외부에서 접근할 수 있도록 해줌yaml
- 쿠버네티스에서
service
,rc
,pod
등 기능을 설명한 데이터 형식 코드- 야믈이라고 읽음
desired state
- 원하는 상태 라는 개념current state
)를 모니터링하면서 관리자가 설정한 원하는 상태를 유지하려고 내부적으로 이런저런 작업을 하는 단순한 로직을 가지고 있음imperative
)이고 "80 포트를 오픈한 nginx 컨테이너를 1개 유지해줘"는 원하는 상태를 선언(declarative
) 한 것# 명령
$ docker run
# 상태 생성
$ kubectl create
Pod
에 속한 컨테이너는 스토리지와 네트워크를 공유하고 서로 localhost
로 접근 가능Pod
으로 감싸서 관리Pod
을 여러 개(한 개 이상) 복제하여 관리하는 오브젝트Pod
을 생성하고 개수를 유지하려면 반드시 ReplicaSet
을 사용해야 함ReplicaSet
은 복제할 개수, 개수를 체크할 라벨 선택자, 생성할 Pod
의 설정값(템플릿)등을 가지고 있음ReplicaSet
을 사용하기보다는 Deployment
등 다른 오브젝트에 의해서 사용되는 경우가 많음Pod
을 외부 네트워크와 연결해주고 여러 개의 Pod
을 바라보는 내부 로드 밸런서를 생성할 때 사용EBS
같은 스토리지를 동적으로 생성하여 사용할 수도 있음# 예시
apiVersion: v1
kind: Pod
metadata:
name: example
spec:
containers:
- name: busybox
image: busybox:1.25
Spec
)는 YAML 파일
로 정의하고 여기에 오브젝트의 종류와 원하는 상태를 입력JSON
도 가능하다고 하지만 잘 안 씀desired state
)를 다양한 오브젝트(object
)에 라벨(Label
)을 붙여 정의(YAML 파일
)하고 API 서버에 전달하는 방식을 사용Cloud code
, Helm
, Knative
를 사용하면 조금 편해지긴 하지만 기본적으로 너무 복잡하고 러닝 커브가 높은 편run
을 하면 실행되고 stop
을 하면 멈춤Master
)에 API 서버와 상태 저장소를 두고 각 서버(Node
)의 에이전트(kubelet
)와 통신하는 단순한 구조Pod
을 생성하고 네트워크와 볼륨을 설정json
또는 protobuf
형식을 이용한 http
통신을 지원kubectl
이라는 명령행 도구를 사용큐브컨트롤
(cube control
)이라고 읽지만 큐브씨티엘
, 쿱컨트롤
, 쿱씨티엘
등도 많이 쓰임kubectl
의 요청뿐 아니라 내부 모듈의 요청도 처리하며 권한을 체크하여 요청을 거부할 수 있음key-value
저장소에 저장하고 저장된 상태를 조회하는 매우 단순한 작업Pod
을 노드에 할당하고 상태를 체크하는 일은 다른 모듈로 분리되어 있음key-value
저장소watch
기능이 있어 어떤 상태가 변경되면 바로 체크하여 로직을 실행할 수 있음stateless
하게 동작하기 때문에 etcd
만 잘 백업해두면 언제든지 클러스터를 복구할 수 있음etcd
는 오직 API 서버와 통신하고 다른 모듈은 API 서버를 거쳐 etcd
데이터에 접근k3s
같은 초경량 쿠버네티스 배포판에서는 etcd
대신 sqlite
를 사용하기도 함etcd
저장소와 통신할 뿐 실제로 상태를 바꾸는 건 스케줄러와 컨트롤러Kube-Scheduler
)Pod
을 여러 가지 조건(필요한 자원, 라벨)에 따라 적절한 노드 서버에 할당해주는 모듈Kube-Controller-Manager
)Deployment
는 ReplicaSet
을 생성하고 ReplicaSet
은 Pod
을 생성하고 Pod
은 스케줄러가 관리하는 식Cloud-Controller-Manager
)Pod
의 생명주기를 관리Pod
을 생성하고 Pod
안의 컨테이너에 이상이 없는지 확인하면서 주기적으로 마스터에 상태를 전달Pod
을 관리한다면 프록시는 Pod
으로 연결되는 네트워크를 관리Pod
을 라운드로빈 형태로 묶어 서비스를 제공할 수 있음Kube-Proxy
자체가 프록시 서버로 동작하면서 실제 요청을 프록시 서버가 받고 각 Pod
에 전달해 주었는데 시간이 지나면서 iptables
를 설정하는 방식으로 변경iptables
에 등록된 규칙이 많아지면 느려지는 문제 때문에 최근 IPVS
를 지원하기 시작CRI
(Container runtime interface
)를 구현한 다양한 컨테이너 런타임을 지원ReplicaSet
을 생성하면 다음과 같은 과정을 거쳐 Pod
을 생성API Server
와 통신하는 것을 알 수 있음API Server
를 통해 etcd
에 저장된 상태를 체크하고 현재 상태와 원하는 상태가 다르면 필요한 작업을 수행ReplicaSet
명세를 YML 파일
로 정의하고 kubectl
도구를 이용하여 API Server
에 명령을 전달API Server
는 새로운 ReplicaSet Object
를 etcd
에 저장Kube Controller
에 포함된 ReplicaSet Controller
가 ReplicaSet
을 감시하다가 ReplicaSet
에 정의된 Label Selector
조건을 만족하는 Pod
이 존재하는지 체크Label
의 Pod
이 없으면 ReplicaSet
의 Pod
템플릿을 보고 새로운 Pod
(no assign) 을 생성API Server
에 전달하고 API Server
는 etcd
에 저장Scheduler
는 할당되지 않은 (no assign) Pod
이 있는지 체크Pod
이 있으면 조건에 맞는 Node
를 찾아 해당 Pod을
할당Kubelet
은 자신의 Node
에 할당되었지만 아직 생성되지 않은 Pod
이 있는지 체크Pod
이 있으면 명세를 보고 Pod
을 생성Pod
의 상태를 주기적으로 API Server
에 전달Tip!
ReplicaSet
에 대해 다뤘지만 모든 노드에Pod
을 배포하는DaemonSet
도 동일한 방식으로 동작
DaemonSet controller
와Scheduler
가 전체 노드에 대해Pod
을 할당하면kubelet
이 자기 노드에 할당된Pod
을 생성하는 방식- 각각의 모듈이 각자 담당한 상태를 체크하고 독립적으로 동작
Cloud controller
는 원래 Kube controller
에 포함되어 있었는데 최근 분리되었고 Node
의 모니터링을 위해 cAdvisor
라는 것을 기본으로 사용했지만 선택 가능하게 제거되었음