서버 애플리케이션을 배포하는 방법은 다양하다.
배포의 정점은 다음과 같은 내용을 다루게 된다.
- 무정지 배포
- 자동 스케일 아웃
- 실시간 로그
- 모니터링
- 원버튼 롤백
이런 것들을 직접 구현하려면 엄청난 리소스가 든다.
Kubernetes(k8s)는 Docker Orchestration으로 위와 같은 기능을 기본으로 제공한다.
그 외에도 엄청 유용한 기능들이 많다.
Kubernetes를 사용하는 방법은 GCP 상에 매니지드된 Kubernetes를 사용하는것과 Kubernetes를 직접 설치에서 사용하는 방법이 있다.
cluster
- 어플리케이션 컨테이너들이 배치되고 실행되는 컴퓨팅 자원
- master와 node를 말함
- 최소 3개의 node를 가지고 운영해야 컨테이너의 롤링 업데이트시 애플리케이션의 down time이 발생하지 않음
master
- kubernetes 클러스터를 관리하는 머신
- 여기에서 모든 명령이 실행
- etcd
- etcdctl
- kube-apiserver
- kube-controller-manager
- kube-scheduler
node
- k8s 클러스터를 구성하는 머신
- pod가 실행되는 머신
- VM 또는 물리 장비
- kublet이라는 agent가 master와 api 통신하여 node를 관리
API Server
- REST API로 Pod, Service, Replication Controller 등을 설정
Controller Manager
- DaemonSet Controller, Replication Controller 개체를 모니터링
- 변경 발생시 pod의 증가 또는 감소 수행
Scheduler
- 각 node의 리소스 사용률을 추적 pod가 실행되어야 하는 노드를 선택하는 일
pod
- 서로 관련된 컨테이너들을 묶어 놓은 집합
- k8s의 배포/운영/관리의 단위
- 클러스터에서 실행중인 하나 이상의 컨테이너 그룹
- pod 안에서의 모든 컨테이너는 IP주소, IPC, 호스트 이름 및 기타 리소스를 공유
- pod는 항상 node 위에서 동작
- node는 가용 자원 내에서 여러개의 pod를 가질 수 있음
- pod 마다 고유한 IP 주소 부여(내부 네트워크)
- pause 컨테이너
- Pod의 네트워크 환경(IP주소, 라우팅 테이블, ...)을 만드는 역할만 수행
- Pod 안의 다른 컨테이너들은 pause 컨테이너가 만든 네트워크 환경을 공유
service
- 같은 일을 하는 Pod 들의 집합
- k8s 클러스터 내에서 고유한 / 고정된 IP 주소 부여
- service에 소속된 멤버 pod들에 대해 로드밸런싱 기능 수행
Kubelet
- node에서 실행되는 서비스
- Pod Spec에 정의된 상태로 컨테이너가 실행 중인지 확인하고 유지함
Kube-proxy
Replication Controller
- pod들의 라이프사이클 관리자
- 사용자의 선언(YML/JSON 파일)에 따라 Pod 숫자(replica 숫자) 관리
- Pod들의 health status를 체크
deployment
- 애플리케이션 인스턴스의 생성과 업데이트를 책임짐
- 복제숫자 및 명시적인 컨테이너 이미지가 필요함
label
- pod들의 그룹핑/조직화를 위해 관리하는 key-value pari / 메타 데이터
# kubectl expose deployment mongodb --type="NodePort" --port 27017
KeyFeature
- Automatic binpacking
- 리소스 요구사항 및 제약 조건에 따라 컨테이너를 자동으로 배치
- Self-healing
- 서비스 중인 컨테이너 종료시 자동으로 복구
- Horizontal scaling
- 수동 또는 CPU 사용량에 따라 자동으로 컨테이너 확장이 가능
- Service discovery and load balancing
- 컨테이너에 고유한 IP 주소와 단일 DNS 이름을 제공하고 이를 통해 로드 밸런싱을 지원
- Automated rollouts and rollbacks
- 모든 인스턴스를 종료하지 않도록 점진적 배치를 지원
- 잘못된 배치의 경우 롤백 수행 가능
kubectl
# node 조회
kubectl get nodes
kubectl get no
# pods 조회
kubectl get pods
kubectl get po
kubectl get pods --all-namespaces
# pod 생성
kubectl run [pod-name] --image=[이미지주소] --replicas=2 --port=8080
# service 생성
kubectl expose deployment [pod-name] --target-port=8080 --type=NodePort
# pod의 service 상태
kubectl get svc
kubectl get service
kubectl describe service
# 컨테이너 내부 접속
kubectl exec [pod-name] -it bash
# 컨테이너 로그 스트리밍
kubectl logs -f [pod-name]
# 복제 확장
kubectl scale [pod-name] --replicas=[replica 수]
# 롤링 업데이트
kubectl set image deployment [pod-name] [pod-name]=[이미지주소]
# 롤백 히스토리
kubectl rollout history deployment [pod-name]
# 롤백 수행
kubectl rollout undo deployment [pod-name] --to-revision=[롤백하고 싶은 revision]
# deployment 상태
kubectl get deployments
# pod 생성
kubectl create -f file
# pod 업데이트
kubectl apply -f file
# container 삭제, public ip 삭제
kubectl delete deployment, service [name]
# 라벨 확인
kubectl get pods -L run
kubectrl delete pod [pod-name]
minikube
helm
helm chart search
Documents