[k8s] 쿠버네티스 용어 정리

쿠버네티스 클러스터

쿠버네티스 클러스터(cluster)는 하나의 시스템을 구성하는 서버들의 집합이다. 클러스터는 크게 다음 두 종류의 서버로 구성된다.

  • 컨트롤 플레인 (control plane)
  • 노드 (node)

컨트롤 플레인 서버는 클러스터를 관리한다. 일반적으로 고가용성을 위해 세 대의 서버로 구성한다. 컨트롤 플레인을 호스팅하는 노드들을 마스터라고 한다. 컨트롤 플레인은 컨테이너의 라이프사이클을 정의, 배포 및 관리하기 위해 API와 인터페이스를 노출하는 컨테이너 오케스트레이션 레이어이다. 프로덕션 환경에서는 일반적으로 컨트롤 플레인이 여러 컴퓨터에서 실행되고 클러스터는 일반적으로 여러 노드를 실행하여 내결함성과 고가용성을 제공한다.

컨트롤 플레인에는 etcd, kube-apiserver, kube-scheduler, kube-controller-manager, kubelet, kube-proxy, docker 등의 컴포넌트가 실행된다. 컨트롤 플레인 용 컴포넌트는 클러스터의 모든 상태 및 구성 데이터 저장, 클러스터 API를 통해 클러스터로 유입된 요청 검증 및 처리, 노드 선택 및 파드 실행, 파드를 관리하는 컨트롤러 실행 및 관리 등을 통해 클러스터 전체를 관리한다. 컨트롤 플레인의 kubelet은 컨트롤 플레인의 도커를 관리한다.

노드(또는 워커 노드)는 컨테이너화된 애플리케이션을 실행하는 워커 머신의 집합이다. 실제 대부분의 컨테이너는 노드에서 실행된다. 노드는 클러스터에 따라 VM 또는 물리 머신에 해당된다. 노드는 파드 실행에 필요한 로컬 데몬과 서비스를 가지고 있으며, 컨트롤 플레인에 의해 관리된다. 모든 클러스터에는 하나 이상의 노드가 존재하며 노드는 워크로드(쿠버네티스 상에서 실행되는 애플리케이션의) 구성 요소인 파드(Pod)를 호스팅한다. 노드에는 kubelet, kube-proxy, docker 등의 컴포넌트가 실행된다. 노드 용 컴포넌트는 노드의 파드 실행 관리, 가상 네트워크 설정 및 관리, 컨테이너 실행 등을 통해 쿠버네티스 실행 환경을 관리한다. 노드의 kubelet은 노드의 도커를 관리하며 컨트롤 플레인의 kube-apiserver와 통신하면서 파드의 생성, 관리, 삭제를 담당한다.


네임스페이스

네임스페이스(namespace)란 클러스터를 논리적으로 나누는 역할을 수행한다. 네임스페이스를 통해 쿠버네티스 클러스터 하나를 여러 개 논리적인 단위로 나눠서 사용할 수 있다. 쿠버네티스 클러스터 하나를 여러 개 팀이나 사용자가 구분하여 사용하거나 용도 별로 시스템 또는 서비스의 위치를 구분하기 위해 네임스페이스를 사용한다. 네임스페이스 별로 쿼터(quota)를 설정하여 특정 네임스페이스의 리소스 사용량을 제한할 수도 있다.

쿠버네티스를 처음 설치하면 기본으로 몇 개의 네임스페이스가 생성되며, 쿠버네티스에서 명령을 실행할 때 별도의 네임스페이스를 지정하지 않는다면 항상 기본 네임스페이스인 default 네임스페이스에 명령이 적용된다.


오브젝트와 컨트롤러

오브젝트(Object)는 쿠버네티스 시스템에서 영속성을 가지는 객체이다. 컨트롤러(Controller)가 관리하는 대상이 바로 오브젝트이다. 오브젝트는 클러스터의 상태를 나타내기 위해 사용한다. 클러스터의 의도하는 상태를 전달하면 쿠버네티스 시스템은 오브젝트의 해당 상태 보장하기 위해 동작한다.

오브젝트의 명세(spec)와 상태(status)를 설정함으로써 오브젝트의 기본 정보와 의도한 상태를 지정하면 쿠버네티스 시스템은 오브젝트의 실제 상태와 의도한 상태를 일치시키기 위해 능동적으로 관리한다. 오브젝트의 종류에는 파드, 서비스, 볼륨, 네임스페이스가 있다.

컨트롤러(Controller)는 오브젝트를 관리하는 역할을 수행하는 컴포넌트이다. 컨트롤러는 클러스터의 상태를 관찰한 다음 필요한 경우 오브젝트를 생성 또는 변경 요청한다. 컨트롤러는 적어도 하나 이상의 쿠버네티스 리소스를 추적한다. 해당 리소스의 컨트롤러는 오브젝트의 현재 상태를 의도한 상태에 가깝게 만드는 역할 수행한다.

