on
2. 쿠버네티스 소개
2. 쿠버네티스 소개
2.1 쿠버네티스란
쿠버네티스는 여러 서버로 구성된 클러스터 환경에서 컨테이너화된 프로세스를 관리하기 위한 컨테이너 오케스트레이션 플랫폼입니다. 가벼우면서도 가사와된 실행 환경을 가지는 컨테이너의 특징 때문에 컨테이너를 쉽게 복제, 배포할 수 있습니다. 쿠버네티스를 통해 컨테이너의 배포, 확장 및 스케줄링을 자동화할 수 있습니다.
쿠버네티스는 2014년 중순 구글이 처음 발표했고, 2015년 7월 21일 v1.0을 출시했습니다. 출시와 함께 CNCF 재단에 기증되어 CNCF의 첫번째 프로젝트가 되었습니다. CNCF(Cloud Native Computing Foundation)란, 클라우드 네이티브 오픈소스를 관리하는 재단으로 Linux Foundation의 하위 재단입니다.
컨테이너 오케스트레이션은 다수의 서버 위에서 컨테이너의 전반적인 라이프사이클을 관리해주는 플랫폼입니다.
컨테이너의 실행 및 배포 이중화와 가용성 보장 수평확장 및 축소 관리 스케쥴링 관리 네트워크 설정 health check 설정값 관리
2.2 기본 개념
쿠버네티스는 사용자가 개별 노드(서버)를 직접 제어하지 않고 쿠버네티스라는 추상화된 레이어를 통해 클러스터를 제어할 수 있는 하드웨어 추상화 기능을 제공하고 컨테이너의 스케줄링, 자원할당 관리 등의 기능을 제공합니다. kubectl이라는 cli 기반의 interface를 이용하여 쿠버네티스를 제어합니다.
Desired State
쿠버네티스에는 Desired State라는 개념이 있습니다. 마치 에어컨을 작동할 때 온도 설정을 하면 현재 온도가 변경 되듯이, 쿠버네티스에서도 사용자의 요청에 따라 현재 상태와 바라는 상태가 같아지도록 사전에 미리 정의된 특정 작업을 수행합니다. 쿠버네티스에서 Desired state란 사용자가 생각하는 최종 애플리케이션 배포 상태를 말합니다. 사용자가 자기가 원하는 애플리케이션을 쿠버네티스에게 알려주면 쿠버네티스가 자동으로 Desired State로 변경합니다.
Desired State의 장점은 쿠버네티스가 장애가 발생해서 애플리케이션이 죽더라도 Desired State로 변경하려고 하기 때문에 자가 치유가 가능합니다.
Controller
사용자가 Desired State를 선언하면 쿠버네티스는 현재 상태를 사용자가 Desired State로 변경시키는데 그 주체를 Controller 라고 합니다. 컨트롤러는 control-loop라는 루프를 돌며 특정 리소스를 지속적으로 모니터링 하다 사용자가 생성한 리소스의 이벤트에 따라 정의된 작업을 수행합니다.
Resource
쿠버네티스는 모든 것을 Resoure로 표현합니다. 각 리소스 마다 세부 정의가 다르고 역할, 동작 방식이 다릅니다. 가장 대표적인 쿠버네티스 리소스는 pod 입니다. pod는 하나 이상의 컨테이너를 가지는 쿠버네티스 최소 실행 단위입니다. 쿠버네티스에서 프로세스(컨테이너)를 실행하는 것은 Pod 리소스를 생성하는 것과 비슷한 의미입니다.
Declarative Command
쿠버네티스는 선언형 커맨드(WHAT)를 지향합니다. 선언형 커맨드란 프로그램이 실제로 어떻게 흘러가는 지와 상관없이 프로그램의 논리에 초점을 맞춥니다. 상태와 제어 흐름이 존재 하지 않고 약속된 정의만을 사용해서 작성하는 언어(SQL, HTML 등)를 의미합니다. 그와 반대되는 개념은 명령형 커맨드(HOW) 입니다. 컴퓨터가 어떻게 동작하는지에 초점을 맞춰서 프로그램의 상태를 변화시키는 구문들에 초점을 둡니다. 상태와 제어 흐름이 존재해서 상태를 필요에 따라 생성하고 정의하고 변경(C, C++, JAVA 등)합니다.
쿠버네티스에서는 YAML형식을 이용하여 선언형 커맨드를 내립니다. 다음은 YAML 형식의 pod리소스 예시입니다. 이러한 YAML 형식의 리소스를 YAML 정의서(description) 이라고 부릅니다.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- image: nginx
name: nginx
Namespace
네임스페이스는 클러스터를 논리적으로 분리하는 개념입니다. 네임스페이스마다 다른 권한, 네트워크 정책등을 설정할 수 있습니다. 쿠버네티스의 리소스를 크게 두가지로 구분하자면 네임스페이스 레벨과 클러스터 레벨 리소스로 구분됩니다. 네임스페이스는 사용자가 원하는대로 자유롭게 추가, 삭제가 가능합니다.
네임스페이스 레벨 : Pod, Deployment, Service - 대부분의 쿠버네티스 리소스
클러스터 레벨 : Node, PersistentVolume, StorageClass
Label & Selector
특정 리소스 혹은 리소스 그룹에 명령을 전달하거나 정보를 확인하고 싶을 때 라벨링 시스템을 이용합니다. 리소스에 key-value 형식의 라벨을 붙이고 해당 라벨이 붙은 리소스를 찾기위해 셀렉터를 사용하여 특정 key-value를 가진 리소스를 추출할 수 있습니다. 쿠버네티스는 이를 이용하여 loosely coupled 되게 유연한 구조를 가집니다.
서비스 탐색
쿠버네티스 클러스터내에서 통신하기 위해 노드 위치와 상관없이 접근할 수 있는 service endpoint가 필요합니다. 사용자는 이를 통해 다른 컨테이너(pod)와 통신할 수 있습니다. 사용자는 서비스에 접근하기 위한 접속 정보를 알아야하고 이를 service discovery라 합니다. 쿠버네티스는 dns 기반의 서비스 탐색을 지원 하기에 사용자가 매번 새로운 서비스의 IP를 찾을 필요 없이 도메인 주소를 기반으로 서비스에 접근할 수 있습니다. 이런 기능을 Service 라는 리소스를 이용합니다.
설정 관리
컨테이너를 실행할 떄 필요한 설정값 및 민감 정보(credentials)를 플랫폼 레벨에서 관리할 수 있게 메커니즘을 제공합니다. Configmap 또는 Secret 이라는 리소스를 이용합니다.
2.3 아키텍처
출처 : https://kubernetes.io/docs/concepts/overview/components/
쿠버네티스는 일반적인 클러스터 시스템과 비슷하게 마스터와 워커 노드로 구분 됩니다.
마스터 노드
: 쿠버네티스 클러스터를 구성하는 핵심 컴포너트들이 존재합니다.
api server : 마스터로 전달되는 모든 요청을 받는 REST API 서버
etcd : 클러스터내 모든 메타 정보를 저장하는 저장소
scheduler : 사용자의 요청에 따라 컨테이너를 워커노드에 적절히 배치하는 스케쥴러
controller manager : 현재 상태와 desired 상태를 계속 확인하며 특정 이벤트에 따라 동작을 수행하는 컨트롤러
cloud controller manager : 클라우드 플랫폼(aws, gcp, azure 등)에 특화된 리소스를 제어하는 클라우드 컨트롤러
DNS : 새로운 리소스가 생기면 그 리소스에 대한 IP와 DNS 이름을 등록하여, DNS 이름을 기반으로 리소스에 접근할 수 있게 함
마스터는 단일 서버로 구성할 수 있으며, 고가용성을 위해 여러 서버를 묶어 클러스터 마스터로도 구축할 수 있습니다.
워커 노드
: 마스터로부터 명령을 전달받아 컨테이너를 실행시키는 노드관리자와 컨테이너가 정상적으로 실행될 수 있도록 도와주는 네트워크 프록시, 실행 환경이 있습니다.
kubelet : 마스터의 명령에 따라 컨테이너의 라이프 사이클을 관리하는 노드 관리자
kube-proxy : 컨테이너의 네트워킹을 책임지는 프록시
container runtime : 실제 컨테이너를 실행하는 컨테이너 실행 환경
2.4 장점
실행 환경 고립화 : 쿠버네티스의 모든 프로세스는 컨테이너로 실행되기 때문에 각 서버의 환경을 고려할 필요 없이 서비스 운영 가능
리소스 관리 : 자체적으로 각 서버의 리소스를 체계적으로 관리할 수 있는 기능 제공
스케줄링 : 쿠버네티스 내장 스케줄러가 최적의 노드를 찾아 컨테이너 배치
프로세스 관리
통합 설정 관리 : 중앙에서 통합하여 설정값 관리
손쉬운 장애 대응
자동 확장
하이브릴드 클라우드 운영 : 클라우드 뿐만 아니라 온프레미스 환경에서도 구축 가능
자가 치유
데이터 스토리지 관리 : 다양한 데이터 저장소를 자동으로 관리.
배포 자동화
from http://minimun92.tistory.com/58 by ccl(A) rewrite - 2021-09-10 15:00:22