일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 공부
- 정보처리기사 실기
- kotlin querydsl
- AI
- Spring
- AWS EKS
- 오블완
- aws
- CloudWatch
- CKA 기출문제
- MySQL
- Elasticsearch
- Pinpoint
- 정보처리기사 실기 기출문제
- Java
- kotlin spring
- kotlin
- minikube
- APM
- PETERICA
- IntelliJ
- 기록으로 실력을 쌓자
- mysql 튜닝
- 티스토리챌린지
- Kubernetes
- Linux
- CKA
- 코틀린 코루틴의 정석
- kotlin coroutine
- 정보처리기사실기 기출문제
- Today
- Total
피터의 개발이야기
[kubernetes] 쿠버네티스 개념 정리 본문
[kubernetes] 쿠버네티스 목차
ㅁ 들어가며
쿠버네티스를 공부하고 누군가에게 설명하면서, 가장 쉽게 설명하는 방법이 무엇인지 고민해 보았습니다. 설명을 하다보니 선언적인 DBMS와 자주 비교하게 되었는데요. 데이터를 "어떻게" 관리하는지 우리는 모르지만, "무엇"을 얻을 지 명령을 내릴 수 있습니다. 쿠버네티스를 이용하면, 인프라 자원을 "어떻게" 관리할지를 추상화하고 "무엇"을 달성할지를 정의하여 시스템의 안정성과 편의성을 극대화 할 수 있습니다. 이 글에서 DBMS와 쿠버네티스 개념을 비교하여 쿠버네티스를 풀어서 설명하고자 합니다.
ㅁ 선언적 명령을 사용하는 DBMS와 Kubernetes
개발자들은 반복적인 작업들을 자동화 하기를 선호합니다. 그래서 요즘 개발 언어의 특징으로 선언적 형태를 선호하는데요. 명령형 프로그래밍과 선언형 프로그래밍 차이에서 자세히 설명하였던 내용인데요. 선언적 형태의 프로그래밍은 "어떻게"가 아닌 "무엇"을 달성할지를 정의하고 "어떻게" 할 달성할지는 추상화하여 재사용성을 높이지요.
대표적인 선언적 프로그래밍 중 DBMS가 있습니다. 복잡하고 다양한 데이터를 SQL문을 통해 명령을 주면, DBMS는 필요한 데이터를 제공합니다. 그러면서 그 내부적인 프로세스는 추상화되어 있어서 선언적 SQL문을 통해 편리하게 데이터를 제공받을 수 있습니다. 사용자는 SQL문(무엇)을 DBMS에게 요청하고 이를 해석하여 필요한 데이터를 제공받지만, 그 내부 프로세스는 DBMS가 알아서 처리해 줍니다.
쿠버네티스란?
쿠버네티스는 1주일에 수십억 개의 컨테이너를 생성하는 구글이 내부 배포시스템인 Borg(Borg: Kubernetes의 전신)를 오픈 소스로 만든 것입니다. 구글의 많은 서비스와 이를 구현하기 위한 컨테이너들의 유기적인 관리를, 인프라 관리를 자동화한 것입니다. 결과적으로 이렇게 되어야 해! 선언적 방식으로 명령(YAML)을 주면 쿠버네티스는 이
를 해석해서 컨테이너들을 자동으로 관리를 해 주어서 서비스 운영이나 시스템 안정성을 확보해 주었습니다.
쿠버네티스의 핵심은 인프라 자원의 자동화인데요. 이를 위해서는 가상화 기술을 이해해야 합니다. 서버자원의 추상화하고 자동으로 설정하기 위해서 물리적 서버의 한계를 넘기 위해 컨테이너 시대로의 여정을 설명하도록 하겠습니다.
ㅁ 물리서버의 한계를 넘어서는 컨테이너 시대
선언적 방식의 자동화를 위해서는 컨테이너 기술이 수반되어야 합니다. 전통적 배포방식에서 컨테이너 배포 방식으로 변화하면서 하드웨어의 추상화를 통해 서버구성이 어떻게 자유로워졌는지 알아봅시다. 마치 컴퓨터 공학에서 하드웨서적인 한계점을 극복하기 위해 소프트웨어가 탄생하였듯이, 서버 인프라 자원(컴퓨터, 네트워크, 스토리지)을 자동화 하고 더욱이 코드를 통해 인프라를 관리하는 코드형 인프라(Infrastructure as Code, IaC)로 발전하게 됩니다.
전통적인 배포 시대: 초기 조직은 하나의 애플리케이션을 물리 서버에서 실행했었습니다. 한 서버에 여러 어플리케이션을 올리면, 어느 어플이 리소스를 과사용 시 다른 서비스에 영향을 주기 때문에 안정성을 확보하기 위해서는 리소스가 남더라도 물리적 서버를 하나 할애하는 경우가 많았고 그만큼 서비스 유지비도 증가하였습니다. 단가가 높은 만큼 확장 시 금전적 이슈도 크고, 실질적인 물리적 서버 구축을 해야 하는 어려움이 있었습니다.
가상화된 배포 시대: VM은 가상화된 하드웨어 상에서 자체 운영체제를 포함한 모든 구성 요소를 실행하는 완전한 머신입니다. 가상화는 단일 물리 서버의 CPU에서 여러 가상 시스템(VM)을 실행하여 VM간에 애플리케이션을 독자적으로 실행하여, 일정 수준의 보안성 및 리소스 제약을 통해 물리 서버의 리소스를 보다 효율적으로 활용할 수 있게 되었습니다. 쉽게 애플리케이션을 추가하거나 업데이트할 수 있고 그 만큼 하드웨어 비용을 절감할 수 있어 더 나은 확장성을 제공하였습니다.
가상화를 통해 클러스터가 가능하게 되었습니다. 가상 VM을 여러 개 생성하고 이 중에 배포가 필요한 경우 disposable처리하여 서비스 무중단 배포가 훨씬 용이해졌습니다.
컨테이너 개발 시대: 컨테이너는 VM과 유사하지만 애플리케이션 간에 운영체제(OS)를 공유하여 경량화하였습니다. VM과 마찬가지로 컨테이너에는 자체 파일 시스템, CPU 점유율, 메모리, 프로세스 공간 등이 있습니다. 기본 인프라 자원을 추상화 하였기 때문에, 클라우드나 OS 배포본에 모두 이식할 수 있게 되었다. 마치 자바가 JVM을 통해 모든 장치에 동일하게 적용이 가능하듯이 말이죠.
전통적인 배포 | 가상화된 배포 | 컨테이너 배포 | |
컴퓨터 | 물리적인 컴퓨터 | 물리적인 컴퓨터에 다수의 가상머신 존재 | 컴퓨터 형태에 영향 받지 않음 |
OS | 물리적인 컴퓨터와 OS | 물리서버OS에 다수 가상서버+게스트OS | OS를 공유함 |
리소스 | 1대의 리소스를 여러 프로그램이 공유 | 가상머신의 리소스를 격리하여 제한함 | 프로그램 실행 환경은 격리되지만 OS는 공유 |
문제점 전이가능성 | 특정 프로그램의 리소스 독점으로 전체 프로그램 영향 | 가상머신의 내부문제가 전이되지 않음 | 컨테이너가 OS에 영향을 주지 않거나, 리소스 리밋이 지정되어있다면 문제가 전이되지 않음 |
코드형 인프라(Infrastructure as Code, IaC)
IaC는 DevOps 사례 및 지속적 통합/지속적 제공(CI/CD)에서 중요한 부분을 차지합니다. 개발자가 하던 프로비저닝 작업을 대부분 IaC로 처리하고 개발자는 스크립트를 실행하여 인프라를 준비할 수 있습니다. 따라서 인프라 준비를 기다리는 동안 애플리케이션 배포를 보류할 필요가 없으며, 시스템 관리자는 시간이 많이 소요되는 수동 프로세스를 관리하지 않아도 됩니다.
컨테이너 개발과 코드형 인프라가 접속되면서 다음과 같은 혜택을 얻게 됩니다.
- 기민한 애플리케이션 생성과 배포: 물리서버 > VM > 컨테이너로 경량화
- 지속적인 개발, 통합 및 배포: 컨테이너 이미지를 빌드해서 배포하고, 롤백도 빠르다.
- 클라우드 및 OS배포판 간 이식성: Ubuntu, RHEL, CoreOS... 어디서든 구동된다.
- 개발, 테스팅 및 운영 환경의 일관성: 이식성 뿐만 아니라, 다양한 환경에서 일관성도 확보할 수 있다.
- 마이크로서비스 구현: 애플리케이션은 모놀리식에서 작고 독립적인 단위로 쪼개져서 동적으로 배포되고 관리될 수 있다.
가상화기술을 통해 인프라 자원의 자율성을 가지게 되었습니다. 이 자율성을 바탕으로 쿠버네티스가 제공하는 기능에 대해서 알아보겠습니다. DB에 빗데어 설명하면, 데이터베이스에서는 모든 작업을 SQL문을 이용하는데, SQL문의 목적성에 따라 DDL, DML, DCL로 구분하여 사용합니다. 마찬가지로 쿠버네티스도 제공하는 기능들의 큰 목적성을 이해하고 접근하면 공부에 도움이 됩니다.
ㅁ 쿠버네티스에서 제공하는 기능
쿠버네티스의 가장 핵심은 현재 상태(current state)를 모니터링하면서 관리자가 설정한 원하는 상태(desired state)를 유지하게 한다.
쿠버네티스의 공식 홈페이지를 참고하면, 다음과 같은 기능들을 제공함을 알 수 있습니다.
- 자동화된 복구(self-healing)
쿠버네티스는 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체하여 가동 중지 시간을 최소화 한다. - 자동화된 롤아웃과 롤백
Kubernetes는 롤아웃 및 롤백을 자동화하여 시스템을 중단하지 않고도 쉽게 업데이트하고 되돌릴 수 있습니다. 이러한 유연성을 통해 조직은 원활한 사용자 경험을 유지하면서 변화를 만들 수 있습니다. - 스토리지 오케스트레이션
쿠버네티스를 사용하면 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재할 수 있다. - 서비스 디스커버리와 로드 밸런싱
쿠버네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있다. 컨테이너에 대한 트래픽이 많으면, 쿠버네티스는 네트워크 트래픽을 로드밸런싱하고 배포하여 배포가 안정적으로 이루어질 수 있다. - 단순화된 DNS 관리
Kubernetes는 DNS 관리를 단순화하여 클러스터 내의 다양한 서비스에 대한 도메인 이름을 쉽게 관리하고 확인할 수 있도록 한다. 이를 통해 네트워크 리소스 관리가 간소화되고 전반적인 시스템 효율성이 향상된다.
ㅁ 마무리
쿠버네티스의 개념과 기능에 대해서 알아보았다. 다음 글, [kubernetes]쿠버네티스 아키텍처에서는 쿠버네티스의 아키텍처를 정리하였다. 쿠버네티스의 최고 상위 개념인 Cluster과 그에 종속하는 하위의 개념들을 차례로 나열하고, 역할에 따라 모듈화된 객체들의 개념을 설명하였다.
ㅁ 함께 보면 좋은 사이트
'Kubernetes > 기초공부' 카테고리의 다른 글
[kubernetes] 쿠버네티스 아키텍처 (0) | 2024.01.05 |
---|---|
[kubernetes] 쿠버네티스 아이콘 모음 (0) | 2024.01.05 |
[kubernetes] taint drain cordon 차이점 (0) | 2023.05.31 |
[Kubernetes] 네트워크 이해 (0) | 2023.05.04 |
[Kubernetes] 쿠버네티스 볼륨 개념 1편 (emptryDir, hostPath) (0) | 2022.10.12 |