템플릿(Template)은 오브젝트나 컨트롤러의 상태를 선언적으로 정의함으로써 관리하는 역할을 한다. 필드에 대한 값을 명시함으로써 오브젝트 및 컨트롤러 지정, 메타데이터 설정, 오브젝트 및 컨트롤러의 역할을 정의할 수 있다.

레이블(Label)은 파드와 같은 오브젝트에 첨부된 키와 값의 쌍이다. 오브젝트 및 오브젝트의 특성을 식별하거나 오브젝트의 하위 집합을 선택하고 구성하는데 사용한다. 레이블은 오브젝트 생성 시 또는 생성 이후 언제든 수정 가능하다. 오브젝트마다 키와 값으로 레이블을 정의한다. 이때 오브젝트의 키는 고유한 값이어야 한다.

셀렉터(Selector) 또는 레이블 셀렉터는 특정 레이블을 가지는 오브젝트를 선택하기 위해 사용한다. 예를 들어, 디플로이먼트가 관리할 파드가 어떤 파드인지, 서비스가 트래픽을 라우팅할 파드가 어떤 파드인지 선택하기 위해 셀렉터를 사용한다.


오브젝트

파드

파드(Pod)는 하나 이상의 컨테이너를 묶어 관리하기 위한 쿠버네티스의 컨테이너 관리 기본 단위이다. 파드는 가장 기본적이고 중요한 쿠버네티스 오브젝트이다. 서로 다른 역할을 수행하는 컨테이너들을 묶어 하나의 파드 단위로 관리한다. 파드에는 하나의 컨테이너만 존재할 수도 있다.

파드에 속한 컨테이너들은 모두 하나의 노드 안에서 실행된다. 이때 컨테이너들은 파드 내에서 서로 리소스를 공유한다. 하나의 파드 안에 있는 컨테이너들은 IP를 공유하며, 외부에서 이 파드에 접근할 때는 하나의 IP로 접근한다. 파드 내 컨테이너와 통신하기 위해사는 컨테이너마다 다르게 설정한 포트를 사용하여 통신 대상 컨테이너를 구별해야 한다.


서비스

서비스(Service)는 파드들을 그룹화하고 특정 파드에 접근하기 위한 정책을 정의하는 역할을 수행하는 오브젝트이다. 서비스는 여러 개 파드에 접근할 수 있는 IP 하나를 제공한다. 로드밸런서 뿐만 아니라 다양한 기능을 수행한다. 인그레스와 다르게 주로 L4 영역의 통신을 담당해서 처리한다. 서비스는 파드의 논리적인 집합과 파드 집합에 접근할 수 있는 정책을 정의하는 추상적인 개념이다. 서비스의 대상이 되는 파드 집합은 셀렉터에 의해 결정된다.

서비스는 파드들에 대한 요청 및 부하를 분산시키는 로드 밸런서 역할을 수행한다. 즉, 서비스를 사용하여 하나의 IP로 여러 개의 파드에 접근할 수 있다. 파드와 마찬가지로 서비스 또한 IP 주소를 가지고 있다. 파드와 달리 서비스의 IP 주소는 고정적이며 클러스터 내부에서 파드들의 IP는 변동 가능하다. 서비스를 사용하면 고정 IP를 통해 주소 정보가 동적으로 변하는 파드들에 고정적으로 접근 가능하다.

클러스터 내부에서 서비스에 접근하는 것이 아닌 클러스터 외부에서 서비스에 접근할 수도 있다. 서비스는 클러스터 외부에서 클러스터 내부의 파드에 접근할 수 있게 해준다.

서비스는 셀렉터를 사용하여 통신을 라우팅할 파드 집합을 선택한다. 셀렉터는 레이블 키와 값을 사용하여 트래픽을 해당 파드로 라우팅한다. 서비스가 대상으로 하는 파드 집합은 사용자가 정의한 셀렉터에 의해 결정된다. 빈 값이거나 존재하지 않을 경우 EndpointSlice나 레거시 엔드포인트와 같이 엔드포인트를 직접 관리하는 별도의 처리 과정을 따르며 쿠버네티스는 엔드포인트를 직접 수정하지 않는다. 서비스의 셀렉터는 ClusterIP, NodePort, LoadBalancer 타입에만 적용된다.


인그레스

인그레스(Ingress)는 클러스터 외부에서 내부에 있는 파드에 접근할 때 사용되는 오브젝트이다. 서비스와의 다르게 주로 L7 영역의 통신을 담당해서 처리한다. 인그레스는 클러스터 외부에서 클러스터 내부의 서비스(Service) 오브젝트로의 HTTP 및 HTTPS 경로(route)를 노출한다. 트래픽 라우팅은 인그레스에 정의된 규칙에 의해 제어된다.

인그레스는 클러스터 외부에서 내부로 접근하는 요청들을 어떻게 처리할지 정의해둔 규칙 모음이다. 클러스터 외부에서 접근해야 할 URL(도메인)을 사용할 수 있도록 하고, 트래픽 로드 밸런싱, SSL 인증서 처리, 도메인 기반 가상 호스팅을 제공한다.

