Post

[Kubernetes] 쿠버네티스 아키텍처

[쿠버네티스 입문:90가지 예제로 배우는 컨테이너 관리 자동화 표준] 책의 4장 쿠버네티스 아키텍처 단원을 정리한 글입니다. Window10 운영체제에서 실습을 진행했습니다. 이론적인 내용이 중심인 글입니다.

✅ 4.2장에서는 주요 컴포넌트에 대해 다루고 있는데, 실습을 해보니 실제로 컴포넌트들을 만들고 본인의 프로젝트 상황에 맞게 운영하면서 컴포넌트들의 역할에 대해 체득하는 게 나을 것 같다. (물론 이론이 아예 안중요한 것 아니다.)


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

쿠버네티스 클러스터는 크게 두 종류의 서버로 구성된다.

  • 마스터 - 클러스터를 관리
  • 노드 - 실제 컨테이너를 실행

Untitled https://kubernetes.io/docs/concepts/architecture/

마스터 안을 자세히 들여다 보자! 마스터 안에는 다양한 컴포넌트가 실행된다. (etcd, kube-apiserver, kube-scheduler, kube-controller-manager, kubelet, kube-proxy, docker 등의 컴포넌트들)

  • 컴포넌트 각각이 다른 마스터나 노드 서버에서 실행되어도 실제 쿠버네티스 클러스터를 운영하는데 문제가 없다.
  • 서버가 1대라면 프로세스 한 묶음을 해당 서버에서 같이 실행하는 것이 일반적인 구성이다.

실제 사용하는 컨테이너의 대부분은 노드에서 실행된다.

각 컴포넌트의 중심에 kube-apiserver가 있고, 쿠버네티스의 모든 통신은 kube-apiserver가 중심이다. 이것을 거쳐 다른 컴포넌트가 서로 필요한 정보를 주고 받는다. 특히 etcd에는 kube-apiserver만 접근 가능하다.

마스터에서, kublet이 마스터에 있는 도커를 관리하고, 도커 안에는 쿠버네티스 관리용 컴포넌트가 있다. etcd는 컨테이너가 아니라 별도의 프로세스로 설정되고, 컨테이너가 아닌 서버 프로세스로 실행하도록 구성할 수 있다.

노드도 kubelet으로 도커를 관리하고, kubelet은 마스터의 kube-apiserver와 통신하면서 파드의 생성, 관리, 삭제를 담당한다. (파드의 스펙을 이용하여 실행 및 헬스 체크를 한다.)

Untitled https://medium.com/cwan-engineering/fully-equipped-kubernetes-cluster-ee8a9f34601d


4.2 쿠버네티스의 주요 컴포넌트

쿠버네티스는 근본적으로 클러스터를 관리한다!

  • 클러스터 : 단일 컴퓨터가 아니라 여러 대 컴퓨터를 하나의 묶음으로 다루는 것을 뜻하므로, 여러 가지 컴포넌트를 포함한다.

쿠버네티스의 컴포넌트는 다음과 같다.

  • 마스터용 컴포넌트 : 클러스터를 관리하는데 필수
  • 노드용 컴포넌트
  • 애드온용 컴포넌트 : 필수는 아니지만 추가로 사용 가능


4.2.1 마스터용 컴포넌트

마스터용 컴포넌트들은 실제 클러스터 전체를 관리함

Untitled

etcd

  • 쿠버네티스 클러스터 구성을 유지하는 분산 key-value 저장소이다.
  • 쿠버네티스에서는 필요한 모든 데이터를 저장하는 데이터베이스 역할을 한다.
  • etcd는 서버 하나 당 프로세스 1개만 사용할 수 있다.

kube-apiserver

  • 쿠버네티스 클러스터의 API를 사용할 수 있도록 하는 컴포넌트이다.
  • 클러스터로 온 요청이 유효한지 검증한다.
  • 수평적으로 확장할 수 있어서, 서버 여러 대에 여러 개의 kube-apiserver를 실행해 사용할 수 있다.

