#1 Kubernetes 들어가기


쿠버네티스

큰 기업들은 대규모의 서비스를 운영하고 있기 때문에 최대한 자원을 효율적으로 써야 비용에 유리하다.
또한 트래픽을 예측할 수도 없을뿐더러, 대량의 트래픽에 대비해 모든 인프라와 자원들을 갖춰 놓긴 힘들 것이다.

그래서 서버 자원을 효율적으로 쓰기 위해서는 가상화기술에 대해 관심을 가질 수 밖에 없다.

쿠버네티스의 장점

  • 쿠버네티스는 여러 기능들을 통해 운영 자동화 지원한다.

    • 운영환경이 편리해진다.
  • 서비스 효율이 증가해 서버가 적어지게 되면 그만큼 서버의 유지비용이 적어진다.

    • 즉, 운영의 규모가 커질수록 쿠버네티스의 효율이 증가하게 된다.

가상화 기술에 대한 History

Linux 자원 격리 기술

리눅스에서는 자원들을 격리해서 프로세스들이 독립적인 환경에서 돌아가는 즉, 자원 격리 기술인 namespace, cgroup 등이 있었다.
하지만 사용하기가 불편해 대중적이지 못했다.

VM 가상화 기술

기업들과 일반인 모두에게 쉽게 가상화를 구현하는데 발전이 되었다.
또한 NASArack space가 공동으로 제작한 openstack으로 자신의 운영체제를 자동화 하였다.

근데 하다보니 자동화는 되는거 같은데 시스템의 효율이 안나는걸 느끼게 된다.
가장 큰 원인을 제공하는게 VM가상화를 하기 위해선 무거운 OS를 띄어야 한다. 즉, 가벼운 서비스를 하나 띄우기 위해 이보다 더 큰 OS를 띄워야 하는 경우도 생기게 된다.

Docker 컨테이너 기술

dotCloud 회사가 내장 리눅스의 자원격리 기술 컨테이너라는 이름으로 사용하기 쉽게 만들고 docker로 회사 이름을 변경하였다.
컨테이너 가상화기술은 서비스 간에 자원격리를 하는데 OS가 별도로 필요없다.
또한 OS 가동시간이 없기 때문에 자동화시에 빠르고, 자원 효율도 매우 높다.

하지만 도커자체는 하나의 서비스를 컨테이너로 가상화시켜서 배포를 하는거지 많은 서비스들을 운영할 때 일일이 배포하고 운영하는 역활을 해주진 않는다.

쿠버네티스 오케스트레이터

컨테이너 오케스트레이터: 여러 컨테이너들을 관리해주는 솔루션

다양한 오케스트레이터 툴들이 존재하지만 쿠버네티스는 오케스트레이터의 사실상 업계 표준

클라우드의 서비스

쿠버네티스는 오픈소스이기 때문에 다양한 클라우드 회사에서 쿠버네티스가 설치되어 있는 인프라를 서비스하고 있다.
또한 자신이 직접 쿠버네티스를 설치해 최적화를 시키는 것도 가능하다.

컨테이너의 개념

각각의 컨테이너(이미지) 안에는 서비스를 운영할 수 있는 소스코드와 라이브러리 등이 있다.
하지만 리눅스의 버전마다 지원하는 라이브러리의 버전이 다를 수 있고, 버전차이, 환경설정 등의 상이한 차이로 인해 서비스 운용이 안될 수 있다.
이럴 때 도커 엔진만 설치 되어있다면 도커의 자원 격리 기술인 컨테이너 기술을 이용해 컨테이너(이미지)를 개별적으로 분리하고 안정적인 서비스 운용을 가능하게 해준다.
또한 도커는 여러 컨테이너들 간에 호스트 자원을 분리해서 사용할 수 있도록 도와준다. 이 기술이 리눅스의 고유 기술인 namespacecgroups의 기술이다.

  • namespace: mnt, pid, net, ipc, uts, user 등 커널에 관련된 영역을 분리해준다.
  • cgroups: memory, CPU, I/O, network 등 자원에 관련된 영역을 분리해준다.

다시말해 OS에서 제공하는 자원격리 기술을 이용해 컨테이너라는 단위로 서비스를 분리할 수 있도록 해주고, 이걸 이용하면 컨테이너 가상화가 깔려있는 OS에서는 개발환경에 대한 걱정없이 배포가 가능하다.

  • 시스템 구조적으로 컨테이너는 하나의 OS에서 사용, VM은 각각의 OS를 사용
  • 한 서비스를 만들 때 모듈별로 쪼개서 각각의 컨테이너에 담는 것이 MSA(Micro-Service Architecture)이며 이러한 방식을 권함
  • 쿠버네티스는 여러 컨테이너들 or 하나의 컨테이너만 파드에 담을 수 있으며, 하나의 최소 배포 단위이다.
    즉, 내가 필요한 파드들만(모듈) 확장이 가능하고 쿠버네티스가 이를 쉽게 도와준다.

예를들어 VM에서 사용하는 가상화 이미지에 서비스를 할 수 있는 모듈이 A, B, C가 있다
모듈 A, B는 트래픽이 없는 상태이고, 모듈 C에만 과부화가 걸렸을 때 추가적으로 가상화를 구축해줘야 한다. 이때 VM은 필요하지 않은 A, B 모듈의 자원도 추가적으로 증가하게 된다.
하지만 컨테이너의 가상화 기술을 이용하게 되면 모듈별로 쪼개어 모듈 C만 따로 자원을 추가할 수 있는 것이다.

쿠버네티스 Overview

하나의 클러스터 : 마스터와 여러 노드들로 구성되어 있다.

쿠버네티스를 설치할때 “Master를 설치하고 Node를 설치해서 Master에 연결을 했을 때 우리는 쿠버네티스 클러스터를 하나 만들었다”라고 얘기를 합니다.

마스터: 쿠버네티스의 전반적인 기능 / 노드들을 관리해준다.

노드 : Node는 실제 App(pod)들이 구동되기 위해 자원을 제공하는역할 / 클러스터의 자원을 늘리고 싶다면 노드들을 추가해주면 된다.

namespace : 클러스터 안의 namespace는 쿠버네티스 오브젝트들을 독립된 공간으로 분리시켜준다.

  • 최소 배포단위는 pod가 있고, 외부로부터 연결시켜주는 service가 존재
  • 서로 다른 네임스페이스끼리 pod 연결이 불가능
  • ResourceQuota / LimitRange를 설정해줘서 하나의 namespace 안에 자원을 한정 시킬 수 있다.

    • 파드의 개수, CPU, memory 자원을 제한 등
  • ConfigMap / Secret를 설정해줘서 파드 생성 시 환경변수 값이나 파일을 마운팅 해줄 수 있다.
  • Controller의 종류와 기능

    • Replication Controller, ReplicaSet: Pod 문제 시 자동 재생성
      자동 스케일 인/아웃의 기능
    • Deployment: 배포 후에 파드들을 새 버전으로 업그레이드
      업그레이드시 문제가 생기면 롤백도 쉽게 할 수 있도록 도와준다.
    • DeamonSet: 한 노드의 파드가 하나씩만 유지가 되도록 하게 해준다.
    • CronJob: 주기적으로 어떤 특정 작업만 하고 종료를 해야할 때 파드가 그렇게 동작하도록 도와준다.

참고 사이트

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


위로 올라가기💨

Hello, I'm@nickhealthy
개발자를 꿈꾸고, 파이썬과 클라우드에 관심이 많은 비전공자

Github