인그레스 자체는 규칙들을 정의해둔 자원이고, 실제로 동작시키는 것은 인그레스 컨트롤러(Ingress Controller)이다.

클라우드 서비스를 사용하면 별다른 설정 없이 자체 로드밸런서 서비스와 연동해서 인그레스를 사용할 수 있다. 클라우드 서비스를 사용하지 않고 직접 쿠버네티스 클러스터를 구축해서 사용한다면 인그레스 컨트롤러를 직접 인그레스와 연동해야 한다.

인그레스 설정을 통해 특정 HTTP 요청을 특정 서비스의 포트로 연결할 수 있으며 동일한 도메인로의 요청이더라도 하위 경로(path)에 따라 서로 다른 서비스에 연결할 수 있다.


앱과 네임스페이스

앱(App)은 여러 컨테이너로 구성된 파드 또는 하나의 컨테이너로 구성된 파드이며 네임스페이스(namespace)는 하나의 물리적인 클러스터를 논리적으로 구분하는 역할을 수행하는 오브젝트니다. 네임스페이스는 단일 클러스터 내에서 리소스 그룹을 격리시킨다. 네임스페이스 내에서 리소스의 이름은 유일해야 하며 네임스페이스 간에서 유일할 필요는 없다. 동일한 네임스페이스 내에서 리소스를 구별하기 위해 레이블을 사용한다.

네임스페이스 적용 가능 오브젝트(네임스페이스 기반 오브젝트)에는 디플로이먼트, 서비스 등이 있으며, 클러스터 범위의 오브젝트인 스토리지클래스, 노드, 퍼시스턴트볼륨 등은 네임스페이스 적용이 불가능하다.

네임스페이스를 통해 하나의 클러스터를 여러 팀이나 사용자가 함께 공유할 수 있다. 네임스페이스에 의해 클러스터를 논리적으로 구분짓고, 구분된 클러스터를 팀이나 사용자 별로 할당한다.

클러스터 내에서 용도에 따라 파드들을 구분할 때도 네임스페이스를 사용할 수 있다. 파드의 종류에 따라 네임스페이스를 구분하고, 특정 파드들을 하나의 네임스페이스로 묶어 관리할 수 있다.


컨트롤러

  • 레플리케이션 컨트롤러 (replication controller): 지정된 수의 파드(파드 레플리카)가 항상 실행 중임을 보장하도록 파드를 유지 및 관리하는 역할을 수행하는 컨트롤러
    • 파드 또는 동일 종류의 파드의 셋이 항상 기동되고 사용 가능한지 확인한다.
    • 파드 집합의 실행을 항상 안정적으로 유지하는 역할을 수행한다.
    • 파드가 실패하거나 삭제 및 종료되는 경우 레플리케이션 컨트롤러에 의해 자동으로 교체된다.
    • 명시된 동일 파드 개수에 대한 가용성을 보증하는데 사용한다.
    • 세트-기반(set-based)의 셀렉터의 요건을 지원하지 않는다.
  • 레플리카셋 (replicaset): 레플리케이션과 동일한 역할 수행
    • 세트-기반의 셀렉터의 요건을 지원하므로 레플리카셋이 더 선호된다.
  • 디플로이먼트 (deployment): 파드와 레플리카셋에 대한 선언적 관리를 수행하는 컨트롤러
    • 디플로이먼트는 레플리카셋을 관리하고, 레플리카셋은 파드를 관리한다.
    • 디플로이먼트가 레플리카셋을 생성하면 레플리카셋이 설정한 컨테이너 이미지로 파드를 생성한다.
    • 실행 중인 디플로이먼트의 이미지를 변경하면 레플리카세트가 새롭게 생성되고, 이에 따라 파드들도 새롭게 생성된다.
  • 인그레스 컨트롤러 (ingress controller): 인그레스를 작동시키는 컨트롤러
    • 인그레스 컨트롤러를 직접 인그레스와 연동하기 위해 가장 많이 사용하는 도구는 쿠버네티스에서 제공하는 ingress-nginx이다. ingress-nginx 컨트롤러는 인그레스에 설정한 내용을 nginx 환경 설정으로 변경해서 nginx에 적용한다.
    • 이외에 HAProxy, Envoy, Kong 등 소프트웨어 프록시를 이용하는 인그레스 컨트롤러, Citrix, F5 같은 로드 밸런서 장비 회사에서 자사의 로드 밸런서를 이용할 수 있도록 만든 인그레스 컨트롤러가 있다.
    • 인그레스 컨트롤러의 네트워크 옵션을 호스트 모드로 설정하면 별도의 NodePort 타입 서비스 없이도 외부 클라이언트가 인그레스 컨트롤러에 접근할 수 있고, 다시 인그레스 컨트롤러에서 파드로 직접 접근할 수 있으므로 중간에 위치하는 서비스들을 생략해서 좀 더 좋은 성능을 낼 수 있다.


네트워킹


참고

Comments