Architecture
K8s 1) 쿠버네티스 기본
나리사리
2024. 5. 17. 11:20
Kubernetes
※ Docker 등 Container에 대한 기본 설명은 제외하였습니다.
K8s의 구조
- Master에 API 서버와 상태 저장소를 두고, 각 Node(서버)의 에이전트(Kublet)와 통신하는 구조
K8s의 구조 : Master
- K8s 클러스터 관리하는 역할
- 노드의 상황을 파악
- 컨테이너를 어떤 노드에서 가동할지 선택
- etcd 분산 저장소를 사용하여 클러스터의 정보를 저장
Master
API Server
- API 서버는 모든 요청을 처리하는 마스터의 핵심
- 모든 컴포넌트들은 API 서버를 통해서 커뮤니케이션함
- 인증 및 인가 기능 보유
Scheduler
- 컨테이너를 어떤 노드에서 가동할지 결정하는 컴포넌트
- 노드들의 정보를 파악하고 컨테이너를 가동할 적합한 노드 선택
Controller Manager
- K8s 클러스터의 상태를 감시
- 시스템의 상태 감시 및 유지
- 요청된 상태와 현재 시스템의 상태의 차이 감시
etcd
- 분산 key-value 저장소
- 클러스터의 모든 설정, 상태 데이터 저장
- 스케줄러와 컨트롤러 매니저 등이 API 서버를 통해 etcd의 데이터 조회 및 갱신
- 마스터에서 분리하여 독자적으로 분리 가능
K8s의 구조 : Node
- 컨테이너가 가동되는 서버
- 다수의 노드로 클러스터를 구성
- 클라우드의 경우 가상머신이 노드가 됨 ex.) ec2...
Node
Kubelet
- 실제로 컨테이너를 생성하는 주체
- 마스터로부터 생성 요청을 받으면 컨테이너를 생성
- 컨테이너의 상태를 감시하는 역할 수행
- 컨테이너의 상태를 API 서버로 전송
Kube proxy
- 각 노드에서 실행되는 네트워크 프록시
- 노드의 네트워크 규칙을 유지 및 관리
- 내부 네트워크 세션, 클러스터 외부에서 내부로 네트워크 통신
Pod
- 한 개 또는 여러 개의 컨테이너의 묶음
K8s Object
- Container, Network 등 분산에 필요한 필요 요소의 추상화
Object
Replica Set
- Pod를 한 개 이상 복제하여 관리
- Pod를 생성하고 개수 유지를 위해서 ReplicaSet을 사용해야 함
Daemon Set
- 클러스터 전체에 Pod를 띄울 때 사용하는 Controller
- 항상 모든 Node에 특정 Pod가 실행됨
- 새로운 Node가 추가되면 자동으로 Pod 실행됨
- 로그 수집기, 모니터링 에이전트 등 실행하는 용도
Stateful Set
- K8s 대부분의 Object는 Stateless
- StatefulSet은 상태를 유지하는 Pod를 위한 Object
- Volume을 사용해서 데이터 저장, Pod 재기동 시에도 유지 가능
- DB 등을 컨테이너화 할 때 사용 가능
Pod
- K8s에서 배포할 수 있는 가장 작은 단위
- 한 개 이상의 컨테이너와 스토리지, 네트워크 속성을 가짐
- Pod에 속한 컨테이너는 스토리지와 네트워크를 공유하고 서로 localhost로 접근 가능
Service
- 네트워크와 관련된 Object
- Pod 간 연결 및 Pod와 외부 네트워크를 연결
- 여러 개의 Pod에 대한 내부 로드밸런서
- 내부 DNS에 서비스 등록하여 서비스 디스커버리 역할도 함
- Pod에 대한 L4 로드밸런싱 수행
- Cluster IP, Node Port, Load Balancer 등 옵션 지정 가능
Deployment
- K8s에서 실제 배포를 진행하는 기본 단위
- 배포 Revision 관리 및 Roll Back 등 다양한 옵션 제공
Ingress
- 외부 트래픽을 받는 Object
- Http/ Https 등 L7 레벨로 라우팅 규칙, 로드벨런싱 규칙 등도 포함
- Service도 외부로 노출 가능하지만 L4 레벨만 가능
Others
- ConfifMap, Secret : 설정정보 저장 등 Pod 참조
- Job, CronJab : 배치 관리
- Label, Selector : 자원 관리 위해 Labeling
K8s Manifest File
- 선언적 설정을 위한 YAML/JSON 형태의 파일
Manifest File
YAML or JSON
YAML
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.20.1
ports:
- containerPort: 80
Json
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "nginx"
},
"spec": {
"containers": [
{
"name": "nginx",
"image": "nginx:1.20.1",
"ports": [
{
"containerPort": "80"
}
]
}
]
}
}
apiVersion
- K8s API 버전 정보 기술
kind
- Object의 종류 기술 (Pod, Service...)
metadata.name
- Object 이름을 기술
spec
- Object 상세 정보 기술
- 포트 등 환경 정보 기술
K8s 사용
K8s 사용
유/무료 설치형 배포판
- Red Hat OpenShift
- Pivotal PKS
- Rancher
- Kubeadm
Cloud Managed Kubernetes
- EKS
- GKE
- AKS
- NCloud K8s Service