Kubernetes(K8s) 의 구조
- 크게 Kubernetes Cluster가 있음
- 그 안에 Master와 여러개의 node가 있음
- DevOps (개발자)는 mater를 통해 개발하고 배포
- User(사용자)는 외부에서 Service, Ingress Object를 통해 사용
- kubectl 은 서비스 호출 클라이언트
- master에 API 서버와 상태 저장소를 관리
- node에 각 서버의 에이전트(kubelet)와 통신하는 구조
Master
- Master는 API Server, Scheduler, Controller Manager, etcd로 구성됨
- API Server
- 대부분의 요청을 처리하는 담당, 중요한 역할 임으로 다중화를 함
- 모든 컴포넌트들은 API 서버를 통해서 커뮤니케이션을 함
- 인증 및 인가 기능도 보유함
- Scheduler
- 컨테이너를 어떤 노드에서 가동할지 결정하는 컴포넌트
- 노드들의 정보를 파악하고 컨테이너를 가동할 노드 선택
- Controller Manager
- K8s 클러스터의 상태 모니터링
- Desired state를 유지함
- 실제 요청 된 state와 현재 시스템의 state에 차이가 있는지 감시 -> 다를 경우 같은 state가 되도록 조치
- etcd
- 분산 key-value 저장소임
- 클러스터의 모든 설정, 상태 데이터를 저장함
- Scheduler와 Controller Manager 등이 API 서버를 통해 etcd의 데이터 조회 및 갱신
- 마스터에서 분리하여 독자적으로 구축이 가능
Node
- Node는 kube proxy, kubelet, 다수의 pod로 구성됨
- Kubelet
- Master로 부터 생성 요청을 받으면 컨테이너 생성
- 컨테이너의 상태를 모니터링
- 컨테이너의 상태를 Master의 API 서버로 전송
- kube proxy
- 각 노드에서 실행되는 네트워크 프록시임
- 노드의 네트워크 규칙을 유지 관리함
- 내부 네트워크 세션이나 클러스터 바깥에서 컨테이너로 네트워크 통신을 할 수 있도록
- pod
- 1개의 독립적인 컨테이너임
- Kubelet이 생성 시킴
K8s Objects
- 대규모 분산 환경에 필요한 요소들이 추상화 되어 있음
- 컨테이너, 애플리케이션 수행 방식, 네트워크 등을 추상화 함
- 추상화 한 것들을 Object라 함
K8s 는 기능 별로 아래와 같은 Object로 구성됨
- Application 및 배포
- Pod, ReplicaSet, Deployment, DaemonSet, StatefulSet...
- 네트워크
- Service, Ingress..
- 설정 정보 관리
- ConfigMap, Secrests
- 배치 잡 관리
- Job, CronJob
Pod
- K8s에서 배포할 수 있는 가장 작은 단위
- 한 개 이상의 컨테이너와 스토리지, 네트워크 속성을 가짐
- Pod에 속한 컨테이너는 스토리지와 네트워크를 공유하고 서로 localhost로 접근 할 수 있음
- 컨테이너를 하나만 사용하는 경우도 반드시 Pod로 관리해야함
ReplicaSet
- Pod를 여러 개 복제하여 관리
- Pod를 생성하고 개수를 유지하려면 ReplicaSet을 사용함
- ReplicaSet는 아래의 설정 정보를 포함
- 생성할 Pod를 복제할 개수
- 생성할 Pod의 설정 정보
Deployment
- K8s에서 실제 배포를 진행하는 기본 단위
- 배포 전략 선택
- Rolling Update
- Recreate
- 배포 Revision 관리 및 Roll Back 수행
- 배포와 관련 된 다양한 기능 및 옵션 제공
DaemonSet
- 클러스터 전체에 Pod를 띄울 때 사용하는 Controller
- 항상 모든 Node에 특정 Pod가 실행 됨
- 새로운 Node가 추가되면 자동으로 Pod 실행됨
- 로그 수집기나 모니터링 에이전트 등 실행하는 용도
StatefulSet
- K8s의 대부분의 Objet는 Stateless임
- StatefulSet은 state를 유지하는 Pod를 위한 Object임
- Volume을 사용해서 데이터를 저장하고 Pod 재기동 시에도 유지 가능
- DB 등을 컨테이너화 할 때 사용 가능
Service
- 네트워크와 관련된 Object임
- Pod 간 연결 및 Pod와 외부 네트워크를 연결
- 여러 개의 Pod에 대한 내부 로드밸런서
- 내부 DNS에 서비스 등록하여 서비스 디스커버리 역할도 수행
- Pod에 대한 L4 로드밸런싱 수행
- 옵션 지정 가능
- Cluster IP : 클러스터 내부에서만 통신 목적
- Node Port : 외부로 IP Address를 노출
- Load Balancer : 클라우드 서비스의 Load Balancer 기능 사용
Ingress
- 외부 트래픽을 받는 Object임
- http / https 등 L7 레벨로 라우팅 규칙, 로드밸런싱 규칙 등도 포함함
- Service도 외부로 노출 가능하지만 L4 레벨만 가능
- 일반적으로 K8s 클러스터를 외부로 노출 할 때에는 Ingress 사용
ConfigMap, Sercret
- 설정 정보를 Key/Value 형태로 저장하고 Pod에서 참조
Job, CronKob
- 배치 처리를 위해 특정 조건에 따라 작업이 수행 됨을 보장
- 실패하면 자동 재 시작 하여 처리
Label과 Selector
- K8s 내부 자원 관리를 위해 Label을 붙임
- Selector를 이용해서 특정 Label이 붙여진 자원을 Filtering
Manifest 파일
- K8s에서 선언적 설정을 위해 Manifest 파일을 사용함
- YAML, Json 과 같은 파일로 작성 함
- 리소스의 종류와 원하는 상태를 입력함
- 식당 주문서와 유사함
- Master 로 명세 파일을 제출하면 Master 에서 읽고 명세된 정보가 유지되도록 실행
- 구성 요소
- apiVersion : K8s API 버전 정보
- kind : Object의 종류
- metadata.name : Object의 이름
- spec : Object의 상세 정보
'Program > Software Architect' 카테고리의 다른 글
[마이크로서비스 6] 컨테이너 오케스트레이션 (0) | 2024.08.24 |
---|---|
[마이크로서비스 5] 도커 컨테이너 (0) | 2024.08.22 |
[마이크로서비스 4] 마이크로 서비스 성숙도 평가 모델 (0) | 2024.08.18 |
[마이크로서비스 3] 마이크로 서비스 capabailties 모델 (0) | 2024.08.15 |
[마이크로서비스 2] 마이크로 서비스 장/단점 (0) | 2024.08.12 |