MLOPS/kubernetes
Kubernetes Architecture
개발허재
2022. 1. 6. 18:04
1. Kubernetes
K8s는 컨테이너의 집합(Pod)을 효율적으로 배포•관리하기 위한 오픈소스 Ochestrator이다.
- kubectl : kubectl은 간단하게 명령어를 보내는 역할만 한다. 예) kubectl get pods ( pod들을 확인하는 명령어 )
- Master : K8s의 전체적인 Control
- Worker(Node) : Container가 배포되어 구동되는 Node
- API Server :간단하게 명령어를 전달해주는 역할만 진행한다. 또한 etcd클러스터랑 통신한다. 이 정도만 알고 가자
- Node, Web Console, Cli 명령어 등과 통신
- Etcd : kubernetes 클러스터 데이터(포드 수,상태,네임 스페이스 등), API 객체 및 서비스 검색 세부정보를 저장하는 데 사용되는 분산 키 값 저장소다. K8s의 Configuration 등, Stateful 정보를 저장하기 위한 Key-Value 방식의 분산형 DB
- Scheduler : 스케줄러는 Pod,서비스 등 각 자원을 적절한 노드에 할당하는 역할을 한다
- C-M(Controller Managers) : 컨트롤러 매니저는 복제, 서비스계정, 네임스페이스 등을 생성하고 이를 각 노드에 배포하며 관리하는 역할을 한다. 사용자가 다양한 설정을 정할 수 있는데 이러한 것을 제어하기 위해 도와주는 역할
구동중인 컨테이너가 죽으면 Restart 시키는 등의 관리 - C-C-M(Cloud Controller Managers)
- Container Runtime : 파일 시스템이나 네트워킹과 같은 시스템 리소스를 가상화하는 Namespace와 CPU/Memory등의 리소스를 할당하는 cgroup을 설정하고 명령 실행.
- Kubelet : 노드는 기본적으로 정기적으로 새로운 pod 또는 수정된 pod의 사양으로 포드 및 컨테이너가 원하는 상태로 실행되고 있는지 확인한다. Master로 부터 명령을 받는 Agent로써, 컨테이너의 상태 정보를 Master로 전송.
- Kube-prxoy : 노드로 들어오는 네트워크 트래픽을 적절한 컨테이너로 라우팅하고, 로드밸런싱 등 노드로 나가는 네트워크 트래픽을 프록시하고 노드와 마스터간 통신을 관리한다. 컨테이너가 외부로 통신하기 위한 NAT와 Routing
- kube-dns : Pod의 IP는 ephemeral이므로 재기동 후 주소가 변경될 수 있다. Pod가 배포되면 모든 컨테이너의 Service IP는 '/etc/relosv.conf' 경로에 저장되어 Pod간 통신 시 Service의 Label을 바라본다.
* Etcd에 모든 Config 정보와 Password 등의 보안 정보가 저장되므로 이중화와 필요시 암호화는 것이 좋다.
* Dashboard : GUI로 Cluster Control이 가능하나, 보안에 취약해서 사용에 유의하여야 한다.
1) 구조와 오브젝트
- 클러스터 구조
- 마스터 / 머신 노드가 존재.
- 마스터는 하나, 머신은 여러개
- 쿠버네티스 오브젝트
- 기본적으로 오브젝트와 컨트롤러로 구성
- 오브젝트
- yaml 이나 json 으로 정의된 스펙에 따라 만들어지는 객체
- 예를 들면 다음과 같이 스펙을 정의
- kubectl create -f pod_example.yaml 로 오브젝트 생성
2) 기본 오브젝트 종류
Pod
* Sidecar : HA Proxy / Log Collector / Heartbeat 등의 Sub Agent
- 가장 기본적인 배포 단위
- 컨테이너들을 포함하고 있음
- n개의 Container로 구성된 Building Block으로 Cluster의 최소 단위 * 동일 Pod 내 Container는 Local Disk와 IP를 공유
- Pod는 etcd의 Manifest에 정의 됨 * Manifest : API 객체에 대한 Text 파일
- Pod 내 컨테이너들은 같은 IP 를 가지고, Port 를 공유한다.
- Pod 내 컨테이너들끼리는 Volume 을 공유할 수 있다.
Volume
- 컨테이너의 외부 디스크
- 컨테이너가 재 실행되어도 Volume 을 사용하면 파일 유지
- Volume 은 Pod 에 종속된 디스크다 . 따라서 Pod 내 여러 컨테이너들이 공유해서 사용할 수 있다.
volumes 를 통해 정의할 수 있다 - 임시 디스크 (Pod 단위 공유)
- emptyDir
- Pod 이 생성되고 삭제될 때, 같이 생성되고 삭제되는 임시 디스크
- 생성 당시에는 아무 것도 없는 빈 상태
- 물리 디스크(노드), 메모리에 저장
- emptyDir
- 로컬 디스크 (노드 단위 공유)
- hostPath
- emptyDir 와 같은 컨셉이지만, 공유 범위가 노드라는 점만 다름
- hostPath
- 네트워크 디스크
- gitRepo (지금은 deprecated 라고 한다.)
- 생성시에 지정된 git repo 를 clone 한 후, 디스크 생성
- emptyDir -> git clone 이라보면 됨
- 그 외 클라우드 서비스 별로 더 있음.
- gitRepo (지금은 deprecated 라고 한다.)
Service
- 여러 개의 Pod 들을 서비스할 때, 현재 요청이 어느 Pod 으로 갈지 선택하는 오브젝트
- 부하가 많을 때 이를 분산시키는 로드밸런서 역할
- 동적으로 생성되는 Pod 들의 동적 IP 와 달리 Service 는 지정된 IP 로 생성가능
- 다음과 같은 기능들이 있다.
- 멀티 포트 지원
- 예를 들어 80 -> 8080 으로, 443 -> 8082 로 가도록 한번에 설정할 수 있다.
- 로드 밸런싱
- 부하(트래픽)를 여러 Pod 으로 분산한다.
- Pod 은 기본적으로 랜덤하게 선택된다.
- IP 주소 할당 방식과 연동 서비스에 따른 Type
- Cluster IP
- 디폴트 값
- 서비스에 클러스터 내부 IP 를 할당
- 즉 클러스터 내부 접근 O, 외부 접근 X
- Load Balancer
- 외부 IP 를 가지고 있는 로드밸런서를 할당
- 즉 외부 접근 O
- NodePort
- 클러스터 내 노드의 ip:port 로도 접근가능하게 함
- ex. curl 10.146.0.10:30036
- 10.146.0.10 는 노드의 ip 고, 30036 는 NodePort 로 설정한 포트임
- ExternalName
- 외부 서비스를 쿠네터네스 내부에서 호출하고자 할 때 사용
- 모든 Pod 들은 Cluster IP 를 가지고 있기 때문에, 외부에서도 접근이 가능함.
- 요청 -> (외부 서비스) -> 클러스터 내 쿠버네티스. 일종의 프록시 역할
- Cluster IP
- headless 서비스
- 서비스 디스커버리 솔루션을 제공하는 경우, 서비스의 IP 가 필요 없음
- clusterIP: None 으로 주면 된다.
- External IP
- 서비스에 별도의 외부 IP 를 지정해줄 수 있음
- 멀티 포트 지원
Controller
- 여러 개의 Pod 배포를 적절하게 관리하는 오브젝트
- Pod 들을 생성, 삭제함.
- Replication Controller
- Replication Set
- Deployment
- ReplicationController (RC)
- 지정된 숫자로 Pod 을 기동 시키고 관리한다.
- selector, replicas, template 을 기본적으로 정의해야 한다.
- selector : label 기준으로 어떤 Pod 들을 관리할지 정의한다.
- replicas : 선택된 Pod 들을 몇 개의 인스턴스로 띄울지 정의한다.
- template : Pod 을 추가로 기동할 때, 어떤 Pod 을 만들지 정의한다.
- ReplicaSet
- ReplicationController 는 Equailty 기반 Selector 를 사용하는 반면
- ReplicaSet 는 Set 기반 Selector 를 사용한다.
- Deployment
- ReplicationController 와 ReplicaSet 을 좀더 추상화한 개념
- 실제 배포할 때는 이 컨트롤러를 주로 사용
- DaemonSet
- Pod 이 각각의 노드에서 하나씩만 돌게 한다. (균등하게 배포)
- 모든 노드가 아닌 특정 노드들만 선택할 수도 있다.
- 보통 서버 모니터링이나 로그 수집 용도
- Job
- 한번 실행되고 끝나는 Pod 을 관리한다.
- Job 컨트롤러가 종료되면 Pod 도 같이 종료한다.
- 컨테이너에서 Job 을 수행하기 위한 별도의 command 를 준다.
- Job command 의 성공 여부를 받아 재실행 또는 종료여부를 결정한다.
- Stateful
- DB 와 같이 상태를 가지는 Pod 을 관리한다.
이외의 정보는 아래 URL
https://dailyheumsi.tistory.com/208
그 외 개념
- 네임 스페이스
- 한 클러스터 내에 논리적인 분리 단위
- 예를 들면 namespace:billing 과 namespace:commerce 는 같은 클러스터 내에 있지만 논리적으로 분리됨
- 한 클러스터 자원을 가지고 개발 / 운영 / 테스트 식으로 나눌 수 있음.
아키텍처
쿠버네티스 내부 구조는 크게 마스터와 노드로 분리될 수 있다.
1) 마스터
쿠버네티스 클러스터 전체를 컨트롤하는 시스템이다.
다음과 같이 구성되어 있다.
- API 서버
- 모든 명령과 통신을 REST API 로 제공
- Etcd
- 분산형 키-밸류 스토어로, 쿠버네티스 클러스터 상태나 설정 정보 저장
- 스케쥴러
- Pod, Service 등 각 리소스를 적절한 노드에 할당
- 컨트롤러 매니저
- 컨트롤러들을 생산, 배포 등 관리
- DNS
- 동적으로 생성되는 Pod, Service 등의 IP 를 담는 DNS
2)노드
- Kubelet
- 마스터 API 서버와 통신하는 노드 에이전트
- Kube-proxy
- 노드로 오는 네트워크 트래픽을 적절한 컨테이너로 라우팅
- 네트워크 트래픽 프록시 등 노드-마스터간 네트워크 통신 관리
- Container runtime
- 컨테이너를 실행 (ex. dcoker)
- cAdvisor
- 각 노드 내 모니터링 에이전트
- 노드 내 컨테이너들의 상태, 성능 수집하여 마스터 API서버에 전달
- 마스터에 의해 명령을 받고 실제 서비스하는 컴포넌트다.
다음과 같이 구성되어 있다.