kube-scheduler

  • 현재 클러스터 안에서 자원 할당이 가능한 노드 중 알맞은 노드를 선택해서, 새롭게 만든 파드를 실행한다.
  • 조건에 맞는 노드를 찾는다.

kube-controller-manager

  • 쿠버네티스는 파드들을 관리하는 컨트롤러가 있다.
  • 컨트롤러 각각은 논리적으로 개별 프로세스인데, 복잡도를 줄이려고 모든 컨트롤러를 바이너리 파일 하나로 컴파일해 단일 프로세스로 실행된다.
  • kube-controller-manager는 컨트롤러 각각을 실행하는 컴포넌트이다.

cloud-controller-manager

  • 쿠버네티스의 컨트롤러들을 클라우드 서비스와 연결해 관리하는 컴포넌트이다.
  • 관련 컴포넌트의 소스 코드는 각 클라우드 서비스에서 직접 관리한다.
  • 네 가지 컨트롤러 컴포넌트를 관리한다. (node, route, service, volume)


4.2.2 노드용 컴포넌트

노드용 컴포넌트는 쿠버네티스 실행 환경을 관리한다.

Untitled

kubelet

  • 클러스터 안 모든 노드에서 실행되는 에이전트이다.
  • 파드 컨테이너들의 실행을 직접 관리한다.
  • 파드 스펙이라는 조건이 담긴 설정을 전달 받아서 컨테이너를 실행하고, 컨테이너가 정상적으로 실행되는지 헬스 체크를 한다.
  • 노드 안에 있는 컨테이너라도 쿠버네티스가 만들지 않은 컨테이너는 관리하지 않는다.

kube-proxy

  • 클러스터 안에 별도의 가상 네트워크의 동작을 관리한다.

컨테이너 런타임

  • 실제로 컨테이너를 실행, 가장 유명한 런타임은 docker이다.


4.2.3 애드온

애드온은 클러스터 안에서 필요한 기능을 실행하는 파드이다. 네임스페이스는 kube-system, 애드온으로 사용하는 파드들은 디플로이먼트, 리플리케이션 컨트롤러 등으로 관리한다.

네트워킹 애드온

  • AWS, Azure, GCC 같은 클라우드 서비스에서 제공하는 쿠버네티스를 사용하면 별도의 네트워킹 애드온을 제공한다.
  • 하지만 쿠버네티스를 직접 서버에 구성한다면 네트워킹 관련 애드온을 설치해서 사용해야 한다.

DNS 애드온

  • 클러스터 안에서 동작하는 DNS 서버, 쿠버네티스 서비스에 DNS 레코드를 제공한다.

대시보드 애드온

  • 쿠버네티스는 kubectl이라는 CLI를 많이 사용하는데, 웹 UI로 쿠버네티스를 사용할 필요도 있다.
  • 이때 클러스터 현황이나 파드 상태를 한눈에 쉽게 파악하는 기능이 있다.

컨테이너 자원 모니터링

  • 클러스터 안에서 실행 중인 컨테이너의 상태를 모니터링하는 애드온이다.

클러스터 로깅

  • 클러스터 안 개별 컨테이너의 로그, 쿠버네티스 구성 요소의 로그들을 중앙화한 로그 수집 시스템에 모아서 보는 애드온이다.
  • 클러스터 안 각 노드에 로그를 수집하는 파드를 실행해서 로그 중앙 저장 파드로 로그를 수집한다.


4.3 오브젝트와 컨트롤러

쿠버네티스

  • 오브젝트
    • 파드, 서비스, 볼륨, 네임스페이스
  • 오브젝트를 관리하는 컨트롤러
    • 레플리카세트, 디플로이먼트, 스테이트풀세트, 데몬세트, 잡

사용자 : 템플릿 등으로 쿠버네티스에 자원의 desired state를 정의한다.

컨트롤러 : desired state와 현재 상태가 일치하도록 오브젝트를 생성하거나 삭제한다.

4.3.1 네임스페이스

쿠버네티스 클러스터 하나를 여러 개 논리적인 단위로 나눠서 사용하는 것이다. 네임스페이스 덕분에 쿠버네티스 클러스터 하나를 여러 개 팀이나 사용자가 함께 공유할 수 있다.

