kube-apiserver는 Kubernetes 클러스터의 핵심 구성 요소로, 클러스터에서 모든 API 요청을 처리하고 클러스터 상태를 관리하는 역할을 합니다. 이를 통해 클러스터의 모든 자원(Resource)을 중앙에서 관리할 수 있습니다. 요청이 들어오면 다음의 과정으로 동작합니다:
1. Authenticate User (인증)
kube-apiserver는 클러스터에 들어오는 요청이 적절한 권한을 가진 사용자로부터 온 것인지 확인하는 첫 단계로, 인증(Authentication)을 수행합니다. 인증 방식은 여러 가지가 있으며, 클러스터 설정에 따라 다음과 같은 방법이 사용될 수 있습니다:
- Token-based 인증: JWT와 같은 토큰을 활용한 방식
- Client certificate 인증: X.509 클라이언트 인증서를 사용하는 방식
- OIDC (OpenID Connect) 등 외부 인증 제공자를 이용하는 방식
요청을 보낸 사용자가 올바르게 인증되지 않으면, 요청은 더 이상 진행되지 않습니다.
2. Validate Request (요청 유효성 검증)
인증된 사용자의 요청이 적절한지 검증합니다. 이 단계에서는 주로 두 가지를 확인합니다:
- 권한 검사 (Authorization): 요청한 사용자가 해당 리소스에 대해 허용된 권한이 있는지 검사합니다. RBAC(Role-Based Access Control) 또는 ABAC(Attribute-Based Access Control) 같은 접근 제어 방식을 이용합니다.
- 어드미션 컨트롤러 (Admission Controller): 요청이 클러스터의 정책을 충족하는지 확인합니다. 이를 통해 Pod의 자원 사용량이 클러스터의 정책을 위반하지 않는지, 필요한 네임스페이스나 라벨이 존재하는지를 검토합니다.
3. Retrieve Data (데이터 조회)
요청된 리소스에 대한 정보를 etcd에서 조회합니다. Kubernetes는 클러스터의 상태를 영구적으로 저장하기 위해 etcd라는 분산형 Key-Value 저장소를 사용합니다. kube-apiserver는 클러스터의 최신 상태를 반영하기 위해 etcd로부터 필요한 데이터를 가져옵니다. 예를 들어, 노드, 파드, 서비스 등의 상태 정보를 불러옵니다.
4. Update ETCD (etcd 업데이트)
만약 클러스터의 상태를 변경하는 요청일 경우 (예: Pod 생성, Deployment 업데이트 등), kube-apiserver는 요청을 처리한 후 그 변경 사항을 etcd에 기록합니다. 이렇게 하면 클러스터의 현재 상태가 지속적으로 유지되고, 다른 Kubernetes 구성 요소들이 이 상태를 참조할 수 있습니다.
5. Scheduler (스케줄러)와의 연동
새로운 리소스(예: Pod)가 클러스터에 추가되면, 스케줄러가 해당 리소스를 어떤 노드에 배치할지 결정해야 합니다. kube-apiserver는 이와 같은 스케줄링 요청을 스케줄러에게 전달하고, 스케줄러는 클러스터의 리소스 사용량과 정책에 맞게 최적의 노드를 선택하여 Pod를 할당합니다.
6. Kubelet와의 연동
스케줄러가 Pod를 어느 노드에 배치할지 결정하면, 해당 노드의 kubelet은 이를 받아 실제로 Pod를 실행합니다. kube-apiserver는 kubelet에게 이 정보를 전달하고, kubelet은 노드에서 컨테이너를 관리하고 실행합니다. kubelet은 주기적으로 kube-apiserver에 상태를 보고하여, 클러스터 전체의 상태를 최신으로 유지합니다.
전체 흐름 요약
- kube-apiserver가 사용자 요청을 인증 및 권한 검사를 수행.
- 요청을 받아들인 후, 필요한 경우 etcd에서 데이터를 조회하거나 변경 사항을 etcd에 기록.
- 스케줄러에게 리소스 배치 요청을 전달.
- kubelet에게 Pod 실행 명령을 전달.
- 클러스터의 상태를 지속적으로 관리 및 업데이트.
이 과정을 통해 Kubernetes는 클러스터 내 모든 리소스를 효율적으로 관리하고 조정할 수 있습니다.
'DevOps' 카테고리의 다른 글
Kubernetes - kube-scheduler (0) | 2024.10.19 |
---|---|
Kubernetes - kube-controller-manager (1) | 2024.10.19 |
Kubernets - ETCD (0) | 2024.10.19 |
Terraform Name Prefix 옵션의 사용 (0) | 2024.10.10 |
[TerraForm] 기본적인 각 블록의 개념 (0) | 2024.10.09 |