All Articles

[Kubernetes] 쿠버네티스 기초

NCC

Kubernetes based container cluster

컨테이너

소프트웨어를 스탠다드한 유닛으로 패키징하는 기술

  • 컨테이너는 어플리케이션의 런타임 인스턴스
  • 컨테이너 단위로 OS, 라이브러리, 어플리케이션을 패키징 할 수 있다.
  • 배포 단위로 컨테이너 이미지 만들어 사용 가능

    • Immutable 한 배포 ⇒ 쉽게 배포, 롤백
    • CI/CD에 적합

컨테이너 기술 요소

Linux Namespace

프로세스 별로 격리된 공간 제공 (프로세스의 가상화)

프로세스가 볼 수 있는 리소스의 view를 재정의 (MNT, hostname, PID, IPC, Network, Username…)

커널이 알고있는 실제 데이터와 다르게 정의 ⇒ 프로세스마다 다르게 보게할 수 있다

cgroup

리소스의 사용량을 한정하는 기술

  • 리소스 할당 방식

    • static binding: 특정 리소스만 사용하도록 그룹별 바인딩
    • Priority-based: 어떤 cgroup에게 특정 리소스 사용의 우선순위 부여
    • limit: 얼마 이상 사용할 수 없게 제한

unionfs

파일 시스템의 immutability를 보장 ⇒ 컨테이너가 사용할 파일 시스템 격리

Docker

컨테이너를 이미지 파일로 빌드하고 배포하여 어디서나 실행할 수 있게 해주는 오픈소스

마치 깃처럼… 빌드 푸시하고 실행하고

자동으로 immutable하게 실행할 수 있도록 해줌

서버 - 클라이언트로 나뉨

  • 클라이언트 = REST 요청 ⇒ 서버 (build)
  • Image: 어떤 어플리케이션을 실행하기 위한 환경

    • 도커에서는 어플리케이션을 실행하기 위한 파일들을 모아놓고 어플리케이션과 함께 이미지로 만들 수 있음 ⇒ 이 이미지를 기반으로 어플리케이션을 바로 배포 가능

Kubernetes

: Container Orchestration System

구글의 컨테이너 플랫폼 / 마이크로서비스 플랫폼 / 이식성있는 클라우드 플랫폼

다양한 어플리케이션 타입(Stateless, Stateful, 데이터 처리…)를 컨테이너로 구동할 수 있게 해줌

Docker Orchestration: 클러스터 상에서 콘테이너를 설치, 관리해줌

  • Scheduling : 여러 호스트에 컨테이너 분배, 장애 시 재분배…
  • Networking : 분산된 컨테이너 간의 네트워크
  • Logging: 컨테이너의 로그 조회
  • Monitoring
  • Storage

선언적으로 동작하는 시스템 ( REST API와는 달리 )

Kubernetes Object (pod)를 Kubernetes 시스템에 반영하는 방식으로 동작 (object의 생성, 실행, 삭제…)

⇒ 이식성있는 동작

Kubernetes Objects

Pod

Kubernetes에서는 컨테이너를 Pod 단위로 묶어서 배포

한 Pod내의 컨테이너는 네트워크와 로컬 디스크 볼륨을 공유함

Pod 단위로 IP 할당 (ncc에서는 실제 외부에서 접근 가능한 ip 할당됨)

Pod 안에 컨테이너는 1개 ~ n개, 로컬디스크도 같이 넣을 수도 있고

Deployment

여러개의 ReplicaSet을 관리, 배포 담당

Deployment Object 생성 ⇒ 얘네가 ReplicaSet 생성, 관리

Service

여러 Pod들의 접근 Endpoint → IP 제공 (사용자가 접근할 수 있도록)

서비스 생성 시 IP 할당 받음

Pod들의 부하 / 분산

  • ClusterIP (default)

    • e.g. msa에서 컴포넌트끼리 통신할 때 외부 노출할 필요 없이 사용
  • LoadBalancer ⇒ 외부에서 접근 가능한 IP를 하나 더 할당받음

Statefulset

stateful한 어플리케이션을 관리하기 위한 오브젝트

⇒ redis, mysql, kafka…

(deployment는 stateless한 object)

서비스 배포 전략

Rolling Update

Kubernetes 상에서 이미 동작하고 있는 서비스를 새로운 버전으로 배포하고자 할 때 ⇒ 기존 이미지 pod들을 새로운 pod으로 변경해야 함

사용자가 Deployment에 설정된 image 변경 (apply)

⇒ 내부적으로 Deployment controller 가 자동으로 replicationset을 하나 더 추가하여 pod을 교체해줌

Progressive Deployment

rolling update와 다른 방식, 새로운 버전의 서비스가 잘 동작하는지 점진적으로 확인하면서 반영하고자 하는 경우

기존 버전의 deployment와 별개로 새로운 버전의 image 갖는 deployment 추가

새로운 deployment의 pod label을 지정된 값으로 설정해서 기존 서비스에 포함되어 운영되도록 함

⇒ 새 버전 pod들의 개수를 점진적으로 늘려가면서 기존 pod을 줄이는 방식

Blue/Green Deployment

kubernetes의 서비스 설정 변경하면서 두 개의 Deployment 간 부하를 조절하면서 새 버전으로 교체하는 방식

(Progressive 배포는 운영자가 두 deployment의 설정 변경하면서 pod 개수 조절하는 방식)

부하 분산 비율을 설정해서 일정 기간 동안 두 deployment를 동시에 서비스 되도록 ,,,

selector의 version을 blue/green으로 지정, 부하 분배하는 방식