| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- SpringTokenizer
- 파이썬
- python
- 2447
- kakaocloudschool
- 9020
- Spring #Java #Spring Boot #@BeforeEach #@AfterEach
- 백준
- 11054
- Spring #Java #Spring Boot #싱글톤
- node
- 알고리즘
- kakaocloud
- 카카오 클라우드 스쿨
- Spring #Java #Spring Boot
- sequelize
- 7568
- 카카오클라우드스쿨
- Java #백준 #코딩테스트
- 1110
- 24479
- java
- 15552
- boj
- 코딩테스트
- 11053
- Spring #Spring Boot #Java
- Java #오븐시계 #백준
- Java #코딩테스트
- Spring
- Today
- Total
YoungSoo
Kubernetes 아키텍처 본문
쿠버네티스 클러스터의 전체 구조
쿠버네티스 클러스터는 크게 두 종류의 서버인 클러스터를 관리하는 마스터와 실제 컨테이너를 실행시키는 노드로 구분한다.
마스터
마스터노드가 1대라면 etcd, kube-apiserver, kube-scheduler, kube-controller-manager, kubelet, kube-proxy, docker 이 프로세스들을 한 묶음으로 해당 서버에서 실행하는 것이 일반적
보통 고가용성을 만족하고자 3대의 서버를 구성해서 운영하고 평소에 실제로 클러스터 관리는 1대의 리더 마스터이고 나머지 2대는 대기합니다. 클러스터를 조금 더 안정적으로 운영하기 위해서 5대로 구성할 수도 있습니다.
노드
노드에는 kubelet, kube-proxy, docker 등의 컴포넌트가 실행됩니다.
각 컴포넌트에는 kube-apiserver이 있는데 모든 통신의 중심이고 etcd에는 kube-apiserver만 접근할 수 있습니다.
마스터 안에 도커는 kubelet이 관리하고 도커 안에는 쿠버네티스 관리용 컴포넌트 kube-scheduler, kube-controller-manager, kubelet, kube-proxy가 있고 노드 역시 안에 kubelet으로 도커를 관리하는데 마스터의 kube-apiserver와 통신하면서 파드의 생성, 관리, 삭제를 담당하고 마스터와는 다르게 컨테이너가 아닌 서버 프로세스로 실행할 수 있습니다.
쿠버네티스의 주요 컴포넌트
마스터 용 컴포넌트
etcd
고가용성을 제공하는 키-값 저장소입니다.
쿠버네티스에서는 필요한 모든 데이터를 저장하는 데이터베이스 역할을 합니다.
서버 하나당 프로세스 1개만 사용할 수 있고 보통 etcd 자체를 클러스터링 한 후 여러 개 마스터 서버에 분산해서 실행해 데이터의 안정성을 보장하도록 구성합니다.
kube-apiserver
쿠버네티스 클러스터의 API를 사용할 수 있도록 하는 컴포넌트이고 클러스터로 온 요청이 유효한지 검사합니다.
쿠버네티스는 마이크로서비스 아키텍처(MSA)이므로 서로 분리된 컴포넌트 여러 개로 구분됩니다.
kube-apiserver은 수평적으로 확장 가능하게 설계했으므로 서버 여러 대에 여러 개를 실행해서 사용할 수 있습니다.
kube-scheduler
현재 클러스터 안에서 자원 할당이 가능한 노드 중 알맞은 노드를 선택해서 새롭게 만든 파드를 실행합니다. 파드는 처음 실행시 여러 가지 조건을 설정하며 kube-scheduler이 조건에 맞는 노드를 찾습니다.
kube-controller-manager
쿠버네티스는 파드들을 관리하는 컨트롤러입니다.
컨트롤러는 각각은 논리적으로 개별 프로세스지만 복잡도를 줄이려고 모든 컨트롤러를 바이너리 파일 하나로 컴파일해 단일 프로세스로 실행됩니다.
cloud-controller-manager
쿠버네티스의 컨트롤러들을 클라우드 서비스와 연결해 관리하는 컴포넌트입니다.
- 노드 컨트롤러 : 클라우드 서비스 안에서 노드를 관리하는데 사용합니다.
- 라우트 컨트롤러 : 각 클라우드 서비스 안의 네트워크 라우팅을 관리하는데 사용합니다.
- 서비스 컨트롤러 : 각 클라우드 서비스에서 제공하는 로드밸런서를 생성, 갱신, 삭제하는데 사용합니다.
- 볼륨 컨트롤러 : 클라우드 서비스에서 생성한 볼륨을 노드에 연결하거나 마운트하는 등에 사용합니다.
노드용 컴포넌트
kubelet
클러스터 안 모든 노드에서 실행되는 에이전트입니다. 파드 컨테이너들의 실행을 직접 관리합니다.
파드스펙이라는 조건이 담긴 설정을 전달받아서 컨테이너를 실행하고 컨테이너가 정상적으로 헬스 체크를 진행합니다. 단, 노드 안에 있는 컨테이너라도 쿠버네티스가 만들지 않은 컨테이너는 관리하지 않습니다.
kube-proxy
클러스터 안에 별도의 가상 네트워크를 설정하고 관리합니다.
컨테이너 런타임
컨테이너 런타임은 실제로 컨테이너를 실행시킵니다. 가장 많이 알려진 런타임으로는 도커가 있습니다.
오브젝트와 컨트롤러
쿠버네티스는 크게 오브젝트와 오브젝트를 관리하는 컨트롤러로 나눕니다.
사용자는 쿠버네티스에 자원의 바라는 상태를 정의하고 컨트롤러는 바라는 상태롸 현재 상태가 일치하도록 오브젝트들을 생성/삭제합니다.
오브젝트에는 파드, 서비스, 볼륨, 네임스페이스 등이 있습니다.
컨트롤러에는 레플리카세트, 디플러이먼트, 스테이트풀세트, 데몬세트, 잡 등이 있습니다.
네임스페이스
네임스페이스는 쿠버네티스 클러스터 하나를 여러 개 논리적인 단위로 나눠서 사용하는 것입니다. 클러스터 안에서 용도에 따라 실행해야 하는 앱을 구분할 때도 네임스페이스를 사용합니다.
- default : 기본 네임스페이스
- kube-system : 쿠버네티스 시스템에서 관리하는 네임스페이스, 쿠버네티스 관리용 파드나 설정이 있습니다.
- kube-public : 클러스터 안 모든 사용자가 읽을 수 있는 네임스페이스입니다. 보통 클러스터 사용량 같은 정보를 여기서 관리합니다.
- kube-node-lease : 각 노드의 임대 오브젝트들을 관리하는 네임스페이스입니다.
템플릿
쿠버네티스 클러스터의 오브젝트나 컨트롤러가 어떤 상태여야 하는지를 적용할 때는 YAML 형식의 템플릿을 사용합니다.
템플릿의 내용을 표현하는 YAML은 JSON과 비교할 때 간결합니다.
기본형식
- apiVersion : 사용하려는 쿠버네티스 API 버전을 명시합니다.
- kind : 어떤 종류의 오브젝트 혹은 컨트롤러에 작업인지 명시합니다.
- metadata : 메타데이터를 설정합니다. 해당 오브젝트나 레이블 등을 설정합니다.
- spec : 파드가 어떤 컨테이너를 갖고 실행하며, 실행할 때 어떻게 동작해야 할지 명시합니다.
'Cloud > Kubernetes' 카테고리의 다른 글
| Kubernetes 컨트롤러 (0) | 2023.03.19 |
|---|---|
| Kubernetes Pod (0) | 2023.03.18 |
| Kubernetes로 컨테이너 실행하기 (0) | 2023.03.16 |
| Kubernetes Cluster를 직접 구성하는 도구 (0) | 2023.03.15 |
| Kubernetes 란? (0) | 2023.03.14 |