※ AEWS는 '가시다'님이 속한 CloudNet@에서 진행하는 AWS EKS workshop에 대한 스터디 내용입니다.
Kubernetes Cluster Architecture
Control Plane Components
kube-apiserver
쿠버네티스 클러스터로 들어오는 요청을 가장 앞단에서 받는다.
kubernetes cli 인 kubectl을 사용해 각종 명령을 수행할 경우 이 명령은 kube-apiserver 로 전송되는 것이다.
모든 요청을 검증하고, etcd에 저장하며, 다른 컨트롤 플레인 구성 요소로 전달한다.
etcd
클러스터 및 리소스의 구성 정보, 상태 정보 및 명세 정보 등 모든 데이터를 저장하는 key-value 형태의 데이터베이스이다.
클러스터의 상태가 변화할 때마다 다른 컴포넌트들이 보내준 정보를 kube-apiserver가 받아서 etcd 서버에 업데이트한다.
kubectl get pod 같은 명령을 실행할 때, kube-apiserver는 etcd에서 데이터를 읽어서 리스트를 알려준다.
scheduler
새로운 Pod가 생성되면 어떤 노드에서 실행할지 결정한다.
Hardware/Software 상태, 정책, affinity 와 anti-affinity, resource 등 다양한 것들을 종합하여 스케줄링 한다.
kube-controller-manager
쿠버네티스 오브젝트들을 지속적으로 관리하는 역할을 하며 다양한 컨트롤러가 있다.
클러스터의 실제 상태(Actual State)와 원하는 상태(Desired State)가 일치하도록 유지한다.
주요 컨트롤러:
- Node controller: Node가 다운될 때 감지하고 대응합니다.
- Job controller: 일회성 작업을 나타내는 Job을 감시한 다음, 해당 작업을 완료할 때까지 실행하는 Pod를 생성합니다.
- Replication Controller: Desired Pod 개수 유지하는 역할을 합니다.
- EndpointSlice Controller: Service와 Pod간 링크 제공을 위해 EndpointSlice 개체를 채웁니다.
- ServiceAccount Controller: 새 네임스페이스에 대한 기본 ServiceAccount를 만듭니다.
cloud-controller-manager
쿠버네티스를 클라우드 서비스(AWS, GCP, Azure 등)와 연결하는 역할을 한다.
클라우드 환경에서 Node, Network, Storage, LB 등을 자동으로 생성, 관리한다.
예를들어, AWS EKS에서 Service의 타입을 LoadBalancer로 지정하면 AWS CLB가 자동으로 생성되는 이유다.
Control Plane은 클러스터의 상태가 미리 정의된 원하는 상태(Desired State)와 일치하도록 관리(Schedule)한다.
Data Plane Components
kubelet
kube-apiserver와 통신하여 Pod를 실행하고 관리한다. kube-apiserver 가 kubelet 에게 Pod 생성을 요청하면 컨테이너 런타임(containerd)를 사용하여 컨테이너를 실행한다.
또한 Pod 상태를 주기적으로 감시하고 비정상적인 Pod를 Restart 한다.
kube-proxy
쿠버네티스에서 네트워크 트래픽을 라우팅 및 로드 밸런싱하는 역할이다.
service to pod 통신을 담당하고 iptables 트래픽 규칙을 관리한다.
AWS EKS Architecture
Control Plane 과 Data Plane 간의 통신을 하기 위해 별도의 Network Interface 가 Data Plane 이 구성된 VPC 내부에 구성된다.
이를 EKS owned ENI 라고 하는데, 이를 통해 Master Node에 설치된 api-server 와 Worker Node에 설치된 kubelet 이 통신한다.
AWS EKS 를 생성한 VPC 에 두개의 EKS owned ENI 가 생성되었다.
소유자(내 계정 account)와 요청자 ID, 인스턴스 소유자(AWS account) 를 보면 서로 다르다.
또한, cluster 보안그룹은 EKS owned ENI 에 붙는다.
EKS Cluster Endpoint 모드
EKS 클러스터의 엔드포인트 설정은 Public, Public and Private, Private 세가지 모드로 나뉜다.
1. Public
kubectl 등의 클라이언트도 퍼블릭 도메인을 통해 접근가능하다.
네트워크 구성
컴포넌트 | 통신 방식 |
제어부(control plane) -> 워커노드 kubelet | EKS owned ENI (내부통신) |
워커노드 kubelet -> 제어부(control plane) | EKS API Server Public Endpoint (외부통신) |
사용자(kubectl) -> 제어부(control plane) | EKS API Server Public Endpoint (외부통신) |
# kubelet, kube-proxy 통신 Peer Address는 어딘인가요?
for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i sudo ss -tnp; echo; done
# 참고
APIDNS=$(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint | cut -d '/' -f 3)
dig +short $APIDNS
# [터미널] 파드 1곳에 shell 실행해두기
## kubectl 명령으로 특정 파드에 접근 (경로) : 작업PC -> API Server -> kubelet -> pod
kubectl run -it --rm netdebug --image=nicolaka/netshoot --restart=Never -- zsh
$ ip -c a
$ watch uptime
kubectl exec daemonsets/aws-node -it -n kube-system -c aws-eks-nodeagent -- bash
# exec 실행으로 추가된 연결 정보의 Peer Address는 어딘인가요? + AWS 네트워크 인터페이스 ENI에서 해당 IP 정보 확인
for i in $N1 $N2; do echo ">> node $i <<"; ssh ec2-user@$i sudo ss -tnp; echo; done
...
ESTAB 0 0 [::ffff:192.168.1.129]:10250 [::ffff:192.168.1.7]:38238 users:(("kubelet",pid=2933,fd=9))
...
worker node 에서 소켓 확인을 해보면 kubelet, kube-proxy 통신 peer address 는 public ip 가 나온다.
이는 API Server Endpoint IP 이며, 컨트롤 플레인에 NLB IP 이다.
2. public and private
네트워크 구성
컴포넌트 | 통신 방식 |
제어부(control plane) -> 워커노드 kubelet | EKS owned ENI (내부통신) |
워커노드 kubelet -> 제어부(control plane) | EKS owned ENI (내부통신/프라이빗호스트존) |
사용자(kubectl) -> 제어부(control plane) | EKS API Server Public Endpoint (외부통신) |
worker node 에서 소켓 확인을 해보면 kubelet, kube-proxy 통신 peer address 는 private ip 가 나온다.
외부 pc 에서 API Endpoint 도메인 질의를 하면 public ip 를 확인할 수 있다.
3. private
네트워크 구성
컴포넌트 | 통신 방식 |
제어부(control plane) -> 워커노드 kubelet | EKS owned ENI (내부통신) |
워커노드 kubelet -> 제어부(control plane) | EKS owned ENI (내부통신/프라이빗호스트존) |
사용자(kubectl) -> 제어부(control plane) | EKS owned ENI (내부통신/프라이빗호스트존) |
worker node 에서 소켓 확인을 해보면 kubelet, kube-proxy 통신 peer address 는 private ip 가 나온다.
외부 pc 에서 API Endpoint 도메인 질의를 하면 private ip 를 확인할 수 있다.
'AEWS' 카테고리의 다른 글
[AEWS 2주차] EKS Networking (0) | 2025.02.16 |
---|---|
[AEWS 1주차] Amzaon EKS 설치 및 기본 사용 (실습) (0) | 2025.02.10 |