Kubernetes-Components
1 Kubernetes Components
Cluster
- 노드의 집합으로 Master Node와 Worker Node로 구성되어 있다
Master Node
- 다른 노드를 관리한다.
- Control Plane Components가 실행되는 곳
Worker Node
- 컨테이너화된 애플리케이션을 실행한다.
2 Control Plane Components
전체 쿠버네티스 시스템을 관리하고 통제하는 쿠버네티스 컨트롤 플레인을 관장
- Control Plane Components에는 API Server, Scheduler, Controller Manager, etcd가 있다.
- Control Plane Components는 클러스터를 관리하는 기능을 제공한다
- Control Plane Components는 단일 마스터 노드에서 실행되거나 여러 노드로 분할되고 복제돼 고가용성이 보장된다
- 마스터 노드에서는 클러스터의 상태를 유지하고 제어하지만 애플리케이션을 직접 실행하는 것은 아니다.
2.1 API Server
- API Server는 Control Plane Component이다.
- API Server는 control plane의 프론트엔드라고 할 수 있다.
- Worker Node의 kubelet과 커뮤니케이션 한다.
- 오직 API Server만이 etcd와 직접적인 커뮤니케이션이 가능하다.
- kubectl 요청이 API Server에 전달된다
- 쿠버네티스 시스템 구성 요소는 오직 API 서버하고만 통신한다.
- 서로 직접 통신하지 않는다.
- 다른 구성 요소는 etcd와 직접 통신하지 않고 API 서버를 통해 클러스터 상태를 변경한다.
2.1.1 API Server의 기능
- API Server는 쿠버네티스의 모든 구성 요소와 kubectl 같은 클라이언트에서 사용하는 중심 구성 요 소다.
- API Server는 클러스터 상태를 조회하고 변경하기 위해RESTful API로 CRUD 인터페이스를 제공한다.
- 상태는 etcd 안에 저장한다.
- 오브젝트를 etcd에 저장하는 일관된 방법은 제공하는 것 외에 오브젝트 유효성 검사를 하기 때문에 잘못 설정된 오브젝트를 저장할 수 없다.
kubectl
- 예를 들어 JSON 파일에서 리소스를 생성할 때 kubectl은 파일 내용을 API Server에 HTTP POST 요청으로 전달한다.
2.1.2 요청 처리 과정
-
인증 플러그인으로 클라이언트 인증
-
요청을 보낸 클라이언트를 인증하며 하나 이상으로 구성된 인증 플러그인에 의해 수행된다.
-
HTTP 요청을 검사해 수행하는데 인증 방법에 따라 클라이언트 인증서 HTTP 헤더에서 사용자를 가져온다.
-
인증 플러그인은 다음 방법을 사용해 클라이언트의 아이덴티티를 얻는다.
- 클라이언트의 인증서
- HTTP 헤더로 전달된 인증 토큰
- 기본 HTTP 인증
- HTTP 헤더로 전달된 인증 토큰과 기본 HTTP 인증 추천하지 않는 방식
- 1.19 버전부터 Deprecated 됨
- 스태틱한 페스워드 파일 또는 토큰 파일을 kube-api 서버 설정에 지정하면 된다.
비밀번호,유저이름,유저ID
엔트리를 갖는user-details.csv
파일을 만들어 kube-apiserver 설정에--basic-auth-file=user-details.csv
를 등록한다.
-
인증 플러그인은 인증된 사용자의 이름과 그룹을 반환하며 이를 인가 플러그인이 사용한다.
-
-
인가 플러그인으로 클라이언트 인가
- 하나 이상의 인가 플러그인에 의해 인가가 수행된다.
- 인증된 사용자가 요청한 작업이 요청한 리소스 대상으로 수행할 수 있는지를 판별
- 예를 들어 사용자가 요청한 네임스페이스에 파드를 생성할 수 있는지 권한을 판별한다.
-
어드미션 컨트롤 플러그인으로 요청된 리소스 확인과 수정
-
리소스를 생성, 수정, 삭제하려는 요청인 경우 어드미션 컨트롤로 보내진다.
-
데이터를 읽는 요청의 경우 어드미션 컨트롤을 거치지 않는다.
-
어드미션 컨트롤 플러그인은 리소스 정의에서 누락된 필드를 기본값으로 초기화하거나 재정의하는 역할을 한다.
-
-
리소스 유효성 확인 및 영구 저장
- 오브젝트의 유효성을 검증하고 etcd에 저장한다.
-
클라이언트에 응답 반환
2.1.3 API Server가 리소스 변경을 클라이언트에 통보하는 방법
- API Server는 앞서 알아본 요청 처리 과정 외에 다른 것을 아무것도 하지 않는다.
- 예를 들어 레플리카셋을 만들 때 파드를 만들거나 서비스의 엔드포인트를 관리하지 않는다.
- 이것은 컨트롤러 매니 저의 역할이다
- 또한 API Server가 이러한 컨트롤러에 무엇을 해야하는지 알려주지 않는다.
- 단지 컨트롤러와 다른 구성 요소가 배포된 리소스의 변경 사항을 관찰할 수 있도록 하면 된다.
- 컨트롤 플레인 요소는 리소스가 생성, 수정, 삭제될 때 통보를 받을 수 있도록 API Server에 요청할 수 있다.
- 이렇게 해서 구성 요소가 클러스터 메타데이터 변경에 대응에 각자의 작업을 수행할 수 있다.
통보 받는 방법
- 클라이언트는 API Server에 HTTP 연결을 맺고 변경 사항을 감지한다.
- 이 연결을 통해 클라이언트는 대상 오브젝트의 변경을 알 수 있는 스트림을 받는다.
- 대상 오브젝트가 변경되면 API Server는 연결된 모든 클라이언트에게 새로운 버전의 오브젝트를 보낸다.
kubectl
- kubectl은 리소스 변경을 감시할 수 있는 API Server의 클라이언트 중 하나다.
kubectl get pods --watch
명령어로 파드의 생성, 수정, 삭제 통보를 받을 수 있다.
2.2 Scheduler
-
현재 노드의 상태를 점검하고 pod를 배치할 최상의 노드를 결정하는 역할을 한다
-
API Server가 etcd의 노드 정보를 가지고 Scheduler에게 파드를 어디에 배치할지 요청한다.
-
스케줄러는 API 서버로 파드 정의를 갱신하고 API 서버는 감시 메커니즘을 통해 kubelet에 파드가 스케줄링 된 것을 통보한다.
-
대상 노드의 kubelet은 파드가 해당 노드에 스케줄링 된 것을 확인하고 파드의 컨테이너를 생성하고 실행한다.
Schedule 과정
- Schedule 과정은 아래와 같이 크게 두 부분으로나눌 수 있다.
- 모든 노드 중에서 파드를 스케줄링할 수 있는 노드 목록을 필터링 한다.
- 수용 가능한 노드의 우선순위를 정하고 점수가 가장 높은 노드를 선택한다.
- 가장 높은 점수를 가진 노드가 여려개라면 라운드 로빈을 사용한다.
2.2.1 수용 가능한 노드 찾기
- 파드를 수용할 수 있는 노드를 찾기 위해 스케줄러는 미리 설정된 조건 함수 목록에 각 노드를 전달한다.
- 조건 함수는 다음과 같은 다양한 조건을 확인한다.
- 노드가 하드웨어 리소스에 대한 파드 요청을 충족시킬 수 있는가?
- 노드에 리소스가 부족한가?
- 파드가 특정 노드로 스케줄링하도록 요청한 경우에 해당 노드인가?
- 노드가 파드 정의에 노드 셀렉터와 일치하는 레이블을 가지고 있는가?
- 파드가 노드의 테인트를 허용하는가?
- 파드가 노드와 파드의 어피니티, 안티 어피니티 규칙을 지정했는가? 지정했다면 이 노드에 파드를 스케줄링하면 이러한 규칙을 어기게 되는가?