
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
- 쿠버네티스의 기본 단위
- 컨테이너 혹은 컨테이너의 묶음이라고 불리는
podrc
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라는 것을 기본으로 사용했지만 선택 가능하게 제거되었음