일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 포인터
- c언어
- C# delegate
- 유니티
- 깃
- c#
- github
- C언어 포인터
- 도커
- gitlab
- HTML
- vim
- Python
- 다트 언어
- jupyter
- jupyter lab
- Flutter
- dart 언어
- Algorithm
- Data Structure
- c# winform
- docker
- Unity
- 구조체
- Houdini
- C++
- git
- c# 윈폼
- 플러터
- c# 추상 클래스
- Today
- Total
nomad-programmer
[DevOps/Kubernetes] Kubernetes (쿠버네티스)의 구조 본문
쿠버네트스란?
kubernetes.io/ko/docs/concepts/overview/what-is-kubernetes/
Kubernetes는 마스터, 데이터 스토어, 노드가 서로 협력하면서 컨테이너의 실행 환경을 관리하는데, 그 안에서 몇 가지 컴포넌트가 작동한다.
1. 마스터 (Master)
마스터는 다음과 같은 컴포넌트로 구성된다.
API Server
Kubernetes의 리소스 정보를 관리하기 위한 프론트엔드 REST API이다. 각 컴포넌트로부터 리소스 정보를 받아 데이터 스토어(etcd)에 저장한다. 다른 컴포넌트는 API Server를 통해 etcd의 정보에 액세스한다.
프로그래머가 API Server에 액새스하려면 웹의 GUI 툴이나 kubectl 명령을 사용한다. 또한 애플리케이션 안에서 API Server를 호출할 수도 있다. API Server는 인증 및 인가 기능도 갖고 있다.
Scheduler
Scheduler는 Pod를 어떤 노드에서 작동시킬지를 제어하는 백엔드 컴포넌트이다.
Scheduler는 노드에 할당되어 있지 않은 Pod에 대해 Kubernetes 클러스터의 상태를 확인하고 빈 영역을 가진 노드를 찾아 Pod를 실행시키는 스케줄링을 수행한다.
Controller Manager
Controller Manager는 Kubernetes 클러스터의 상태를 항상 감시하는 백엔드 컴포넌트이다.
정의 파일에서 정의한 것과 실제 노드가 컨테이너에서 움직이고 있는 상태를 모아서 관리한다.
2. 데이터 스토어 (etcd)
Kubernetes 클러스터 구성을 유지 관리하는 KVS이다. Key-Value형으로 데이터를 관리한다.
어떤 Pod를 어떻게 배치할지와 같은 구성 정보를 갖고 있으며, API Server가 참조한다.
3. 노드 (Node)
노드는 다음과 같은 컴포넌트로 구성된다.
kubelet
노드에서는 kubelet라는 에이전트가 작동하고 있다. 이것은 Pod의 정의 파일에 따라 docker 컨테이너를 실행하거나 스토리지를 마운트하는 기능을 갖고 있다. 또한 kubelet은 노드의 상태를 정기적으로 감시하는 기능을 갖고 있어서 상태 변화시, API Server에게 통지한다.
Kubernetes에서는 클러스터의 구성 정보를 YAML 또는 JSON 형식의 정의 파일로 관리할 수 있다. 이 정의 파일을 매니페스트(manifest) 파일이라고 하는데, 선언 기반으로 구성을 관리한다.
매니페스트 파일은 텍스트 파일로, Jenkins와 같은 소프트웨어의 버전 관리 시스템과 연계할 수 있다.
또한 테스트나 작동 확인 시에는 kubectl 명령의 인수로 클러스터를 조작할 수 있다. Kubernetes는 풍부한 기능을 가지고 있는 상당히 세련된 컨테이너 오케스트레이션 툴이다.
텍스트 형식의 정의 파일로 관리할 수 있으므로 프로그래머가 다루기 쉽다.
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: webserver-red
spec:
// 실행시킬 Pod의 수
replicas: 3
template:
...
spec:
containers:
// docker 이미지 지정
image: imagerec:red
name: webserver-container
ports:
// 전송 포트 지정
containerPort: 80
name: http-server
컨테이너에서의 영구 데이터 관리와 클라우드의 데이터 관리 서비스
Kubernetes의 'StatefulSets'를 사용하면 스테이트풀(stateful) 애플리케이션을 지원할 수 있다.
StatefulSets는 Pod마다 고유의 ID와 상태를 가질 수 있으므로, 예를 들어 웹 서버와 DB 서버가 연결되는 애플리케이션 등에서 사용을 검토하면 좋다.
하지만 docker는 스테이트리스(stateless)한 애플리케이션을 효율적으로 실행하는 데 적합한 툴이므로 영구 데이터의 관리에는 적합하지 않다.
영구 데이터를 적절히 관리하려면 백업이나 리스토어 장치, 데이터량의 증대에 따른 스케일 아웃, 정보 누출을 방지하기 위한 보안 대책과 더불어 그러한 것을 수행하기 위한 운용 정비 등 기반으로서 검토해야 할 항목이 있다. 그래서 클라우드에서 제공되는 데이터 관리 서비스를 잘 활용하는 것이 좋다.
GCP의 경우 컨테이너의 실행 환경과 함께 대량의 데이터를 효율적으로 취급하기 위한 서비스도 제공하고 있다. 오브젝트 스토리지 서비스를 제공하는 'Cloud Storage', OSS RDBMS를 매니지드하는 'Cloud SQL', 분산형 RDBMS인 'Cloud Spanner', NoSQL 데이터베이스인 'Cloud Datastore' 등 취급할 데이터의 종류에 따라 다양한 서비스를 제공하고 있으므로 이러한 것의 사용을 검토해야 한다.
'DevOps > Kubernetes' 카테고리의 다른 글
[DevOps/Kubernetes] 시스템 운용의 기초 지식 (0) | 2020.12.11 |
---|---|
[DevOps/Kubernetes] 배치 잡 실행 (CronJob) (0) | 2020.12.11 |
[DevOps/Kubernetes] 쿠버네티스의 서버 구성의 개요 및 kubectl 설치 (0) | 2020.12.11 |