4장 쿠버네티스 아키텍처

최시원·2023년 3월 9일
0

쿠버네티스 입문

목록 보기
3/7

쿠버네티스 클러스터의 전체 구조

k8s 클러스터는 두 종류의 '서버' 로 구성된다
1. Master : 클러스터를 관리함
2. Node : 실제 컨테이너를 실행시킴

Master

etcd, kube-apiserver, kube-scheduler, kube-controller-manager, kubelet, kube-proxy, docker 등의 컴포넌트가 실행된다.

각 컴포넌트들이 서로 다른 마스터/노드에서 별개로 실행되어도 실제 클러스터 운영에 문제는 없다.
마스터는 고가용성을 만족하기 위해 3대 정소의 서버로 구성한다. 평소 클러스터를 관리하는 리더 마스터는 1대이고 나머지 2대는 대기한다. 리더에 장애가 발생하면 나머지 2대중 하나가 리더를 맡는다.

Node

kubelet, kube-proxy, docker등의 컴포넌트가 실행된다. 실제 사용하는 컨테이너 대부분은 노드에서 실행된다.

마스터와 노드의 구성과 통신구조

각 컴포넌트의 중심에는 kube-apiserver가 있다. 모든 통신은 이것이 중심이다. 이를 거쳐 다른 컴포넌트가 서로 필요한 정보를 주고받는다. 특히 'etcd' 에는 kube-apiserver만 접근 가능하다.
kubelet이 마스터에 있는 도커를 관리한다. 도커 내부에는 쿠버네티스 관리용 컴포넌트인 kube-scheduler, kube-controller-manager, kube-apiserver, kube-proxy가 있다.
etch는 컨테이너가 아니라 별도의 프로세스로 설정되어있다.
노드 역시 kubelet으로 도커를 관리한다. kubelet은 마스터의 kube-apiserver와 통신하면서 파드의 생성/관리/삭제를 담당한다. 노드의 kube-proxy는 마스터와는 다르게 컨테이너가 아니라 서버 프로세스로도 실행할 수 있다.

쿠버네티스 주요 컴포넌트 소개

k8s 컴포넌트는 세가지로 구분된다.
1. Master용 컴포넌트
2. Node용 컴포넌트
3. 추가 사용가능한 addon 컴포넌트

1. Master용 컴포넌트

etcd : key-value 저장소이다. k8s에서는 필요한 모든 데이터를 저장하는 DB역할을 한다. etcd는 서버 하나당 프로세스 1개만 사용 가능하다. 보통 etcd자체를 클러스터링 한 후 여러 개 마스터 서버에 분산하여 실행해 데이터안정성을 보장한다.

kube-apiserver : k8s 클러스터의 api를 사용할 수 있도록 하는 컴포넌트이다. 클러스터로 온 요청이 유효한지 검증한다. 쿠버네티스에서 보내는 모든 요청은 kube-apiserver를 이용해서 다른 컴포넌트로 전달한다.
kube-apiserver는 수평적으로 확장 가능하도록 설계되어있다.

kube-scheduler : 현재 클러스터 안에 자원 할당이 가능한 노드 중 알맞은 노드를 선택해 새롭게 만든 파드를 실행시킨다. 파드는 처음 실행시 여러 조건을 설정하며, kube-scheduler가 이 조건에 맞는 노드를 찾는다. 조건은 하드웨어 요구사항, 함께 있어야 하는 파드들을 같은 노드에 실행하는 affinity / 파드를 다양한 노드로 분산 실행하는 anti-affinity 만족 여부, 특정 데이터가 있는 노드 할당 등이 있다

kube-controller-manager : 파드들을 관리하는 컨트롤러가 있다. 컨트롤러 각각은 논리적으로 개별 프로세스이나, 복잡도를 줄이기 위해 모든 컨트롤러를 바이너리 파일 하나로 컴파일해 단일 프로세스로 실행한다.
이 컴포넌트는 컨트롤러 각각을 실행한다. 클러스터 내부에서 새 컨트롤러를 사용할때는 컨트롤러 구조체를 만드는데, 이를 kube-controller-manager가 관리하는 큐에 넣어 실행한다.

cloud-controller-manager : k8s의 컨트롤러들을 클라우드 서비스와 연결해 관리한다.
관리하는 컨트롤러 컴포넌트는 다음과 같다.

  • Node controller : 클라우드 서비스 안에서 노드를 관리하는데 사용.
  • Route controller : 각 클라우드 서비스 안의 네트워크 라우팅을 관리하는 데 사용한다.
  • service controller : 각 클라우드 서비스에서 제공하는 로드밸런서를 생성, 갱신, 삭제하는 데 사용한다.
  • Volume controller : 클라우드 서비스에서 생성한 볼륨을 노드에 연결하거나 마운트하는데 사용한다.

2. Node 용 컴포넌트

노드용 컴포넌트는 k8s 실행환경을 관리한다. (ex : 각 노드의 pod 실행 관리)

kubelet : 클러스터 안 모든 노드에서 실행되는 에이전트이다. pod container의 실행을 직접 관리한다. kubelet 은 podspecs 라는 조건이 담긴 설정을 전달받아 컨테이너를 실행하고, 컨테이너가 정상적으로 실행되는지 헬스체크를 진행한다.

