일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- SPF
- Kubernetes
- SAA
- Datadog
- dMarc
- EKS
- Ingress
- aws
- SMTP
- Lambda
- gochannel
- SAA-CO2
- Certified Solutions Architect
- Fluentbit
- awscli
- Fargate
- docker
- Java
- 메일 인증 프로토콜
- K8S
- go
- 도커
- SAA-CO3
- DKIM
- JVM
- BitBucket
- aws ses
- serverless
- goroutine
- Today
- Total
DevOps Tasks
[K8S] 쿠버네티스 클러스터 구성 알아보기 본문
Kubernetes Components
쿠버네티스란 명칭은 키잡이(helmsman)나 파일럿을 뜻하는 그리스어에서 유래했다.
“K8S”라는 표기는 "K"와 "s"와 그 사이에 있는 8글자를 나타내는 약식 표기이다.
k8s는 크게 Control Plane과 Node 컴포넌트로 나뉜다.
Control Plane Component
컨트롤 플레인 컴포넌트는 클러스터에 관한 전반적인 결정을 수행하고 클러스터 이벤트를 감지하고 반응한다.
컨트롤 플레인 컴포넌트는 클러스터 내 어떠한 머신에서든지 동작할 수 있다. 그러나 간결성을 위하여, 구성 스크립트는 보통 동일 머신 상에 모든 컨트롤 플레인 컴포넌트를 구동시키고, 사용자 컨테이너는 해당 머신 상에 동작시키지 않는다.
Control Plane의 내부 Component 들은 kube-apiserver, etcd, kube-scheduler, kube-controller-manager, cloud-controller-manager 들로 이루어진다.
Amazon EKS 는 해당 컨트롤 플레인에 해당하는 부분을 고객 책임 모델을 통해 관리한다
kube-apiserver
API 서버는 쿠버네티스 API를 노출하는 쿠버네티스 Control Plane 컴포넌트이다.
API 서버는 쿠버네티스 컨트롤 플레인의 Front End라고 볼 수 있다.
쿠버네티스 API 서버의 주요 구현은 kube-api-server로 수평적으로 확장되고 인스턴스 간의 트래픽을 균형하게 조절할 수 있도록 디자인되었다.
간단하게 설명하자면 어떠한 호텔에 들어갔을 때 방문 목적과 예약자 등을 확인 후에 안내 데스크에서 안내를 받는다. 그러면 안내 데스크에서는 예약 확인 등을 거쳐 객실 키를 발급하고 층수를 안내해 준다.
이런 안내 데스크의 역할이 kube-apiserver이고 k8s 클러스터로 들어오는 요청을 가장 앞에서 접수하는 역할을 한다. kubectl, eksctl과 같은 k8s 커맨드 사용 시 kube-api-server로 전송되어 실행되는 것으로 볼 수 있다.
etcd
겉으로는 쉽게 드러나지 않아 놓치기 쉽지만 매우 중요한 역할을 담당하고 있는 컴포넌트가 etcd이다. (”엣시디”라고도 불린다.)
k8s 클러스터가 동작하기 위해서는 클러스터 및 리소스의 구성 정보, 상태 정보 및 명세 정보 등이 필요하다.
etcd는 이를 키-값(key-value) 형태로 클러스터 뒷단에 저장하는 저장소이다.
클러스터에 어떤 Node 가 몇 개나 있고 어떤 Pod 가 어떤 Node에서 동작하고 있는지가 etcd에 기록된다. 만약 동작 중인 클러스터의 etcd 데이터베이스가 유실된다면 컨테이너뿐만 아니라 클러스터가 사용하는 모든 리소스가 미아가 되어 버린다.
만약 etcd가 정상적으로 동작하지 않는다면 k8s 클러스터에 존재하는 리소스들은 목적과 기능을 상실한 난파선과 다르지 않다.
안정적인 동작을 위해 자료를 분산해서 저장하는 구조를 사용 중이고 중요한 데이터가 들어 있기에 해당 데이터를 백업하는 전략은 필수라고도 볼 수 있다.
간단하게 설명하자면, etcd는 각종 중요 정보가 모두 모여 있는 금고와 같은 곳이고, 중요한 정보를 보관하는 금고이기 때문에 동일한 자료를 여러 금고에 나눠서 보관하고 있다고 볼 수 있다.
kube-scheduler
쿠버네티스 클러스터는 여러 노드로 구성되어 있고 기본적인 작업 단위라고 할 수 있는 파드는 여러 노드 중 특정 노드에 배치되어 동작하게 된다.
이때 새로 생성된 파드를 감지하여 어떤 노드로 배치할지 결정하는 작업을 “스케줄링”이라고 한다. 이런 스케줄링을 담당하는 컴포넌트가 kube-scheduler이다. 스케줄링을 위해 CPU, RAM과 같은 컴퓨팅 리소스에 대한 노드 및 파드의 총체적 요구 사항들을 종합적으로 판단할 필요가 있는데, 이러한 판단 또한 kube-scheduler의 역할이다.
회사로 비유하자면, 각 부서 인력 소요 계획과 신입사원 역량을 고려해 적절한 부서로 배치하는 인사 담당 부서에 비유할 수 있다.
kube-controller-manager
Controller 프로세스를 실행하는 컨트롤 플레인 컴포넌트로 각 컨트롤러들을 구동하는 마스터 상의 컴포넌트로 제일 바쁜 컴포넌트라고 볼 수 있다.
논리적으로, 각 Controller는 분리된 프로세스이지만, 복잡성을 낮추기 위해 모두 단일 바이너리로 컴파일되고 단일 프로세스 내에서 실행된다.
scheduler와 controller-manager는 유기적으로 통신하고 컨트롤러는 아래를 포함한다.
노드 컨트롤러
노드가 다운되었을 때 통지와 대응에 관한 책임을 가진다.
잡 컨트롤러
일회성 작업을 나타내는 잡 오브젝트를 감시한 다음, 해당 작업을 완료할 때까지 동작하는 파드를 생성한다.
시스템의 모든 잡 컨트롤러 오브젝트들에 대해 알맞은 수의 파드들을 유지시켜 주는 책임을 가진다.
→ 복제를 일으키는 컨트롤러라고 볼 수 있다.
엔드포인트슬라이스 컨트롤러
(서비스와 파드 사이의 연결고리를 제공하기 위해) 엔드포인트슬라이스(EndpointSlice) 오브젝트를 채운다.
→ 서비스와 파드를 연결하고 접속을 관리한다.
서비스어카운트 컨트롤러
새로운 네임스페이스에 대한 기본 서비스어카운트(ServiceAccount)를 생성한다.
회사에서는 목표 수준을 달성하기 위해 끊임없이 확인하고, 목표치에 미달하는 부분에 대해서는 대책을 수립한다. 목표 달성한 후에도 이를 유지하려면 책임감 있는 관리자가 필요하다.
각 컨트롤러에 맞는 목표치를 유지하기 위해 조치하는 역할이라고 볼 수 있다.
Cloud-Controller-Manger
클라우드 벤더사 (AWS, GCP,, Azure 등) 별 컨트롤 로직을 포함하는 쿠버네티스 컨트롤 플레인 컴포넌트이다.
클라우드 컨트롤러 매니저를 통해 클러스터를 클라우드 공급자의 API에 연결하고, 해당 클라우드 플랫폼과 상호 작용하는 컴포넌트와 클러스터와만 상호 작용하는 컴포넌트를 구분할 수 있게 해 준다.
cloud-controller-manager는 클라우드 제공자 전용 컨트롤러만 실행한다.
Local 환경에서 쿠버네티스를 실행 중인 경우 클러스터에는 클라우드 컨트롤러 매니저가 없다.
kube-controller-manager와 마찬가지로 cloud-controller-manager는 논리적으로 독립적인 여러 컨트롤 루프를 단일 프로세스로 실행하는 단일 바이너리로 결합한다. 수평으로 확장(두 개 이상의 복제 실행)해서 성능을 향상하거나 장애를 견딜 수 있다.
다음 컨트롤러들은 클라우드 제공 사업자의 의존성을 가질 수 있다.
- 노드 컨트롤러: 노드가 응답을 멈춘 후 클라우드 상에서 삭제되었는지 판별하기 위해 클라우드 제공 사업자에게 확인하는 것
- 라우트 컨트롤러: 기본 클라우드 인프라에 경로를 구성하는 것
- 서비스 컨트롤러: 클라우드 제공 사업자 로드밸런서를 생성, 업데이트 그리고 삭제하는 것
Node Component
노드 컴포넌트는 동작 중인 파드를 유지시키고 쿠버네티스 런타임 환경을 제공하며, 모든 노드 상에서 동작한다.
Control Plane Component 에도 파드를 생성시킬 순 있지만 워낙 바쁜 친구라 Node Component에만 생성하는 것을 권장한다고 한다.
kubelet
클러스터의 각 Node에서 실행되는 에이전트. Kubelet은 Pod에서 컨테이너가 확실하게 동작하도록 관리해 주는 핵심 요소이다.
각 Node 들에서 Pod를 생성하고 정상적으로 동작하는지 관리하는 역할을 담당하고 있으며, 실제로 우리가 k8s를 관리하기 위해 사용하는 명령들은 kubelet을 통해 수행된다고 볼 수 있다.
. yaml 파일을 통해 k8s에 kubectl 명령어를 사용할 때. yaml → kube-apiserver → kubelet으로 전달된다고 볼 수 있다.
Kubelet은 쿠버네티스를 통해 생성되지 않는 컨테이너는 관리하지 않고. yaml을 통해 전달된 파드를 생성 혹은 변경하고, 이후. yaml에 명시된 컨테이너가 정상적이고 Healthy 하게 실행되고 있는지 확인한다.
각 Node 들에서 실행되는 에이전트라 볼 수 있고 kube-apiserver의 명령을 듣는 것이 아닌 시키지 않아도 kube-apiserver에게 먼저 물어본 후 수행한다.
kube-apiserver에 몇 개의 pod 가 필요한지 알아내서 pod를 생성하고 생성 후에도 master 가 죽어도 kube-apiserver에게 확인해서 유지가 가능하다.
간단하게 지사에서 본사의 업무 요청을 받아 확인하는 역할을 수행한다고 볼 수 있다.
kube-proxy
kube-proxy는 클러스터의 각 Node에서 실행되는 네트워크 프록시로, 쿠버네티스의 서비스 개념의 구현부이다.
kube-proxy는 노드의 네트워크 규칙을 유지 관리한다. 이 네트워크 규칙이 내부 네트워크 세션이나 클러스터 바깥에서 파드로 네트워크 통신을 할 수 있도록 해준다.
kube-proxy는 운영 체제에 가용한 패킷 필터링 계층이 있는 경우, 이를 사용한다. 그렇지 않으면, kube-proxy는 트래픽 자체를 포워드(forward)한다.
Load Balance의 기능을 가지고 있고 실질적으로 Master와 Node Component에서 외부로의 연결을 담당하며 클러스터 외부에서 Pod로 네트워크 통신을 할 수 있게 해주는 역할을 수행한다.
'Kubernetes' 카테고리의 다른 글
[K8S] AWS Load Balancer Controller (0) | 2024.08.04 |
---|---|
Kubernetes Service Type 과 Ingress Controllers (0) | 2024.08.04 |
Kubernetes Probe 로 Pod 핼쑥한지 확인하기 (0) | 2024.04.25 |
EKS Fargate Logging with Fluent Bit (0) | 2024.04.22 |
EKS Fargate CoreDNS 와 Logging Architecture (0) | 2024.04.18 |