[DKOS 스터디 복습] 1탄 – 쿠버네티스 간단 소개

by 라온클

들어가며

안내 : 본 포스팅은 가시다님의 DKOS 스터디 복습 포스팅입니다.

쿠버네티스 등장배경

우선 쿠버네티스가 어떻게 생겨났는지 봅시다.

이미지 출처 : https://kubernetes.io/ko/docs/concepts/overview/what-is-kubernetes/ 

Traditional Deployment

처음엔, 물리 서버 위에서 애플리케이션을 운영했습니다.

물리 서버에서는 애플리케이션들 사이에 리소스 경계를 정의할 방법이 없었고, 이로 인해 리소스 할당 문제가 발생했습니다.

예를 들면, 물리 서버 하나에서 여러 애플리케이션을 실행하면, 리소스 대부분을 차지하는 애플리케이션 때문에 다른 애플리케이션 성능이 저하될 수 있었습니다.

이를 해결하기 위해 애플리케이션 마다 서로 다른 물리 서버를 사용하는 방법도 있지만, 많은 비용이 든다는 문제점이 있었습니다.

Virtualized Deployment

그 해결책으로 가상화란 개념이 생겼습니다.

가상화는 단일 물리 서버의 CPU에서 여러 VM을 실행할 수 있게 해주었고, VM간에 애플리케이션을 격리하여 일정 수준의 보안성도 보장해주었습니다.

각 VM은 운영체제를 포함하여 애플리케이션을 실행할 수 있게 해주는 모든 구성요소가 들어있는 1개의 완전한 머신을 말합니다.

Container Deployment

VM은 운영체제를 포함하고 있기 때문에 배포가 무겁다는 단점이 있었습니다. 

이를 보완하기 위해 컨테이너라는 개념이 생겼습니다.

컨테이너는 구성요소들을 포함하고 있다는 점에선 VM과 유사하지만, VM과 다르게 운영체제를 포함하지 않는다는 점이 다릅니다.

그렇기에 용량이 VM보다 상대적으로 작고, 그만큼 배포 시간도 수초 단위로 짧아졌습니다.

쿠버네티스란?

한줄 요약 : 쿠버네티스는 컨테이너화된 워크로드(containerized workload)를 관리하기 위한 ‘컨테이너 오케스트레이션’ 플랫폼입니다.

쿠버네티스는 Docker Swarm, Apache Mesos 등 여러 컨테이너 오케스트레이션 플랫폼 중에서도 독보적으로 빠르게 성장하는 생태계를 가지고 있으며, 현재 De facto(사실상 표준)가 되었습니다.

참고 : https://kubernetes.io/ko/docs/concepts/overview/what-is-kubernetes/ 

‘컨테이너 오케스트레이션(Container Orchestration)’이란?

수많은 컨테이너들을 관리할 때 필요한 아래 작업들을 안정적으로 자동화하는 것을 말합니다.

  • 새로 생성할 컨테이너를 어느 노드에 배치할 지 결정하는 스케줄링 관리(매번 노드의 자원 사용량 모니터링 할 필요 없음)
  • 자동 확장(Auto Scaling) 지원
  • 추구하는 상태(Desired State)를 기준으로 자가 치유(Self-healing)
  • (최소 중단, 무중단)배포 자동화 지원 – 롤링 업데이트, 카나리 업데이트, 블루 그린 업데이트

쿠버네티스 기본 개념

애완동물(Pet) vs 가축(Cattle)

애완동물과 가축 비유는 Microsoft의 Distinguished Engineer인 Bill Baker가 “Scaling SQL Server 2012″발표에서 처음 소개한 아이디어입니다.

쿠버네티스는 서버를 애완동물 보다는 가축처럼 다룹니다.

애완동물은 한마리, 한마리가 소중하고, 이름을 붙이며 세심하게 관리합니다.

가축은 무리로 관리하기 때문에, 한두마리가 죽어도 다른 가축에게 일을 맡기면 그만입니다.

쿠버네티스가 서버를 바라보는 관점도 가축과 유사합니다.

모든 서버는 워커 서버로 동작하고, 한두개의 서버(워커 노드)가 망가져도, 손쉽게 다른 워커노드에게 역할을 맡깁니다.

다소 가차없어 보이지만(?) 이 애완동물vs가축 개념은 가용성을 높이고, 장애 반경을 줄이며, 빠른 재해복구를 위해 중요한 개념입니다.

추구하는 상태(Desired State)

쿠버네티스에는 ‘추구하는 상태’ 라는 개념이 있습니다.

쿠버네티스가 말하는 ‘추구하는 상태’는 사용자가 생각하는 최종 애플리케이션 배포 상태를 말합니다.

