Kubernetes Object
쿠버네티스에서 오브젝트란 쿠버네티스를 구성하는 단위로, 가장 기본적인 구성단위인 기본 오브젝트(Basic Object)와 기본 오브젝트를 관리하고 추가적인 기능을 가진 컨트롤러(Controller)로 이루어져있습니다.
Object 를 때로는 Resource 나 Kind 라고 부르기도 합니다.
Resource와 Object 간의 관계는 자바에서 클래스Class와 Object(객체)의 관계와 정확히 동일 합니다. (다만 k8s 를 직접 확장하는 개발자가 아니라면 혼용해서 사용해도 문제되지는 않습니다.)
Kind 는 Manifest 파일 작성 시 대상 쿠버네티스 Resource 종류를 말합니다.
Manifest
매니페스트란, 쿠버네티스의 오브젝트를 생성하기 위한 메타 정보를 YAML이나 JSON으로 기술한 파일
기본 오브젝트(Basic Object)
쿠버네티스 시스템에서 영속성(spec / status)을 가지는 오브젝트이다. 기본 오브젝트는 쿠버네티스에 의해서 배포 및 관리되는 가장 기본적인 오브젝트로, Pod, Service, Volume, Namespace 4가지가 있습니다.
Object spec : 오브젝트를 생성할 때 리소스에 원하는 특징(의도한 상태)에 대한 설명을 제공해서 설정한다.
Object status : 쿠버네티스 시스템과 컴포넌트에 의해 제공되고 업데이트된 오브젝트의 현재 상태 를 설명한다.
컨트롤러(Controller)
기본 오브젝트만으로도 어플리케이션을 배포하고 운영할 수는 있지만 이를 좀 더 편리하게 관리하기 위해서 쿠버네티스는 컨트롤러라는 high-level 오브젝트를 제공합니다.
컨트롤러의 종류로는 ReplicationController, ReplicaSet, Deployment, StatefulSet, DaemonSet, Job, CronJob 등이 있습니다.
Resource 용도
Resource | 용도 |
Node | 컨테이너가 배치되는 서버 |
Namespace | 쿠버네티스 클러스터 안의 가상 클러스터 |
Pod | 컨테이너 집합 중 가장 작은 단위로 컨테이너의 실행 방법을 정의한다. |
ReplicaSet | 같은 스펙을 갖는 파드를 여러 개 생성하고 관리하는 역할을 한다. |
ReplicationController | 지정된 수의 레플리카가 실행 중임을 보장 (ReplicaSet을 구성하는 Deployment가 현재 권장하는 레플리케이션 설정) |
Deployment | 레플리카 세트의 리비전을 관리한다. |
Service | 파드의 집합에 접근하기 위한 경로를 정의한다. |
Ingress | 서비스를 쿠버네티스 클러스터 외부로 노출시킨다. |
ConfigMap | 설정 정보를 정의하고 파드에 전달한다. |
PersistentVolume | 파드가 사용할 스토리지 크기 및 종류를 정의 |
PersistentVolumeClaim | 퍼시스턴트 볼륨을 동적으로 확보 |
StorageClass | 퍼스시턴트 볼륨이 확보하는 스토리지의 종류를 정의 |
StatefulSet | 같은 스펙으로 모두 동일한 파드를 여러 개 생성하고 관리한다. |
Job | 상주 실행을 목적으로 하지 않는 파드를 여러 개 생성하고 정상적인 종류를 보장한다. |
CronJob | 크론 문법으로 스케줄링되는 잡 |
Secret | 인증 정보 같은 기밀 데이터를 정의한다. |
Role | 네임스페이스 안에서 조작 가능한 쿠버네티스 리소스의 규칙을 정의한다. |
RoleBinding | 쿠버네티스 리소스 사용자와 롤을 연결 짓는다. |
ClusterRole | 클러스터 전체적으로 조작 가능한 쿠버네티스 리소스의 규칙을 정의한다. |
ClusterRoleBinding | 쿠버네티스 리소스 사용자와 클러스터롤을 연결 짓는다. |
ServiceAccount | 파드가 쿠버네티스 리소스를 조작할 때 사용하는 계정 |
DaemonSet | 노드마다 파드를 하나씩 생성한다. (일부 노드로 지정할 수도 있다.) |
Kubernetes Components
Control Plane Components
컨트롤 플레인 컴포넌트는 클러스터에 관한 전반적인 결정(예를 들어, 스케줄링)을 수행하고 클러스터 이벤트(예를 들어, 디플로이먼트의 replicas 필드에 대한 요구 조건이 충족되지 않을 경우 새로운 파드를 구동시키는 것)를 감지하고 반응한다.
kube-apiserver
kube-apiserver는 쿠버네티스 API를 노출하는 쿠버네티스 컨트롤 플레인 컴포넌트이다. kube-apiserver 는 쿠버네티스 컨트롤 플레인의 front end 이다. (kubectl 지시를 받는다.)
etcd
모든 클러스터 데이터를 담는 쿠버네티스 뒷단의 저장소로 사용되는 일관성·고가용성 key value store.
kube-scheduler
노드가 배정되지 않은 새로 생성된 파드 를 감지하고, 실행할 노드를 선택하는 컨트롤 플레인 컴포넌트.
kube-controller-manager
컨트롤러 프로세스를 실행하는 컨트롤 플레인 컴포넌트.
논리적으로, 각 컨트롤러는 분리된 프로세스이지만, 복잡성을 낮추기 위해 모두 단일 바이너리로 컴파일되고 단일 프로세스 내에서 실행된다.
이들 컨트롤러는 다음을 포함한다.
- 노드 컨트롤러: 노드가 다운되었을 때 통지와 대응에 관한 책임을 가진다.
- 잡 컨트롤러: 일회성 작업을 나타내는 잡 오브젝트를 감시한 다음, 해당 작업을 완료할 때까지 동작하는 파드를 생성한다.
- 엔드포인트슬라이스 컨트롤러: (서비스와 파드 사이의 연결고리를 제공하기 위해) 엔드포인트슬라이스(EndpointSlice) 오브젝트를 채운다
- 서비스어카운트 컨트롤러: 새로운 네임스페이스에 대한 기본 서비스어카운트(ServiceAccount)를 생성한다.
Ingress Controllers
위에서 설명한 kube-controller-manager 바이너리의 일부로 실행되는 컨트롤러의 다른 타입과 달리 인그레스 컨트롤러는 클러스터와 함께 자동으로 실행되지 않는다.
인그레스(Ingress) 리소스를 작동하는데 필요한 인그레스 컨트롤러들은 서드파티 프로젝트와 관련이 있다. (예: Istio Ingress)
cloud-controller-manager
클라우드별 컨트롤 로직을 포함하는 쿠버네티스 컨트롤 플레인 컴포넌트이다. 클라우드 컨트롤러 매니저를 통해 클러스터를 클라우드 공급자의 API에 연결하고, 해당 클라우드 플랫폼과 상호 작용하는 컴포넌트와 클러스터와만 상호 작용하는 컴포넌트를 구분할 수 있게 해 준다.
cloud-controller-manager는 클라우드 제공자 전용 컨트롤러만 실행한다. 자신의 사내 또는 PC 내부의 학습 환경에서 쿠버네티스를 실행 중인 경우 클러스터에는 클라우드 컨트롤러 매니저가 없다.
kube-controller-manager와 마찬가지로 cloud-controller-manager는 논리적으로 독립적인 여러 컨트롤 루프를 단일 프로세스로 실행하는 단일 바이너리로 결합한다. 수평으로 확장(두 개 이상의 복제 실행)해서 성능을 향상시키거나 장애를 견딜 수 있다.
다음 컨트롤러들은 클라우드 제공 사업자의 의존성을 가질 수 있다.
- 노드 컨트롤러: 노드가 응답을 멈춘 후 클라우드 상에서 삭제되었는지 판별하기 위해 클라우드 제공 사업자에게 확인하는 것
- 라우트 컨트롤러: 기본 클라우드 인프라에 경로를 구성하는 것
- 서비스 컨트롤러: 클라우드 제공 사업자 로드밸런서를 생성, 업데이트 그리고 삭제하는 것
Node Components (or Data Plane Components)
노드 컴포넌트는 동작 중인 파드를 유지시키고 쿠버네티스 런타임 환경을 제공하며, 모든 노드 상에서 동작한다.
kubelet
클러스터의 각 노드에서 실행되는 에이전트. Kubelet은 파드에서 컨테이너가 확실하게 동작하도록 관리한다.
Kubelet은 다양한 메커니즘을 통해 제공된 파드 스펙(PodSpec)의 집합을 받아서 컨테이너가 해당 파드 스펙에 따라 건강하게 동작하는 것을 확실히 한다. Kubelet은 쿠버네티스를 통해 생성되지 않는 컨테이너는 관리하지 않는다.
kube-proxy
kube-proxy는 클러스터의 각 노드에서 실행되는 네트워크 프록시로, 쿠버네티스의 서비스 개념의 구현부이다.
kube-proxy는 노드의 네트워크 규칙을 유지 관리한다. 이 네트워크 규칙이 내부 네트워크 세션이나 클러스터 바깥에서 파드로 네트워크 통신을 할 수 있도록 해준다.
kube-proxy는 운영 체제에 가용한 패킷 필터링 계층이 있는 경우, 이를 사용한다. 그렇지 않으면, kube-proxy는 트래픽 자체를 포워드(forward)한다.
Container runtime
컨테이너 런타임은 컨테이너 실행을 담당하는 소프트웨어이다.
쿠버네티스는 containerd, CRI-O와 같은 컨테이너 런타임 및 모든 Kubernetes CRI (컨테이너 런타임 인터페이스) 구현체를 지원한다.
'Dev' 카테고리의 다른 글
pyenv virtualenv autoenv (2) | 2024.01.02 |
---|---|
순환 참조 (circular dependencies) (0) | 2023.08.22 |
Gitlab-flow branch 전략 (0) | 2023.08.21 |
Code Convention (0) | 2023.08.21 |
Git-Flow branch 전략 (0) | 2023.08.09 |