k8s

쿠버네티스 구성 요소

shmallow 2023. 4. 25. 23:42

1. kubectl : 쿠버네티스 클러스터와 상호 작용할 수 있는 명령행 도구를 말한다. kubectl을 사용해 클러스터의 상태를 조회하거나 리소스를 생성, 업데이트, 삭제할 수 있다.

2. API 서버 : kubectl을 사용하여 명령을 내리면, 해당 명령은 API 서버에 전달되는데, API 서버는 클러스터의 중앙 집중식 관리 포인트 역할을 하며, 클러스터의 리소스를 생성, 수정, 삭제하고 조회하는 데 사용되는 RESTful API를 제공한다.

3. etcd : API 서버는 클러스터의 상태 정보를 etcd에 저장한다. 따라서 쿠버네티스 클러스터 내에서 모든 구성 요소가 일관된 상태를 유지할 수 있도로 한다.

4. 컨트롤러 매니저 : 클러스터의 상태를 지속적으로 모니터링하며, 현재 상태와 목표 상태 간의 차이를 해소하기 위한 작업을 수행한다.

5. 스케줄러 : 새로운 파드가 생성되어야 할 경우, 적절한 노드를 선택하여 해당 파드를 실행시킨다. 스케줄러는 파드의 요구 사항과 노드의 리소스를 고려하여 결정을 내린다.

6. kubelet(worker node) : 스케줄러가 파드를 실행할 노드를 선택하면, 해당 노드의 kubectl이 이를 처리한다. kubectl은 파드의 스펙을 확인한 후, 컨테이너 런타임을 사용하여 파드 내의 모든 컨테이너를 실행한다. 또한 파드의 상태를 지속적으로 모니터링하고, API 서버에 보고한다.

7. kubelet (master node) : API 서버, etcd, 컨트롤러 매니저와 같은 구성 요소를 실행하기 위해 필요한 파드를 실행 및 관리한다. 또 해당 마스터 노드의 파드 상태를 모니터링하고 API 서버에 상태 정보를 보고한다. work node, master node 둘 다 상태를 API 서버에 보고하면 컨트롤러 매니저가 상태 정보를 바탕으로 원하는 상태와 현재 상태를 비교해 필요한 조치를 취한다.

8. 파드 : 한 개 이상의 컨테이너로 단일 목적의 일을 하기 위해서 모인 단위를 말한다. 파드는 언제라도 죽을 수 있는 존재라서 내구성과 탄력성이 뛰어나다. 따라서 클러스터가 장애 상황에 대처하고 자동으로 복구할 수 있는 능력을 강화시킬 수 있다.

9. 네트워크 플러그인 : 쿠버네티스 클러스터 통신을 위해 사용하는 플러그인으로 일반적으로 CNI(Container Network Interface)로 구성되는데, CNI란 컨테이너 네트워크 안정성과 확장성을 보장하기 위해 개발되었다. 대표적으로 Calico가 있다. Calico는 IP 라우팅을 기반으로 한 네트워크 솔루션을 제공한다. 네트워크 프로토콜은 여러 계층으로 나뉘는데, 여기서 L2(Data Link Layer)은 MAC 주소를 사용하여 통신을 하며, L3 계층은 IP 주소를 사용하여 통신한다. 따라서 각 컨테이너는 고유한 IP를 가지고 있으며, IP 라우팅을 사용하여 다른 컨테이너와 통신할 수 있다. 

10. 쿠버네티스 서비스 : 쿠버네티스에서 제공하는 네트워크 추상화 계층중 하나로, 서비스는 쿠버네티스 클러스터 내의 파드를 그룹화하고, 이를 네트워크 노출하는 역할을 한다. 따라서 파드를 직접 참조하지 않고 추상화된 네트워크를 사용하여 다른 애프리케이션과 통신할 수 있게 된다. 예를 들어, 애플리케이션을 구성할 때, 파드가 여러 개 실행될 수 있다. 이때, 서비스를 생성하여 파드를 묶어서 하나의 서비스로 노출하면, 다른 애플리케이션이 이 서비스를 사용하여 파드에 접근할 수 있게 된다.

    - 질문 : 애플리케이션을 구성할 때 파드가 여러 개 실행될 수 있는 경우는 어떤 경우인가?

    - 답변 : 크게 두 가지가 있다. 첫째, 애플리케이션의 성능을 향상시키기 위해 여러 개의 파드를 실행할 수 있다. 둘째, 애플리케이션의 가용성을 보장하기 위해 여러 개의 파드를 실행할 수 있다.

    - 질문 : 다른 애플리케이션과는 어떻게 통신하는가?

    - 답변 : 외부 애플리케이션이 서비스의 VIP와 포트를 통해 요청을 보내면, 요청이 서비스로 전달이 되고, 로드밸런싱을 통해 파드의 IP 주소와 포트 번호가 결정이 되고 해당 파드 내의 컨테이너로 요청이 전달된다. 이때, 파드 내부에서 컨테이너끼리 통신하는 방법은 localhost를 사용하여 통신하게 된다. 

11.  kube-proxy : kube-proxy는 쿠버네티스 클러스터의 모든 노드에서 실행되며, 네트워크 서비스를 구현하는데 사용된다. 첫째, 쿠버네티스 서비스의 VIP 주소를 관리한다. 쿠버네티스에서 서비스를 생성하면, kube-proxy는 해당 서비스를 모니터링하고, 서비스의 IP 주소 및 포트 번호를 사용하여 클러스터 내의 다른 애플리케이션과 통신할 수 있게 한다. kube-proxy는 iptable과 같은 리눅스 커널 기반의 로드밸런싱 기술을 사용하여 VIP 주소를 구현한다. kube-proxy는 VIP를 사용해 로드밸런싱을 수행한다.


파드의 생명주기

1. kubectl을 통해 API 서버에 파드 생성 요청

2. API 서버에 전달된 내용이 있으면 API 서버는 etcd에 전달된 내용을 모두 기록해 클러스터 상태 값을 최신으로 유지

3. API 서버에 파드 생성이 요청된 것을 컨트롤러 매니저가 인지하면, 파드를 생성하고 이 상태를 API 서버에 전달

4. API 서버에 파드가 생성됐다는 정보를 스케줄러가 인지하고, 스케줄러는 생성된 파드를 어떤 워커 노드에 적용할 지 조건을 고려해 결정하고 해당 워크 노드에 파드를 띄우도록 요청

5. kubelet을 통해 해당 워커 노드에 파드가 속해 있는지 확인

6. kubelet에서 컨테이너 런타임으로 파드 생성을 요청

7. 파드 생성

8. 파드 사용가능한 상태

 

 

 

 

 

 

 

'k8s' 카테고리의 다른 글

컨테이너 인프라 환경  (0) 2022.10.18