‘추구하는 상태’개념의 장점은, 장애 발생시 쿠버네티스의 애플리케이션이 죽더라도, 추구하는 상태를 알기 때문에 다시 원래의 ‘추구하는 상태’로 배포 상태를 구성할 수 있다는 점입니다.

특별출연 : 사무실 에어콘

‘추구하는 상태’ 개념은 에어콘을 예시로 들 수 있습니다.

에어컨은 현재 온도를 사용자의 희망 온도와 같게 변경되도록 에어컨 시스템을 작동시킵니다.

쿠버네티스는 ‘현재 상태'(Current State)를 사용자의 ‘추구하는 상태'(Desired State)와 같게 변경되도록 사전에 미리 정의된 특정 작업을 수행합니다.

선언적인(Declarative)

쿠버네티스는 선언적인 시스템 구조를 가졌고, 사용자는 선언형 커맨드(Declarative Command)를 사용합니다.

선언적인 시스템

선언적인 시스템은, 코드가 최종적으로 추구하는 상태를 나타내는 시스템을 말합니다.

선언적인 시스템은 추구하는 상태가 현재 상태와 맞는지 점검하고 그것과 동일하게 변경하는 구조로 되어있습니다.

선언형 커맨드

선언형 커맨드는 사용자가 직접 시스템의 상태를 바꾸지 않고 사용자가 추구하는 상태를 선언적으로 기술하여 명령을 내리는 방법을 말합니다.

쿠버네티스에서는 명령형 커맨드(Imperative Command)보다는 선언형 커맨드(Declarative Command)를 지향합니다.

선언형 커맨드 예시로, HTML파일을 들 수 있습니다. HTML 문서에는 어떻게 명령을 수행해야 하는지는 안 나와있지만, 무엇을 어디에 배치해야 하는지는 선언되어 있습니다.

쿠버네티스에서는 일반적으로 추구하는 상태를 yaml파일로 선언하고, yaml파일을 실행하여 명령을 실행합니다.

예를 들어, 쿠버네티스에서 Pod를 생성하는 과정은 다음과 같습니다.

1단계 : Pod를 작성하는 YAML정의서 mypod.yaml 을 작성합니다.

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx:latest

2단계 : 해당 YAML파일을 실행합니다.

kubectl apply -f mypod.yaml

YAML

YAML(YAML Ain’t Markup Language)은 모든 프로그래밍 언어를 위한 인간친화적인 데이터 직렬화 언어입니다.

쉽게 말하자면 사람이 읽고 쓰기 쉽도록 만들어진 하나의 약속이라고 볼 수 있습니다.

YAML에 대해 잘 설명한 블로그

쿠버네티스 리소스(Resource)

쿠버네티스는 모든 것이 리소스(Resource)로 표현됩니다.

Pod, ReplicaSet, Deployment 등 다양한 리소스가 존재하고 각각 역할이 있습니다.

심지어 사용자(Service Account)까지도 하나의 리소스 오브젝트로 표현 가능합니다.

네임스페이스(Namespace)

한줄 요약 : 클러스터를 논리적으로 분리하는 개념

쿠버네티스는 동일 물리 클러스터 안에서 다수의 가상 클러스터를 지원합니다. 이 가상 클러스터를 네임스페이스라고 부릅니다.(kubernetes supports multiple virtual clusters backed by the same physical cluster. These virtual clusters are called namespaces.)

네임스페이스마다 서로 다른 권한 설정을 할 수 있으며, 네트워크 정책(Network Policy) 등을 설정할 수 있습니다.

쿠버네티스의 모든 리소스를 크게 두 가지로 구분하자면 ‘네임스페이스 레벨 리소스’와 ‘클러스터 레벨 리소스’로 구분이 됩니다.

네임 스페이스에 속하는 리소스

  • Pod
  • Service
  • role
  • deployment

네임 스페이스에 속하지 않는 클러스터 레벨 리소스

  • Node
  • Persistent Volume
  • StorageClass
# 네임스페이스에 속하는 리소스 조회하기
kubectl api-resources --namespaced=true

# 네임스페이스에 속하지 않는 리소스 조회하기
kubectl api-resources --namespaced=false

레이블 & 셀렉터(Label & Selector)

레이블은 오브젝트에 첨부된 키와 값(key-value)의 쌍인 태그 정보입니다.

레이블 체계는 사용자가 오브젝트를 식별할 때 매우 편리하지만, 레이블 자체가 코어 시스템에 직접적으로 영향을 주진 않습니다.

리소스에 레이블을 붙인 후, 셀렉터를 이용하면 특정 key-value(레이블)만 가진 리소스만 추출할 수 있습니다.

참고

공식 홈페이지

블로그

You may also like