카테고리 없음
CKA 자격증 준비 자료 정리 1 (Core Concepts)
minminit
2022. 3. 3. 19:49
Cluster Architecture
쿠버네티스의 구조에 대한 내용으로, 구성 요소에 대한 간략한 설명 포함
ETCD
정보를 key-value 형태로 저장하는 데이터베이스 (컨테이너가 어떤 ship에 있는지, 언제 load되었는지 등 각 다른 ship들에 대한 정보를 저장)
ETCD in K8S
- nodes, pods, configs, secrets, accounts, roles, bindings .. 등 cluster에 관한 정보 저장
- kubectl의 모든 정보들은 ETCD 서버에서 오는 것
- 모든 변화(노드 추가, 파드 배포 등) 또한 ETCD 서버에 업데이트
ETCD pod
- kubeadm으로 설치했다면 kube-system에 etcd-master라는 이름으로 배포됨
- 저장된 key들 확인 가능
- $ kubectl exec etcd-master -n kube-system etcdctl get / --prefix -keys-only
ETCD in High Availability Environment
- 여러 master 노드 -> 여러 instance 존재
- 각 ETCD instance가 서로를 알 수 있도록 etcd.service에 올바른 파라미터를 지정해야 함
Kube-API server
클러스터 내 변화를 수행하기 위한 모든 다양한 작업들의 중심 역할
- Authenticate User
- Validate Request
- Retrieve data
- Update ETCD
- Scheduler
- Kubelet
Kube API server work pattern
- kubectl 사용시
- kube-api 서버는 request를 인증/확인 후 etcd cluster에서 데이터를 검색해 반환
- pod 생성시
- api 서버는 pod object 생성 (노드 할당X)
- etcd 서버에 pod가 생성되었음을 업데이트
- scheduler는 api 서버를 모니터링 하고 있으므로, 새로운 pod 인지, 배포 노드 확인
- api 서버는 etcd에 정보 업데이트
- api 서버가 해당 정보를 적합한 노드의 kubectl에 전달
- kubelet이 노드에 pod 생성, container runtime engine에 application image를 배포하도록 지시
- kubelet은 api 서버에 상태 업데이트, api 서버는 data를 etcd에 저장
=> 모든 변화가 이러한 패턴을 따름
- kubeadm으로 설치했다면 kube-system에 kube-apiserver-master
- apiserver 정의 파일 => /etc/kubernetes/manifests/kube-apiserver.yaml
- non-kubeadm 설치시 /etc/systemd/system/kube-apiserver.service.yaml
- ps-aux | grep kube-apiserver
- master node process의 kube-apiserver를 통해 실행중인 process 확인 및 effective option 확인
Kube Controller Manager
- 시스템 내 다양한 구성 요소의 상태를 지속적으로 모니터링하고, 전체 시스템을 원하는 상태로 만들기 위해 작동하는 프로세스
- 여러 Controller가 하나의 프로세스로 패키징되어 실행되는 형태 => Kube Controller Manager
- Node Controller, Namespace-Controller, Replication-Controller ... 등등
Node Controller
- 노드들의 상태를 모니터링, application이 계속 실행될 수 있도록 필요한 조치를 수행
- node-monitor-periods=5s : 노드 컨트롤러가 5초마다 노드의 상태를 체크
- node-monitor-grace-period=40s : 노드가 정상적이지 않은 경우, 40초를 기다린후 unreachble 상태로 표기
- pod-eviction-time=5m0s : 노드가 5분안에 정상화 되지 않을 경우, 해당 노드에 할당된 pod을 삭제하고 다른 정상 노드에 생성할 수 있도록 함
Replication Controller
- replica set의 상태를 모니터링하고, 의도된 수의 pod이 available한지 확인하는 역할
- pod가 하나 삭제되면, 하나 더 생성
Kube Controller Managed pod
- kubeadm으로 설치했다면 kube-system 에 kube-controller-manager-master
- apiserver 정의 파일 => /etc/kubernetes/manifests/kube-controller-manager.yaml
- non-kubeadm 설치시 /etc/systemd/system/kube-controller-manager.service
- ps -aux | grep kube-controller-manag
Kube Scheduler
- pod이 어떤 노드로 갈 것인지 결정하는 역할 (실제로 노드에 pod를 배치하는것 X -> kubelet)
- 노드 선정 방식
- pod가 요구하는 리소스를 보고 필터링
- pod를 배치하고 해당 노드에 더 많은 리소스가 남는 경우를 상위로 rank 지정
Kube Scheduler pod
- kube-scheduler 라는 이름으로 위와 동일
Kubelet
- master의 scheduler의 지시에 따라, 컨테이너를 load/unload하는 역할
- 컨테이너의 상태를 일정 간격에 따라 report
- kubelet은 worker 노드에 pod을 생성하기 위해 container runtime(ex..docker)에 요청을 전달
- kubelet은 pod과 컨테이너의 상태를 지속적으로 모니터링하고 결과를 kube-apiserver에 주기적으로 전송
kubelet 설치
- kubeadm으로 worker 노드를 구성할 경우, kubelet이 자동으로 설치하지 않으므로 별도로 kubelet을 설치해야함
Kube Proxy
- 쿠버네티스 클러스터의 모든 pod은 서로 다른 pod과 통신할 수 있음
- 클러스터 내 pod 네트워크를 담당하는 기능이 배포되어 있음
- pod 네트워크는 모든 pod가 통신할 수 있도록 클러스터의 모든 노드에 생성되는 가상 네트워크ㅡ
- 특정 pod에서 다른 pod에 접근하기 위한 가장 좋은 방법은 service를 이용하는 것
- service도 ip를 할당 받으며, pod이 이 ip로 서비스에 접근하고자하면, traffic이 pod로 foward 됨
- 서비스란 무엇이며, ip는 어떻게 얻는 것인가..
- service는 실제로 존재하는 것이 아님
- 쿠버네티스 메모리 상에 존재하는 가상 컴포넌트 개념
- 서비스 접근은 kube-proxy를 통해 가능
- Kube Proxy
- 쿠버네티스 클러스터 내 모든 노드에서 실행되는 프로세스
- 새로운 서비스를 찾는 역할
- 서비스가 생성되면 어떤 서비스에 대해 어떤 pod로 traffic을 fowrd할 지에 대한 rule 생성
- 네트워크 룰 생성 -> IPTABLES 사용
- 모든 노드에 service의 ip로 들어오는 트래픽에 대해 해당 pod로 보낼 수 있는 규칙을 IPTABLES에 만들어줌
Kube proxy pod
- kubeadm은 모든 노드에 kube-proxy를 배포하며, daemon set으로 배포된다.
- 모든 클러스터의 노드마다 오직 하나의 kube-proxy pod이 실행될 수 있음
- kubectl get daemonset -n kube-system