Kubernetes intro

2 분 소요

Introduction

DevOps에 대해 생소하고 제대로 사용해보지 못했는데 이번 기회에 기본적인 부분부터 파보려 한다.

최종적으론 진행 중인 프로젝트를 띄우는 게 목표이며, 프로덕션 레벨에서 사용하는 작업들을 다루고 싶다.

지금 듣고 있는 노래는 Swan Lake - Chet Baker & Jim Hall & Hubert Laws이다.

Kubernetes

큐벌네테스(?) 이름도 뭐라 발음하는지 모르겠다. 하지만 요상한 이름이 주는 느낌과 달리 상당히 강력한 Container orchestration 플랫폼으로써 자리잡고 있다.

무엇이 쿠버네티스를 이렇게 만들었는지 한 번 알아보자. 그렇게 긴 여정은 아닐 거라 생각한다.

Container

우선 컨테이너 이야기부터 해보자. Container는 쿠버네티스를 이야기 하기 전 반드시 알아야 할 개념이다. 다만, 컨테이너 개념에 대해서 기본적인 것부터 설명하자면 상당히 이야기 길어질 것 같아 우선 자세히 설명된 블로그를 하나 소개하겠다. 한 번 읽어보면 충분히 도움될 거라 생각한다.

초보를 위한 도커 안내서 - 도커란 무엇인가?

서버에서 이야기하는 컨테이너도 이와 비슷한데 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해줍니다.

백엔드 프로그램, 데이터베이스 서버, 메시지 큐등 어떤 프로그램도 컨테이너로 추상화할 수 있고 조립PC, AWS, Azure, Google cloud등 어디에서든 실행할 수 있습니다.

이미지

전통적인 배포 방식은 배포가 진행되는 환경, 패키지 버전 등 여러 요소에 의해서 좌지우지된다. 단순히 배포환경 OS만 달라도 우리가 리눅스 시스템에서 잘 짜둔 배포 환경은 쉽게 무너질 것이다.

이러한 상황은 서버의 규모가 커질수록 더욱 심해진다. 한 곳이라도 구멍이 나면 쉽게 무너질 모래성을 어떻게 우리는 유지보수할 수 있을까?

우리가 원하는 건 환경에 영향없이 여러 상태 변화에도 쉽게 대처 가능한 방식이다.

그렇다면 가상환경은 어떨까? 가상 환경을 통해 배포하는 것이다. 특정 가상환경을 정의하고 해당 환경에서만 배포할 수 있도록 하면 앞에서 언급했던 문제는 쉽게 해결 될 수 있다.

하지만, 위 해결방법은 임시적인 방편일 뿐 만능은 아니다. 그랬다면 쿠버네티스, 도커의 필요성도 이렇게까지 강조될 이유가 없지 않을까? 아쉽게도 가상환경 또한 우리에게 너무나도 사용하기 무거웠다. 또한, 아직도 변경에 민감하다. 복잡한 배포 과정 중 필요한 라이브러리 하나를 업그레이드 했다가 큰 문제가 생긴다고 해보자. 너무나도 정교하고 복잡하게 연결되어있는 탓에 한 가지만 통제 불능이 되더라도 전체 시스템이 사용 불가능한 상황이 오는 것이다.

이에 대한 해결책으로 나온 개념이 컨테이너다 위 이미지를 보면, 컨테이너 환경은 가상환경에 비해 무거울 수 있는 여러가지를 과감하게 쳐냈다.

또한, 컨테이너는 우리가 이용하기 매우 어려웠던 리눅스에 복잡한 기술을 통해 각 어플리케이션간에 독립적인 환경 제공을 가능하게 했다. 도커(컨테이너)가 나오게 되면서 우리는 복잡한 위와같이 복잡한 기술을 단순히 명렁어 한 줄이면 사용할 수 있게 된 것이다.

저장되어있는 메모리 위치와는 관계없이 컨테이너끼리는 서로 독립적으로 동작할 수 있으며 또한, 각각의 컨테이너끼리 통신(상호작용)도 가능하다. 이를 이용해 우리는 환경에 영향없는 배포가 가능해지고 여러 변화에도 독립적으로 적용되는 환경에서 쉽게 이를 고치고 배포하는 게 가능해졌다.

쿠버네티스란

Kubernetes is a portable, extensible, open-source platform for managing containerized workloads and services, that facilitates both declarative configuration and automation. It has a large, rapidly growing ecosystem. Kubernetes services, support, and tools are widely available.

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

쿠버네티스는 다른 컨테이너 오케스트레이션 도구보다 비교적 늦게 등장했지만, 대규모 컨테이너를 관리했던 구글의 노하우와 강력한 확장성, 마이크로소프트, Red Hat, IBM 등 수많은 기업의 참여, 잘 짜인 설계가 쿠버네티스를 왕좌에 오르게 했다.

쿠버네티스가 자랑하는 기능을 몇가지 소개해보려 한다.

Service discovery and load balancing

  • 쿠버네티스는 특정 컨테이너의 아이피 혹은 DNS name을 이용해 접근할 수 있다. 해당 컨테이너의 트래픽이 높을 경우에는 로드밸런싱 또한 제공하여 트래픽을 분산시킬 수 있다.

Storage orchestration

  • 쿠버네티스는 자동으로 로컬 스토리지나 클라우드를 자동으로 마운트하여 사용가능하다.

Automated rollouts and rollbacks

  • 배포된 컨테이너의 상태를 조절하여 원하는 상태로 변경 가능하다.
  • 예를들어, 기존 컨테이너를 제거한 후에 새 컨테이너에 모든 리소스를 적용할 수 있다.

Overview of Kubernetes

이미지

쿠버네티스 클러스터의 대략적인 개관은 위 이미지와 같다.

Control Pane이란 곳에서 각각의 Worker Node와 소통하며 노드에는 Kublet, kube-proxy 등이 존재한다.

공식 문서에서는 컴포넌트 내부와 노드에 대해 간단한 설명이 되어 있지만, 하나하나 천천히 파보는 게 더 좋아보여 해당 내용은 따로 적지 않겠다.

혹시 궁금하다면 Kubernetes Components 문서를 확인해보길 권한다.

포스트를 마치며

오늘은 쿠버네티스의 간단한 소개를 알아보았다.

다음 포스트에서는 본격적으로 예제 사용 및 쿠버네티스의 개념에 대해 자세히 알아보도록 하자.

Reference
  • https://kubernetes.io/docs/concepts/overview/components/
  • https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/
  • https://subicura.com/2019/05/19/kubernetes-basic-1.html