/ kubernetes

kubernetes

서버 애플리케이션을 배포하는 방법은 다양하다.

배포의 정점은 다음과 같은 내용을 다루게 된다.

  • 무정지 배포
  • 자동 스케일 아웃
  • 실시간 로그
  • 모니터링
  • 원버튼 롤백

이런 것들을 직접 구현하려면 엄청난 리소스가 든다.

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