ETC
쿠버네티스(k8s)의 간단한 동작 방식 및 etcd - 쿠버네티스 시리즈(2)
D_Helloper
2023. 7. 4. 18:54
쿠버네티스의 동작 방식
- 사용자는 kubectl을 통해 쿠버네티스 클러스터와 통신
- 클러스터 내의 Master는 쿠버네티스의 설정 환경을 저장하고, 전체 클러스터 관리
- 각 Node들에서는 쿠버네티스 위에서 동작하는 워크로드(pod)들이 실행
- 쿠버네티스는 기본적으로 내가 원하는 상태(Desired State)와 현재 상태(Current State)를 비교
- 만약 상태가 서로 다르다면, 현재 상태를 원하는 상태로 변경하는 기능 수행
- etcd에 api의 내용 저장
- api server에 선언형 api로 요청이 들어올 경우, 바로 동작을 실행하지 않고 etcd에 들어온 내용을 저장
- etcd를 감시하는 controller 동작
- controller는 etcd에 내가 담당하는 resource가 들어왔는지를 감시하다가, 해당 resource가 들어온 경우 스케줄러에게 동작을 요청
- 비즈니스 로직이 controller에 포함
- 스케줄러 동작
- 워커 노드의 kubelet과 통신
- kubelet 동작
- 노드에 pod을 생성
쿠버네티스가 etcd를 사용하는 방법
- 모든 객체(Pot,Deploy)는 매니페스트 파일로 저장
- 해당 매니페스트 파일을 etcd에 저장
- etcd에 저장된 매니페스트의 상태(Desired)와 동일하게 클러스터를 유지하려고 함
- 쿠버네티스는 API Server를 통해서만 etcd에 CRUD를 함(아래 장점을 얻을 수 있음)
- 낙관적 락
- 유효성 검사
- 매니페스트 파일에 접근하려고 할 때, 유요한 매니페스트 파일인지는 API Server가 검사해 줌
- 또한 여러 API Server가 동시에 매니페스트 파일을 업데이트 하려고 할 때, 버전으로 관리되는 낙관적 락을 통해서 Race Condition을 해결하도록 동작할 수 있음
쿠버네티스에서 리소스를 etcd에 저장하는 방법
- 배포된 리소스는 모드 etcd에 저장
- etcd의 /registry 아래에 key/value 형식으로 리소스 저장
- 아래 명령어로 /registry 폴더 아래에 저장된 모든 key/value 데이터들에 대해 key값만 불러올 수 있음
// etcd에 저장된 쿠버네티스 매니페스트의 key값 살펴보기
$ etcdctl get /registry --prefix --keys-only
...
/registry/endpointslices/kube-system/kube-dns-jsrnd
/registry/endpointslices/kube-system/metrics-server-dcmvn
/registry/endpointslices/longhorn-system/csi-attacher-x8vs8
/registry/endpointslices/longhorn-system/csi-provisioner-dj5nl
// key 값으로 조회하기
$ kubectl get --raw /api/v1/namespaces/default/pods/my-pod
// alias 추가해서 손쉽게 접근하기.
alias etcdctl='ETCDCTL_API=3 etcdctl \\
--endpoints=https://192.168.0.200:2379 \\
--cacert=/etc/kubernetes/pki/etcd/ca.crt \\
--cert=/etc/kubernetes/pki/etcd/server.crt \\
--key=/etc/kubernetes/pki/etcd/server.key'
// 출처 : <https://ojt90902.tistory.com/1509>
- etcd에 저장된 값은 프로토버프로 저장되기 때문에 바로 읽을 수 없음
- value의 값을 확인하려면 kubectl의 —raw 옵션을 이용해서 key로 검색하면 됨
etcd 인스턴스가 홀수로 배포되는 이유
- RAFT 알고리즘으로 etcd 클러스터의 컨센서스를 이룸
- etcd는 과반수가 동의하는 리더 선출
- Write는 리더를 통해서만, Read는 리더가 아닌 노드로도 처리 가능
- 리더에게 쓰기 요청이 오면, 리더는 각 구성원에게 합의 요청
- 합의는 ‘N/2+1’의 노드가 응답하는 경우에 이루어 짐
- 합의가 이루어지면 리더는 쓰기 결과 반환
3개, 4개의 노드로 구성된 클러스터가 있을 때, 각 클러스트는 몇 개의 노드까지 실패할 수 있을까?
- 3개 클러스터 : 2개의 노드 합의가 필요함. 즉, 1개까지 실패 가능.
- 4개 클러스터 : 3개의 노드 합의가 필요함. 즉, 1개까지 실패 가능.
- 짝수 클러스터는 내결함성 관점에서는 홀수 클러스터에 비해서 전혀 이점이 없음
- 오히려 1개 더 많은 노드에도 데이터를 복사해야 하기 때문에 네트워크 비용이 짝수 클러스터가 더 많이 나옴
- 그래서 홀수로 배포함