실습

현재 생성되어 있는 네임스페이스들을 확인하자

1
2
3
4
5
6
$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   26d
kube-node-lease   Active   26d
kube-public       Active   26d
kube-system       Active   26d


default 이외의 네임스페이스를 이용하자

  • kubectl로 네임스페이스를 지정해서 사용할 때는 네임스페이스를 명시해야 하는데, 일일히 명시하기 번거롭다.
  • 기본 네임스페이스를 변경해서 사용한다.
  • 아래 예시의 경우, NAMESPACE가 비어 있으므로, default이다.
1
2
3
4
5
6
$ kubectl config current-context
docker-desktop

$ kubectl config get-contexts docker-desktop
CURRENT   NAME             CLUSTER          AUTHINFO         NAMESPACE
*         docker-desktop   docker-desktop   docker-desktop


kube-system으로 기본 네임스페이스를 변경하자

  • kube-system의 네임스페이스에는 쿠버네티스 관리용 파드나 설정이 있다.
1
2
3
4
5
6
7
$ kubectl config set-context docker-desktop --namespace=kube-system
Context "docker-desktop" modified.

$ kubectl config get-contexts
CURRENT   NAME             CLUSTER          AUTHINFO         NAMESPACE
*         docker-desktop   docker-desktop   docker-desktop   kube-system
          minikube         minikube         minikube         default


변경 방법을 알았으니 기본 네임스페이스를 다시 default로 바꾸자

1
2
3
4
5
6
$ kubectl config set-context $(kubectl config current-context) --namespace=""
Context "docker-desktop" modified.

$ kubectl config get-contexts $(kubectl config current-context)
CURRENT   NAME             CLUSTER          AUTHINFO         NAMESPACE
*         docker-desktop   docker-desktop   docker-desktop


4.3.2 템플릿

  • 쿠버네티스 클러스터의 오브젝트, 컨트롤러가 어떤 상태여야 하는지를 적용할 때는 YAML 형식의 템플릿을 사용한다.
  • 템플릿의 내용을 표현하는 YAML은 JSON과 비교했을 때 간결, 주석으로 인해 가독성이 좋다.

  • 아래는 템플릿의 기본 형식이고, 각 항목은 필드이다.
  • **쿠버네티스의 특징인 선언적 API를 확인할 수 있다!
1
2
3
4
apiVersion: v1 # 사용하려는 쿠버네티스 API 버전을 명시 kubectl api-versions
kind: Pod # 어떤 종류의 오브젝트 혹은 컨트롤러의 작업인지 명시 (Pod, Deployment, Ingress)
metadata: # 메타데이터를 설정, 해당 오브젝트의 이름이나 레이블
spec: # 파드가 어떤 컨테이너를 갖고 실행하며, 실행할 때 어떻게 동작할지 명시, status


참고

파드 템플릿에서 사용하는 하위 필드가 무엇이 있는지 확인할 수 있다. 각 필드의 데이터 타입도 확인 가능하다.

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
31
32
33
$ kubectl explain pods
KIND:       Pod
VERSION:    v1

DESCRIPTION:
    Pod is a collection of containers that can run on a host. This resource is
    created by clients and scheduled onto hosts.

FIELDS:
  apiVersion    <string>
    APIVersion defines the versioned schema of this representation of an object.
    Servers should convert recognized schemas to the latest internal value, and
    may reject unrecognized values. More info:
    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

  kind  <string>
    Kind is a string value representing the REST resource this object
    represents. Servers may infer this from the endpoint the client submits
    requests to. Cannot be updated. In CamelCase. More info:
    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

  metadata      <ObjectMeta>
    Standard object's metadata. More info:
    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

  spec  <PodSpec>
    Specification of the desired behavior of the pod. More info:
    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

  status        <PodStatus>
    Most recently observed status of the pod. This data may not be up to date.
    Populated by the system. Read-only. More info:
    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status


이미지 출처



This post is licensed under CC BY 4.0 by the author.