kubernetes에서 pod 생성을 요청하였을때 내부에서 어떤 일들이 벌어지는가?
from: Core Kubernetes: Jazz Improv over Orchestration
1. kubectl은 API Server에 Pod생성을 요청
2. APIServer는 etcd에 Node에 할당되지 않은 Pod이 있음을 업데이트
3. Scheduler는 etcd의 변경사항을 API Server를 통해 watch하고 Pod을 실행할 Node를 선택해 API Server에 해당 Node에 Pod을 배정하도록 업데이트
4. 해당 Node의 Kubelet은 생성할 Pod정보를 watch해서 Docker 컨테이너를 실행하고 결과를 API Server에 지속적으로 업데이트
5. API Server는 전달받은 Pod의 상태를 etcd에 업데이트
Kubernetes에서 Pod 생성 요청이 발생하면, 내부에서는 여러 단계를 거쳐 Pod가 배포되고 실행됩니다. 주요 단계는 다음과 같습니다:
요청 처리: 사용자는 kubectl
명령어를 사용하거나, Kubernetes API를 통해 Pod 생성 요청을 보냅니다. 요청이 수신되면, 유효성 검사가 이루어집니다.
API 서버: 유효성 검사 후, API 서버는 요청을 처리하고 etcd에 저장합니다. etcd는 분산 데이터 저장소로, Kubernetes 클러스터의 모든 데이터와 상태 정보를 저장합니다.
컨트롤러 관리자(Control Manager): etcd에서 변경 사항을 감지한 컨트롤러 관리자는 새로운 Pod를 생성하고 관리하기 위한 적절한 동작을 수행합니다.
스케줄러: 새로운 Pod가 생성되면, 아직 노드에 할당되지 않은 상태입니다. Kubernetes 스케줄러는 클러스터 내의 사용 가능한 노드를 검사하여 적절한 노드를 선택하고 Pod를 배치합니다. 스케줄러는 리소스 요구 사항, 노드 제약 조건, 어피니티 및 안티-어피니티 규칙 등을 고려하여 노드를 선택합니다.
Kubelet: 선택된 노드의 Kubelet은 Pod를 실행하기 위해 필요한 컨테이너를 생성하고, 실행하며, 모니터링합니다. Kubelet은 컨테이너 런타임(예: Docker, containerd 등)을 사용하여 컨테이너를 실행합니다.
컨테이너 런타임: 컨테이너 런타임은 이미지를 가져와서 컨테이너를 생성하고, 실행하며, 상태를 모니터링하고 필요에 따라 로그를 수집합니다.
서비스 프록시: 필요한 경우, 서비스 프록시(kube-proxy)는 Pod 간 통신을 가능하게 하는 서비스를 설정하고 관리합니다.
이러한 단계를 거쳐 새로운 Pod가 생성되어 실행되며, Kubernetes 클러스터에서 관리됩니다. 사용자는 kubectl
명령어를 사용하여 Pod의 상태를 확인하거나, 로그를 검색하거나, 클러스터 내에서 실행 중인 다른 리소스와 상호 작용할 수 있습니다.