kube-proxy : 클러스터 안 별도 가상 네트워크를 설정 및 관리한다. kube-proxy는 가상 네트워크 동작을 관리하는 컴포넌트이다. 호스트의 네트워크 규칙을 관리하거나 연결을 전달할 수도 있다.

컨테이너 런타임 : 실제로 컨테이너를 실행시킨다. 대표적으로 docker, containerd, runc 등이 있다.

3. 애드온

네트워킹 애드온 : 가상 네트워크 구성시 kube-proxy 이외에 네트워킹 애드온을 사용한다. AWS, 구글 클라우드 플랫폼은 별도 네트워킹 애드온이 제공되나, 직접 k8s를 서버에 구성한다면 네트워킹 관련 애드온을 설치해야 한다.

DNS 애드온 : 클러스터 안에서 동작하는 DNS서버이다. k8s 서비스에서 DNS레코드를 제공한다. k8s안에 실행된 컨테이너들은 자동을 DNS 서버에 등록된다.

대시보드 애드온 : kubectl 이라는 CLI를 많이 사용한다. 웹UI로 k8s를 사용할 필요가 있다면 k8s에서 제공하는 대시보드 애드온을 사용 가능하다.

컨테이너 자원 모니터링 : 클러스터 안에서 실행중인 컨테이너의 상태를 모니터링하는 애드온이다. kubelet 안에 포함된 cAdvisor라는 컨테이너 모니터링 도구가 대표적이다.

클러스터 로깅 : 클러스터 안 개별 컨테이너의 로그와 쿠버네티스 구성 요소의 로그들을 중앙화한 로그 수집 시스템에 모아서 보는 애드온이다.

오브젝트와 컨트롤러

k8s는 크게 오브젝트와 이를 관리하는 컨트롤러로 나뉜다. 사용자는 탬플릿 등으로 k8s에 자원의 '바라는 상태desired state'를 정의하고, 컨트롤러는 바라는 상태와 현재가 일치하도록 오브젝트를 생성/삭제한다. 오브젝트에는 pod, service, volume, namespace등이 있다.
컨트롤러에는 replicaset, deployment, statefulset, deamonset, job 등이 있다.

네임스페이스

쿠버네티스 클러스터 하나를 여러 개의 논리적 단위로 나누는 것이다.
여러개 팀이나 사용자가 한 클러스터를 공유할 수도 있고, 용도에 따라 실행해야 하는 앱을 구분할때도 사용한다. 또한 별도의 쿼터를 설정해 특정 네임스페이스의 사용량을 제한할 수도 있다.

처음 k8s를 설치하면 기본적으로 몇 개의 네임스페이스가 생성된다.
kubectl get namespaces로 이를 확인할 수 있다.

기본 네임스페이스의 의미는 다음과 같다.

  • default : 기본 네임스페이스이다. 명령 실행시 별도 네임스페이스 지정을 하지 않는다면 여기에서 명령을 적용한다.

  • kube-system : k8s 시스템에서 관리하는 네임스페이스이다. k8s 관리용 pod나 설정이 있다.

  • kube-public : 클러스터 안 모든 사용자가 읽을 수 있는 네임스페이스이다. 보통 클러스터 사용랴 같은 정보를 이 네임스페이스에서 관리한다.

  • kube-node-lease : 각 노드의 임대 오브젝트lease object들을 관리하는 네임스페이스이다.

네임스페이스를 지정하고 싶을때는 --namespace=kube-system 과 같은 방식으로 명령을 사용하면 된다.
기본 네임스페이스 변경도 가능하다.
실습 내용.

탬플릿

k8s 클러스터의 오브젝트나 컨트롤러가 어떤 상태여야 하는지를 적용할 때는 YAML 형식의 탬플릿을 사용한다.
YAML은 JSON과 비교해 간결하며 주석을 지원한다. 다만 들여쓰기를 주의해야 한다.

YAML은
Scalar(strings/numbers)
Sequences(arrays/lists)
Mappings(hashes/dictionaries)
라는 세가지 기초 요소로 표현한다. 주석은 '#'로 시작하며, 여러 줄 주석은 지원하지 않는다. '---'은 구분자로 사용한다.
사용 예시
Scalars:
Name : kim
Birth : 2019

Sequences
ProgrammingSkills:
-java
-python
-c

Mappgin
Data:
height : 170
weight: 80

탬플릿의 기본 형식은 다음과 같다.

'---'
apiVersion: v1
kind: pod
metadata:
spec:

apiVersion : 사용하려는 쿠버네티스 API버전을 명시한다.
kind : 어떤 종류의 오브젝트 혹은 컨트롤러에 작업인지 명시한다. 여기에 Pod, Deployment, Ingress등의 다양한 오브젝트, 컨트롤러를 명시 가능하다.
metadata : 메타데이터 설정이다. 해당 오브젝트의 이름이나 레이블을 설정한다
spec : 파드가 어떤 컨테이너를 갖고 실행하며, 실행할 때 어떻게 동작해야 할지 명시한다.

어떤 필드, 어떤 역할인지는 kubectl explain 명령으로 살펴볼 수 있다. kubectl explain pods 명령은 pod 탬플릿에서 사용하는 하위 필드로 무엇이 있는지 출력한다.

0개의 댓글