쿠버 정리 #1
쿠버네티스를 사용하는 이유?
- 컨테이너의 자원을 효율적으로 관리하기 위해서 사용
- 단순히 개수가 많아서 사용한다는 의미가 많이 다름
- 100개면 안쓰고 10000개면 쓸 것인가에 대한 질문
- 우리가 운영체제를 왜 쓰는지에 대한 질문과 일맥상통함
- 클라우드 네이티브를 위한 4가지 요소는 모두 필요하거나 필요하지 않다는 의미보다 각 요소들이 유기적으로 필요에 따라 부분적으로 사용될 수 있다.
쿠버네티스 구조 - 이미지는 공식홈페이지 참조
컨트롤 패널 : api, etcd, scheduler, c-m, c-c-m
Kube-apiserver : API 서버는 클러스터 요청이 왔을때 그 요청이 유효한지 검증하는 역할, 모든 요청은 apiserver를 통해서 전달이 된다.
etcd : 모든 클러스터 상태 및 데이터를 담는 쿠버네티스 저장소, key-value 형태로 데이터 저장한다.
scheduler : 노드가 배정되지 않는 새로 생성된 파드를 감지, 실행할 노드를 선택하는 컴포넌트
c-m : 컨트롤러 매니저로 컨트롤러 프로세스를 실행한다. node의 상태를 끊임 없이 체크하고 원하는 상태를 유지
워커 노드 : kubelet. k-proxy
Kubelet : 클러스터의 각 노드에서 실행되는 에이전트, 파드에서 컨테이너가 확실하게 동작하도록 관리한다.
k-proxy : 각 노드에서 실행되는 네트워크 프록시로 쿠버네티스 서비스 개념의 구현부이다. 내부 네트워크 세션이나 클러스터 바깥에서 파드로 네트워크 통신을 할 수 있도록 한다. - 커널의 iptables
쿠버네티스 동작 원리
- 컨테이너 생성 요청 시 kubectl를 통해 API로 생성 요청을 전달
- scheduler를 통해 Worker Node 내 컨테이너 상태를 확인하고 API가 생성 요청을 kubelet에 전달하여 scheduler를 통해 확인한 컨테이너 상태를 기반으로 최적 리소스를 통해 컨테이너를 생성
- 생성이 완료되면 etcd에 변경된 상태를 전달하여 etcd를 최신 상태로 업데이트
- 이후 노드들에 상태는 Controller manager를 통해 지속적으로 모니터링하며 체크
쿠버네티스 오브젝트 - 쿠버네티스 시스템에서 영속성을 가지는 오브젝트
Pod
- 쿠버네티스의 가장 작은 배포 단위
- 하나의 Pod에는 하나의 컨테이너가 존재할 수 있다.
- 전체 클러스터에서 고유한 IP를 할당
- 해당 IP는 수시로 생성, 삭제되는 컨테이너 특성상 고정하지 않으므로 고정이 필요할 경우 별도 설정이 필요하다.
ReplicaSet
- 여러 개의 Pod를 관리
- replicas=3 이면 Pod의 개수를 3개로 유지하며 Pod가 3개가 되도록 지속적으로 관리한다.
- 추가, 생성 시 3개 초과 시 삭제하고 3개 미만 시 생성을 진행
Deployment
- 배포 버전을 관리 (Pod와 ReplicaSet에 대한 선언과 업데이트를 관리해주는 모)
- 내부적으로 ReplicaSet을 통한 버전 업데이트 관리
- yaml 파일에서 특정 Pod에 대한 버전을 수정하고 업데이트 명령을 요청한다.
- 기존 ReplicaSet은 3개로 지정되어 있고 Pod가 삭제되지 않은 상태이기 때문에 etcd에서는 해당 변경된 정보만 가지고 있음
- 이후 Pod가 삭제되면 생성 시 변경된 사항(버전 수정)을 참고하여 새로 생성되는 Pod의 버전이 업데이트되어 생성됨
- 기존 2개는 v1이면 새로 생성된 버전은 v2
- 이런 식으로 순차적으로 Pod의 버전을 업데이트하면서 서비스 무중단 배포가 가능하다.
워크로드
쿠버네티스에서 구동되는 애플리케이션, 일련의 파드 집합 내에서 실행한다. -> 어떤 애플리케이션을 실행 할 때 필요한 IT 리소스의 집합
각 WorkLoad의 역할에 따라 다양한 오브젝트가 존재한다. -> 배포를 관리하는 오브젝트, 상태를 관리하는 오브젝트, 지속적인 실행을 관리하는 오브젝트 등
- Deployment : Deployment의 모든 Pod가 "필요 시 교체" 혹은 "상호 교체" 가능한 경우, 클러스터의 스테이트리스 어플리케이션 워크로드를 관리하기에 적합하다.
- StatefulSet : state를 추적하는 하나 이상의 Pod를 반드시 동작하게 해준다.
- DaemonSet : 노드-로컬 기능을 제공하는 Pods를 정의한다.
- Job 및 CronJob : 실행 완료 후 중단되는 작업을 정의한다.
ClusterIP
- 노드 내부에 존재하는 IP
- 해당 IP는 내부에서만 접근 가능하고 외부(다른 노드 등)에서는 접근이 불가능하다.
NodePort
- 노드에 노출되어 외부에서 접근 가능한 서비스
- 포트 포워딩과 동일한 방식
LoadBalancer
- 특정 노드가 문제가 발생하면 외부에서 접근이 불가능하기 때문에 LoadBalancer를 통해 통신 가능한 NodePort를 매핑해준다.
Ingress
- 클러스터 내부의 서비스에 대한 외부 접근을 관리하는 기능
- 클러스터 외부에서 들어오는 HTTP와 HTTPS 요청을 특정 서비스로 라우팅하는 역할을 함
- 이를 통해 클러스터 내부의 서비스를 외부로 노출하거나, 로드 밸런싱, SSL 종료 등을 수행