• Master node 구성요소
○ etcd
§ etcd 의 어원
□ 유닉스의 /etc 폴더 + distributed 를 합친 것.
□ /etc 폴더는 단일 시스템의 구성 데이터를 저장하는 폴더였으며, 그것을 분산한다 하여 분산시스템 이라는 개념 완성
§ 대충 CAP 라는것을 먼저 알아야한다.
□ 이 세 가지는 분산 시스템에서 나오는 개념이며, 특정 상황에서 셋 중 두 가지만 보장할 수 있다는 개념.
□ Consistency (일관성)
® 모든 노드가 동일한 데이터를 받는 것을 보장한다. - 사용자가 시스템의 어떤 노드에 쿼리를 실행해도 가장 최근의 데이터를 받는다.
® 데이터의 변경이 이루어지면 모든 노드에 즉.시. 반영이 이루어져야 한다.
□ Availbility (가용성)
® 모든 요청에 대해 성공 또는, 실패의 응답을 보장한다. - 시스템에 문제가 생기더라도 요청에 대한 응답을 반드시 반환한다.
® 가용성이 보장되면 일관성이 희생될 수 있다.
□ Partition Tolerance (분할 허용성)
® 네트워크 분할이 발생했을 때, 시스템이 계속 작동하고 응답할 수 있는 능력
® 네트워크의 장애가 발생해도 시스템이 계속 동작하고 사용 가능한 상태를 유지할 수 있어야 하는 능력
□ 그런데, 분산 시스템에서 네트워크는 신뢰할 수 없다는 것을 가정한다. - 실제로 네트워크가 언제나 완벽하게 돌아간다는건 상상에 가깝잖아?
□ 따라서 P 는 꼭 챙겨간다고 할 때, 나머지 둘 중 하나를 가져가서 CP, AP 이렇게 나눌 수 있다는게 CAP 이론.
® CA - RDBMS
® CP - MongoDB, HBase, Redis
® AP - CouchDB, Cassandra, DynamoDB, Riak
§ PACELC
□ CAP 은 네트워크를 못믿는다 라는 가정하에 P를 항상 들고갔으나, 그것의 반대 케이스도 넣어서 이론을 보완한 PACELC 라는 이론이 등장한다.
□ Partition 을 챙기면 P, 안챙기면 E (Else)
® P를 챙겼다. (P)
◊ A 를 챙긴다 => AP
◊ C 를 챙긴다 => CP
® P를 안챙겼다. (E)
◊ Latency L을 챙긴다 => EL
◊ C 를 챙긴다 => EC
□ 그 중 etcd 는 CP/EC 에 속하여, 가용성을 크게 챙기는 데이터베이스라고 볼 수 있다.
§ Raft 알고리즘...
§ 아무튼 그래서 key-value 로 된 저장소임.
○ kube-apiserver
§ 쿠버네티스 클러스터의 API 를 사용할 수 있게 해주는 프로세스이다.
§ 클러스터로 요청이 들어왔을 때, 그 요청이 유효한지 판단함
§ 쿠버네티스로 들어오는 모든 요청은 apiserver을 먼저 거치고, 다른곳으로 전달된다.
§ 대충 api를 통해 할 수 있는 것
□ 어떤 기능을 admin 할지, deny 할 지 정하기
□ apiserver 에 접근하기 위한 ip주소 나열
□ 컨테이너를 privliged 모드로 실행하기
□ 클러스터 내 실행되는 apiserver 갯수 출력
□ CORS를 허용하는 목록 나열
□ TLS 인증서들이 있는 경로 출력
□ 토큰인증에 대한 설정을 갖고있는 파일 출력
□ 등...
○ kube-scheduler
§ 새로운 pod가 생성될 때, 현재 클러스터 내에서 자원할당이 가능한 노드들 중 알맞은 노드를 선택하는 작업을 함
§ pod가 처음 실행될 때, 여러가지 조건을 지정해서 실행하는데, 이 스케쥴러가 그 조건에 맞는 노드를 찾아준다.
□ 이 때 조건에 맞는 노드를 feasible node (피지블 노드) 라고 부른다고 함
§ 특별한 스케쥴링을 원한다면 커스텀 스케쥴러를 만들 수도 있다.
§ 조건에 맞는 노드를 찾기위해 하는 일:
□ 리소스 요구사항 확인 (Filtering 과정)
® CPU, 메모리, 스토리지와 같은 리소스 요구사항을 충족하는 노드를 선택
® 이 과정이 Filtering 과정.
® 이 때, request / limit resource 에 대한 개념이 나옴.
□ 필터링 된 노드 중 pod 가 실행될 최적의 노드를 찾는 (Scoring 과정)
® NodeSelector
◊ Node 에 Label 을 부여하고, Pod 에서 nodeSelector로 Node를 지정할 수 있다.
® Node affinity
◊ 설정 시, affinity 값에
◊ requiredDuringSchedulingIgnoredCuringExecution 하면 스케줄링 간에 만족하는 노드가 없으면 스케줄링 안해버림
◊ preferredDuringSchedulingIgnoredDuringExecution 하면 만족하는 노드가 없어도 어딘가 뜸
® Anti affinity
◊ pod 설정에 replica 2개로 해놓고 anti-affinity를 설정하면 두 pod가 서로 다른 node 에 뜬다고 함
® Taint / Toleration
◊ 노드 안에 taint effect 설정해놓으면, 그 노드엔 pod 가 안뜬다.
} 정확히는 NoSchedule => 안뜨게
} NoExecute => 뜨지만 eviction (제거/종료)
} PreferNoSchedule => 되도록이면 안뜨게
◊ 그런데 pod 의 설정에 toleration 설정해놓으면 taint effect 해놓은 노드에도 pod 가 뜬다.
□ 네트워크 토폴로지 ?
® 네트워크 토폴로지를 고려해서 컨테이터를 배치하고, 대역폭 및 지연시간을 최적화 한다고 함
® 동일한 서브넷에 속한 노드에 컨테이너를 배치하여 네트워크 트래픽을 최소화하기
□ 안정성 및 가용성 고려
® 그리하여 장애 발생 시 서비스의 영향을 최소화
® 예를들어, 동일한 물리적 위치에 있는 노드들에 컨테이너를 분산하여 단일 장애 지점을 피한다
○ kube-controller-manager
§ kube 안에는 controller 가 참 많다.
□ node-controller : node 를 모니터링(health check)하는 애
□ replication controller : kube-apiserver 에서 노드의 상태를 받아오고 언제나 후보선수로 나갈 수 있는 노드를 준비시키는 역할을 함
□ 이를 포함하여 여러가지 많다.
® Deployment-controller
® Namespace-controller
® Endpoint-controller
® CronJob
® Service-Account-Controller
® Node-controller
® Job-Controller
® Stateful-Set
® PV-Binder-Controller
® PV-Protection-Controller
® ReplicaSet
® Replication-Controller
□ 이것들을 관리하는게 kube-controller-manager 이다.
□ kubectl 을 통해서 controller manager option 등을 알 수 있다.
□ 각 컨트롤러들은 논리적으로 개별 프로세스이지만, 복잡도를 줄이기 위해 하나의 바이너리 파일로 컴파일 되어있고, 하나의 단일 프로세스로 실행됩니다.
□ 클러스터 내에서 새로운 컨트롤러가 사용될 때는, 그 컨트롤러에 해당하는 구조체가 만들어진 뒤 그것을 kube-controller-manager 의 queue에 넣어서 실행하는 방식이다.
○ cloud-controller-manager
§ 클라우드 서비스를 제공하는 곳들에서 쿠버네티스의 컨트롤러들을 자신의 서비스와 연계하기 위해 있는 것
§ 관련된 코드는 각 클라우드 서비스 제공사에서 직접 관리하도록 되어있다고함
□ node controller
® 클라우드 서비스에서 노드를 관리
□ route controller
® 클라우드 인프라 내에서 네트워크 라우팅을 관리
□ service controller
® 클라우스 서비스에서 제공하는 로드밸런서를 생성/갱신/삭제
□ volume controller
® 클라우드 서비스에서 볼륨을 생성해서 노드에 붙이고 마운트해서 볼륨을 관리
https://arisu1000.tistory.com/27828 쿠버네티스 구성요소
https://smileostrich.tistory.com/entry/etcd Inside Etcd
'TIL' 카테고리의 다른 글
Kubelet, Kubectl, Ingress 가뭐냐 (0) | 2024.02.14 |
---|---|
2024.01.31 쿠버네티스 공부 (2) | 2024.01.31 |
Web Application Firewall(WAF) (0) | 2023.11.16 |
SVN vs Git (1) | 2022.12.11 |
JPA fetchType (EAGER, LAZY) (0) | 2022.12.06 |