쿠버네티스 Kubernetes
컨테이너화된 워크로드와 서비스를 관리하기 위한 오픈 소스 플랫폼
키잡이 Helmsman 와 파일럿을 뜻하는 그리스어에서 유래한 명칭이다
쿠버네티스는 이식성이 있고 확장 가능하며, 선언적 구성과 자동화를 모두 용이하게 해준다
쿠버네티스는 다음을 제공한다
* 서비스 디스커버리와 로드 밸런싱
쿠버네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있다
컨테이너에 대한 트래픽을 많으면, 쿠버네티스는 네트워크 트래픽을 로드밸런싱하고 배포하여
배포가 안정적으로 이루어질 수 있다
* 스토리지 오케스트레이션
로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재할 수 있다
* 자동화된 롤아웃과 롤백
쿠버네티스를 사용하여 배포된 컨테이너의 원하는 상태를 서술할 수 있으며
현재 상태를 원하는 상태로 설정한 속도에 따라 변경할 수 있다
예를 들어 쿠버네티스를 자동화해서 배포용 새 컨테이너를 만들고, 기존 컨테이너를 제거하고,
모든 리소스를 새 컨테이너에 적용할 수 있다
* 자동화된 빈 패킹 Bin Packing
컨테이너화된 작업을 실행하는데 사용할 수 있는 쿠버네티스 클러스터 노드를 제공한다
각 컨테이너가 필요로 하는 CPU 와 메모리 RAM 를 쿠버네티스에게 지시한다
쿠버네티스는 컨테이너를 노드에 맞추어서 리소스를 가장 잘 사용할 수 있도록 해준다
* 자동화된 복구 Self-Healing
쿠버네티스는 실패한 컨테이너를 다시 싲가하고, 컨테이너를 교체하며,
'사용자 정의 상태 검사' 에 응답하지 않는 컨테이너를 죽이고,
서비스 준비가 끝날 때까지 그러한 과정을 클라이언트에게 보여주지 않는다
* 시크릿과 구성 관리
쿠버네티스를 사용하면 암포, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리할 수 있다
컨테이너 이미지를 재구성하지 않고 스택 구성에 시크릿을 노출하지 않고도
시크릿 및 어플리케이션 구성을 배포 및 업데이트할 수 있다
파드 Pod
쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위
파드는 하나 이상의 컨테이너 그룹이다 (고래 떼 pod of whales, 콩꼬투리 pea pod)
파드의 콘텐츠는 항상 함께 배치되고, 함께 스케줄되며, 공유 콘텍스트에서 실행된다, 파드는 어플리케이션 별 "논리 호스트"를 모델링한다
쿠버네티스 클러스터 == 노드 컴포넌트 + 컨트롤 플레인 컴포넌트
쿠버네티스 클러스터는 컨테이너화된 어플리케이션을 실행하는 노드의 집합이다
노드는 쿠버네티스의 Worker Machine 이며, 모든 클러스터는 최소 한 개의 워커 노드를 가진다
워커 노드는 어플리케이션의 구성 요소인 파드 Pod 를 호스트하고
컨트롤 플레인 Control Plane 은 워커 노드와 클러스터 내 파드를 관리한다
프로덕션 환경에서는 일반적으로 컨트롤 플레인이 여러 컴퓨터에 걸쳐 실행된다
컨트롤 플레인 컴포넌트
클러스터에 관한 전반적인 결정을 수행하고 클러스터 이벤트를 감지하고 반응한다
클러스터 내 어떠한 머신에서든지 동작할 수 있지만, 간결성을 위해, 구성 스크립트는 보통 동일 머신 상에
모든 컨트롤 플레인 컴포넌트를 구동시키고, 사용자 컨테이너는 해당 머신 상에 동작시키지 않는다
노드 컴포넌트
동작 중인 파드를 유지시키고, 쿠버네티스 런타임 환경을 제공하며, 모든 노드 상에서 동작한다
kubelet - 클러스터의 각 노드에서 실행되는 에이전트, kubelet 은 파드에서 컨테이너가 확실하게 동작하도록 관리한다
kube-proxy - 클러스터의 각 노드에서 실행되는 네트워크 프록시, 쿠버네티스의 서비스 개념의 구현부
컨테이너 런타임 - 컨테이너 실행을 담당하는 소프트웨어
노드
쿠버네티스는 컨테이너를 파드 내에 배치하고 노드에서 실행함으로 워크 로드를 구동한다
노드는 클러스터에 따라 가상 또는 물리적 머신일 수 있다
각 노드는 컨트롤 플레인에 의해 관리되며 파드를 실행하는 데 필요한 서비스를 포함한다
노드의 컴포넌트에는 kubelet, 컨테이너 런타임, kebe-proxy 가 포함된다
쿠버네티스는 같은 이름의 리소스가 동일한 객체라고 가정하기 때문에, 노드도 동시에 같은 이름을 가질 수 없다
노드를 대폭 교체하거나 업데이트해야 하는 경우, 기존 노드 오브젝트를 먼저 API 서버에서 제거하고 업데이트 후 다시 추가해야 한다
노드 상태
kubectl 을 사용해서 노드 상태와 기타 세부 정보를 볼 수 있다 (ex. 주소, 컨디션, 용량과 할당 가능, 정보)
kubectl describe node <insert-node-name-here>
주소 - 클라우드 제공 사업자 또는 베어메탈 구성에 따라 다양하다 (HostName, ExternalIP, InternalIP)
컨디션 - 모든 Running 노드의 상태를 기술한다 (ex. Ready, DiskPressure, MemoryPressure, PIDPressure 등)
용량과 할당 가능 - 노드 상에 사용 가능한 리소스를 나타낸다, 리소스에는 CPU, 메모리, 노드 상으로 스케줄 되어질 수 있는 최대 파드 수가 있으며, 용량 블록의 필드는 노드에 있는 리소스의 총량을 나타낸다, 할당 가능 블록은 일반 파드에서 사용할 수 있는 노드의 리소스 양을 나타낸다
정보 - 커널 버전, 쿠버네티스 버전 (kubelet 과 kube-proxy 버전), 컨테이너 런타임 상세 정보, 노드가 사용하는 운영체제가 무엇인지와 같은 노드에 대한 일반적인 정보가 기술된다
하트비트
쿠버네티스 노드가 보내는 하트비트는 클러스터가 개별 노드가 가용한지를 판단할 수 있도록 도움을 주고,
장애가 발견된 경우 조치를 할 수 있게 한다
노드 컨트롤러
노드 컨트롤러는 노드의 다양한 측면을 관리하는 쿠버네티스 컨트롤 플레인 컴포넌트이다
1) 등록 시점에 노드에 (CIDR 할당이 사용토록 설정된 경우) 노드에 CIDR 블럭을 할당한다
2) 노드 컨트롤러의 내부 노드 리스트를 클라우드 제공 사업자의 사용 가능한 머신 리스트 정보를 근거로 최신 상태를 유지한다
3) 노드의 동작 상태를 모니터링한다
기본적으로, 노드 컨트롤러는 5초마다 각 노드의 상태를 체크한다
체크 주기는 kube-controller-manager 구성 요소의 --node-monitor-period 플래그를 이용하여 설정할 수 있다
'TIL > DOCKER' 카테고리의 다른 글
[Docker] Docker Image Build (0) | 2025.01.04 |
---|---|
Docker Exited (0) 되는 문제 수정하기 (0) | 2024.12.24 |
CI/CD via Jenkins #2 (0) | 2024.12.23 |
CI/CD via Jenkins + Docker #1 (1) | 2024.12.22 |
[Docker] docker-container 로 MySQL 접속하기 (2) | 2024.12.07 |