CS 지식

[CS 지식7.] Kubernetes 구성요소와 Pod 생성 방식이란?

Somaz 2023. 12. 18. 23:38
728x90
반응형

Overview

Kubernets 구성요소와 Pod 생성 방식에 대해서 공부해보려고 한다.

출처 : https://kubernetes.io/ko/docs/concepts/overview/components/

 


Why Kubernetes?

Kubernetes를 사용하면서도 “왜 Kubernetes를 사용해야 할까?” 에 대한 의문점에 대해서 크게 생각해본 적이 없었다. 그렇다면 Kubernetes를 사용해야만 하는 이유에 대해서 알아보자.

 

Kubernetes는 애플리케이션 컨테이너 배포, 확장 및 운영을 자동화하도록 설계된 오픈 소스 플랫폼이다. Google에서 개발했으며 현재 Cloud Native Computing Foundation에서 유지관리 하고 있다.


 

 

주요 이점은 아래와 같다.

  • Container Orchestration(컨테이너 오케스트레이션)
    • Kubernetes는 컨테이너의 수명주기를 효율적으로 관리하여 머신 클러스터 전반에 걸쳐 배포, 확장, 종료를 처리한다. 이는 격리되고 자체 종속성이 번들로 포함된 컨테이너에서 애플리케이션을 실행하는 프로세스를 단순화한다.
  • Scalability(확장성)
    • Kubernetes를 사용하면 간단한 명령이나 UI를 사용하거나 CPU 사용량에 따라 자동으로 애플리케이션을 자동으로 확장 및 축소할 수 있다. 이는 다양한 워크로드를 경험하는 애플리케이션에 매우 중요하다.
  • Load Balancing(로드 밸런싱)
    • Kubernetes는 배포가 안정적이도록 네트워크 트래픽을 분산할 수 있다. 즉, 애플리케이션의 단일 실패 지점에 대해 걱정할 필요가 없다.
  • High Availability(고가용성)
    • Kubernetes는 자동 빈패킹, 자가 복구(응답하지 않는 컨테이너 자동으로 다시 시작), 복제, 수평 확장(필요에 따라 자동으로 애플리케이션 크기 조정)과 같은 기능을 제공하여 애플리케이션의 가용성을 보장한다.
  • Automated Rollouts and Rollbacks(자동 롤아웃 롤백)
    • Kubernetes를 사용하여 배포된 컨테이너에 대해 원하는 상태를 설명할 수 있으며 제어된 속도로 실제 상태를 원하는 상태로 변경할 수 있다. 예를 들어 Kubernetes를 자동화하여 배포를 위한 새 컨테이너를 생성하고, 기존 컨테이너를 제거하고, 모든 리소스를 새 컨테이너로 변경시켜 줄 수 있다.
  • Service Discovery and Load Balancing(서비스 검색 및 로드 밸런싱)
    • Kubernetes는 DNS 이름이나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있다. 컨테이너에 대한 트래픽이 높으면 Kubernetes는 배포가 안정적이도록 네트워크 트래픽의 부하를 분산하고 분산할 수 있다.
  • Storage Orchestration(스토리지 오케스트레이션)
    • Kubernetes를 사용하면 로컬 스토리지, 퍼블릭 클라우드 공급자 등 원하는 스토리지 시스템을 자동으로 마운트할 수 있다.
  • Secret and Configuration Management(Secret 및 Configmap 관리)
    • Kubernetes는 비밀번호, OAuth 토큰, SSH 키와 같은 민감한 정보를 관리할 수 있다. 컨테이너 이미지를 다시 빌드하거나 스택 구성에 `Secret`을 노출하지 않고도 비밀과 애플리케이션 구성을 배포하고 업데이트할 수 있다.

 

 


Kubernetes 구성요소란?

Kubernetes는 머신 클러스터 전체에서 컨테이너화된 애플리케이션을 관리하기 위한 시스템이다.

다양한 리소스와 구성 요소를 사용하여 애플리케이션 배포 및 관리의 다양한 측면을 처리한다.

Kubernetes 내에서 `kube-system` 네임스페이스에는 Kubernetes 클러스터에서 중요한 역할을 하는 여러 중요한 시스템 Pod가 포함되어 있다.

 


Control Plane 컴포넌트

 

kube-apiserver 

전체 Kubernetes 클러스터의 중앙 제어를 담당한다. 내부 시스템 구성 요소는 물론 외부 사용자가 사용하는 Kubernetes API를 제공한다. Pod가 생성되면 `kube-apiserver`는 요청을 처리하고  Pod 정보를 `etcd` 데이터베이스에 저장한다.

 

etcd

모든 클러스터 데이터에 대한 Kubernetes의 백업 저장소로 사용되는 일관되고 가용성이 높은 키 값 저장소이다.  Pod 가 생성되면 해당 구성과 상태가 `etcd`에 저장되므로 클러스터 상태가 유지되고 장애 발생 시 복구될 수 있다.

 

kube-scheduler

할당된 노드가 없는 새로 생성된 Pod를 감시하고 리소스 요구 사항, 선호도 사양, 데이터 지역성, 워크로드 간 등 다양한 일정 기준에 따라 실행할 노드를 선택한다. Pod가 생성된 후 `kube-scheduler`는 이를 적합한 노드에 할당한다.

 

