DevOps/Docker & kubernetes

K8s의 구성 요소 및 개념

치킨맛코드 2022. 8. 19. 08:53

kubenetes는 에플리케이션의 배포 및 조정, 관리를 자동으로 하기 위한 오픈소스 시스템이다. k8s은 에플리케이션을 배포, 유지 관리 및 확장하기위한 메커니즘을 총체적으로 제공한다. 구성요소는 느슨하게 결합되며, 매우 확장가능하게 설계되어 플렛폼 자체가 다양한 워크로드를 충족할 수 있다. k8s는 Master 또는 Worker 아키텍쳐를 사용한다. 이때  Master는 Cluster  Cluster를 조정하며 Nod는 에플리케이션을 실행한다. 각각의 구성요소는 아래와 같다.

Master 구성요소

컨트롤러 관리자 : 클러스터 이벤트를 관리하고 응답하는 컨트롤러 벡그라운드 스레드를 실행한다.

클라우드 컨트롤러: 클라우드 공급자와 상호작용한다.

스케쥴러 : 새로 생성된 노드를 선택한다

api서버 : 쿠버네티스 api를 노출하며 쿠버네티스 컨트롤러 플레인의 프론트엔드 역할을 한다. api서버는 클러스터에서 마스터로의 모든 통신을 처리하고 관리한다. 다른 구성요소는 원격 서비스를 호출하여 통신하도록 설계되지 않았다. 수평적으로 확장하여 더 많은 인스턴스를 가질 수 있도록 한다. 추가기능, 대시보드 등을 실행할 수 있다.

 

ETCD : 가용성이 뛰어난 분산 키-값 스토어로써 중요한 클러스터 데이터와 상태가 저장된다. k8s Deployment를 직접 관리하는 경우 선택적으로 master와 ETCD를 동일한 인스턴스에 배치하여 컨트롤 플레인에 필요한 인스턴스 수를 줄일 수 있다.

 

Nod : k8s가 사용하는 worker Machine이다. pod를 실행하는데 필요한 서비스를 포함하며 마스터 구성요소에 의해 관리된다.

Pod : 공유 네임스페이스와 컨테이너 실행방법에 대한 사양이 있는 하나 이상의 컨테이너로 구성된 그룹을 의미한다. k8s의 기본 구성요소이다. 한 pod에 있는 컨테이너들은 노드 전체에 분할할 수 없다. pod 내부의 어플리케이션은 서로 쉽게 통신할 수 있으며 공유 볼륨에 엑세스하기 쉬우므로, 데이터 공유 및 데이터 지속성 유지가 굉장히 용이하다. 개별 어플리케이션과 마찬가지로 상대적으로 휘발성이 있는 entity로 간주된다

 

kube-proxy : 각 워커노드에서 호스트의 네트워크 규칙을 유지 관리하고 필요한 연결을 하는 네트워킹 지원툴

 

kubelet : 워커로드에서 실행되는, API서버와 통신하는 기본에이전트이다. pod에서 실행되는 컨테이너가 올바르고 정상상태인지 확인해준다.  마스터 api서버 또는 로컬 구성파일에 의해 노드에 할당된 pod를 감시하고 필요한 볼륨을 마운트하고 보안정보를 다운로드하고 도커를 사용해 pod의 컨테이너를 실행하고, 주기적으로 요청된 컨테이너 활동성 조사 또는 상태확인을 실행한다.

가용성을 유지하기 위해 컨트롤 플레인 및 노드는 일반적으로 여러 가용영역에서 오토스케일링에 의해 배포된다. 마스터 구성요소는 클러스터의 모든 구성요소에서 실행될 수 있다. 하지만 고가용성을 위해서 마스터는 전용 인스턴스에서 실행되며 사용자 컨테이너는 마스터위에서 스케쥴링되지 않는다. 

 

중복성 및 복원력을 위해 단독 객체가 아닌 pod 복제본이 필요할 수 가 있다. replica set에서는 언제든 주어진 시간에 특정 갯수의 pod가 실행되도록 할 수 있다. replica set을 직접 생성하고 관리할 수 도 있지만, Deployment를 통해 Deployment에서 replica set을 소유하며 관리하는것이 일반적이다. Deployment에서 원하는 상태를 설계하면, 실제상태를 제어된 비율에 원하는 상태로 경하는, 선언적 방식으로 조작한다.

기본적으로 pod는 휘발성 객체이다. 그렇기에 하나의 pod가 다른 pod에 안정적으로 서비스를 제공하는것을 희망할 경우(ex 프론트 엔드의 webapp => 벡엔드의 dbapp) 어떤 특정 pod와 통신하는것이 중요한 것이 아니라, 벡엔드 app에 안정적으로 연결할 수 있어야 한다.

서비스 : 여러 파드에 논리적 컬랙션과 엑세스하는 수단이다. 사용가능한 pod의 집합이며 계속 업데이트 되기에 다른 pod가 직접 추적할 필요가 없다.

왼쪽의 web app에서는 db app에 엑세스 해야한다. 이때 어떤 pod에 연결되는것이 중요한것이 아니라, 인스턴스의 연결 유무가 중유하다. 이때 포트 80에서 요청된 web app에 대한 연결을 허용하고, 해당 pod에 대한 구성된 대상 port를 사용해 web app은 DB app 이라는 레이블이 있는 파드에 매핑된다.

 

kubectl명령어는 주어진 클러스터에서 k8s api서버와 통신하기 위한 명령 줄 인터페이스이다. k8s관리자를 제어한다. 컨테이너 오케스트레이션 및 관리를 위한 다목적 도구로서  리소스를 생성하고 클러스터 및 리소스된 세부정보를 확인하고 문제해결도구에 접근하기 위한 명령을 제공한다. 또한 리소스를 롤아웃, 조정 및 자동 조정하는데 사용된다. 클러스터 내부의 오케스트레이션 하기 위한 필수 도구이다. 

 

k8s 대시보드

k8s 대시보드(출저 k8s공식홈페이지 https://kubernetes.io/)

k8s에 컨테이너화된 app배포, 문제해결, 리소스 관리, app개요확인, 리소스 상태 정보 조회, 오류 등을 확인할 수 있다.

대시보드 ui는 기본제공을 하지 않기에, 아래의 명령어를 통해 설치해 줘야한다.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml

또한 대시보드 접속 활성화를 위해서 아래의 명령어를 사용하면 된다. 

kubectl proxy