kube-controller-manager

클러스터에서 일상적인 작업을 처리하는 background threads 컨트롤러 프로세스를 실행한다. Pod 생성 시 `kube-controller-manager`의 관련 컨트롤러는 Pod의 실제 상태가 사용자가 지정한 원하는 상태와 일치하는지 확인한다.

 

 


 

 

Node 컴포넌트

 

 

kubelet

클러스터의 각 노드에서 실행되는 `kubelet`은 컨테이너가 Pod에서 실행되는지 확인하는 역할을 한다. Pod가 노드에 예약되면 해당 노드의 `kubelet`은 'kube-apiserver'의 요청을 받아 Pod에 지정된 컨테이너를 시작한다.

 

kube-proxy

각 노드에서 실행되며 네트워크 프록시로, 클러스터 내부 또는 외부의 네트워크 세션에서 Pod로의 네트워크 통신을 허용하는 네트워크 규칙을 유지한다. Pod가 생성되면 `kube-proxy`는 포드의 IP 주소로 IP 전달을 허용하도록 노드의 네트워크 규칙을 업데이트 한다.

 

DNS 서비스(ex: CoreDNS)

Kubernetes 클러스터에 DNS 서비스를 제공하여 서비스 및 Pod 이름을 IP 주소로 변환한다. Pod가 생성되면 IP 주소와 DNS 이름을 얻는다. `CoreDNS`는 레코드를 업데이트하여 클러스터 내의 DNS 이름을 통해 Pod에 액세스할 수 있도록 한다.

 

Container Runtime

컨테이너 런타임은 컨테이너 실행을 담당하는 소프트웨어이다. `Containerd, CRI`와 같은 컨테이너 런타임을 지원한다.

 

Addon

Addon은 쿠버네티스 리소스(데몬셋, 디폴로이먼트 등)을 이용하여 클러스터 기능을 구현한다. 클러스터 단위의 기능을 제공하기 때문에 애드온에 대한 네임스페이스 리소스는 `kube-system` 네임스페이스에 속한다.

 


 

Kubernetes Pod 생성 방식

참고 : https://kubernetes.io/ko/docs/concepts/overview/components/

 

  1. 사용자는 Kubernetes에게 아래와 같이 `kubectl`을 사용하여 배포를 생성하도록 요청한다. 다음과 같이 프로세스가 작동한다.
    • `kubectl apply -f k8s-deployment.yml`
  2. `kubectl`은 yaml 리소스를 JSON으로 변환하여 컨트롤 플레인 내의 마스터 노드 또는 API 서버로 전송한다.
  3. `API Server`가 요청을 받고 배포 세부 정보 또는 Object 정의를 데이터베이스에 유지 관리한다.
  4. `etcd`는 Kubernetes에서 데이터를 저장하는 데 사용되는 고가용성 키-값 저장소이며, 구성 사양 및 실행 중인 워크로드의 전체 상태를 저장하여 Kubernetes의 중요한 구성 요소이다.
  5. 배포 리소스가 `etcd` 저장소에 저장되면 `Controller Manager`가 알림을 받고 Replica와 일치하도록 충분한 Pod 리소스를 생성된다.
    • 해당 시점에서 `etcd`의 배포 상태는 보류이다.
  6. `Scheduler`는 대기 중 상태를 확인하고 인프라 상태를 검사하며 노드 필터링 및 순위 지정을 수행한다. 그리고 Pod를 예약할 위치를 결정하고 비즈니스 로직을 실행하여 Pod 사양의 `nodeName` 필드는 예약 가능한 노드의 이름을 가지며 예약된 상태로 `etcd`에서 예약된 Pod 객체를 유지한다.
    • 해당 시점에서는 아직 Pod가 생성되지 않았고 객체가 `etcd`에 생성, 업데이트 및 저장되었다.
  7. 각 작업자 노드에는 마스터 노드 또는 제어 플레인과의 통신을 담당하는 `kubelet`이 있다. 클러스터의 각 서버에 있는 Kubernetes 제어 플레인과 컨테이너 런타임 간의 인터페이스를 제공한다. 따라서 `kubelet`은 Container가 Pod에 실행되고 있는지 확인 후 컨트롤 플레인이 노드에서 어떤 일을 발생시켜야 할 때, `kubelet`은 작업을 실행한다.
  8. 만약 deployment에 3개의 Replica를 생성하라는 지시가 있는 있다면 각 작업은 `etcd`에 예약된 것으로 표시된다.
  9. `kubelet`은 Pod용 템플릿을 검색하고 컨테이너 생성을 CRI Daemon에 위임한다.
  10. CRI Daemon이 작업을 완료하면 `kubelet`은 준비 상태 및 활성 프로브를 확인하고 포드는 최종적으로 실행 중인 것으로 표시된다.

 


Reference

https://kubernetes.io/ko/docs/concepts/overview/components/

https://medium.com/@mrdevsecops/pods-creation-process-flow-99c49fd64848

https://belowthemalt.com/2022/04/08/kubernetes-cluster-process-flow-of-a-pod-creation/

https://spot.io/resources/kubernetes-architecture/11-core-components-explained/

728x90
반응형