정의: 컨테이너는 애플리케이션과 그 애플리케이션이 실행되기 위한 모든 종속성을 하나의 패키지로 묶은 것입니다. 이 패키지는 독립적인 환경에서 애플리케이션을 실행할 수 있도록 해주며, 다른 애플리케이션이나 호스트 시스템과 격리되어 실행됩니다.
역할: 컨테이너는 애플리케이션의 일관성 있는 배포와 실행을 위해 사용됩니다. 개발 환경, 테스트 환경, 프로덕션 환경에서 동일하게 실행될 수 있도록 보장합니다. 가장 널리 사용되는 컨테이너 런타임은 Docker입니다.
정의: 파드는 쿠버네티스에서 컨테이너를 실행하는 가장 작은 단위입니다. 일반적으로 하나의 파드는 하나의 컨테이너를 포함하지만, 경우에 따라 여러 개의 컨테이너를 포함할 수도 있습니다. 이러한 컨테이너들은 네트워크와 스토리지를 공유하며, 서로 매우 밀접하게 연관된 작업을 수행할 때 함께 실행됩니다.
역할: 파드는 동일한 IP 주소와 네트워크 네임스페이스를 공유합니다. 따라서 파드 내의 컨테이너들은 서로 localhost로 통신할 수 있으며, 파드 간에는 쿠버네티스 네트워크를 통해 통신합니다. 파드는 일시적인 존재로, 실패 시 쿠버네티스에 의해 다시 생성될 수 있습니다.
정의: 클러스터는 여러 대의 물리적 또는 가상 머신(노드)으로 구성된 쿠버네티스의 집합체입니다. 이 클러스터는 단일 유닛으로 작동하며, 쿠버네티스 API를 통해 관리할 수 있습니다.
역할: 클러스터는 애플리케이션을 다양한 노드에 분산시켜 실행함으로써, 높은 가용성과 확장성을 제공합니다. 클러스터는 마스터 노드와 여러 워커 노드로 구성되며, 마스터 노드는 클러스터를 관리하고, 워커 노드는 파드를 실행합니다.
정의: 노드는 쿠버네티스 클러스터를 구성하는 개별 머신입니다. 물리적 서버나 가상 머신일 수 있습니다. 노드는 마스터 노드와 워커 노드로 나뉩니다.
역할:
마스터 노드: 클러스터를 관리하는 역할을 합니다. 쿠버네티스 API 서버, 스케줄러, 컨트롤러 매니저 등이 마스터 노드에서 실행됩니다.
워커 노드: 실제로 애플리케이션 파드를 실행하는 역할을 합니다. 각 워커 노드는 컨테이너 런타임, kubelet, kube-proxy 등을 포함하고 있습니다.
정의: 쿠버네티스 컨트롤 플레인은 클러스터를 관리하고, 애플리케이션의 배포 및 스케일링을 조정하는 데 필요한 모든 쿠버네티스 컴포넌트들의 집합입니다. 컨트롤 플레인은 마스터 노드에서 실행됩니다.
구성요소:
API 서버 (kube-apiserver): 클러스터의 모든 요청을 처리하는 프론트엔드.
스케줄러 (kube-scheduler): 파드를 실행할 노드를 결정.
컨트롤러 매니저 (kube-controller-manager): 노드, 파드, 네트워크, 엔드포인트 등을 관리.
etcd: 모든 클러스터 데이터가 저장되는 분산형 키-값 데이터베이스.
정의: 네임스페이스는 하나의 쿠버네티스 클러스터 안에서 리소스를 분리하여 관리할 수 있게 해주는 논리적인 구분입니다. 클러스터 내에서 다수의 환경(예: 개발, 테스트, 프로덕션)을 격리할 수 있도록 합니다.
역할: 네임스페이스는 리소스 간의 충돌을 방지하고, 관리와 액세스 제어를 용이하게 합니다. 쿠버네티스는 기본적으로 default, kube-system, kube-public 등의 네임스페이스를 제공하지만, 필요에 따라 사용자가 커스텀 네임스페이스를 생성할 수 있습니다.
정의: 서비스는 쿠버네티스에서 파드를 네트워크를 통해 외부에 노출하는 방법입니다. 파드는 IP 주소가 동적으로 변경될 수 있기 때문에, 서비스를 통해 안정적인 네트워크 접점을 제공합니다.
역할: 서비스는 클러스터 내의 파드들이 외부 트래픽을 받을 수 있도록 하거나, 파드 간의 통신을 가능하게 해줍니다. 서비스는 여러 종류가 있으며, 대표적으로 ClusterIP(클러스터 내부에서만 접근 가능), NodePort(노드의 특정 포트로 외부 접근 가능), LoadBalancer(클라우드 제공자의 로드 밸런서를 사용하여 외부 접근 가능)가 있습니다.
레이블 (Label):
정의: 레이블은 쿠버네티스 리소스에 부착되는 키-값 쌍입니다.
역할: 리소스를 그룹화하거나 특정 리소스를 선택하기 위한 메타데이터로 사용됩니다.
셀렉터 (Selector):
정의: 셀렉터는 특정 레이블을 가진 리소스를 선택하는 방법입니다.
역할: 예를 들어, 서비스는 셀렉터를 사용하여 특정 레이블을 가진 파드를 선택하고 트래픽을 라우팅할 수 있습니다.
정의: 볼륨은 파드 내의 컨테이너들이 데이터를 저장하고 공유할 수 있는 스토리지입니다.
역할: 컨테이너가 재시작되거나 파드가 다시 생성되더라도 데이터를 유지할 수 있게 해줍니다. 다양한 볼륨 타입이 있으며, 로컬 디스크, 네트워크 스토리지, 클라우드 제공자의 스토리지 서비스 등을 사용할 수 있습니다.
컨피그맵 (ConfigMap):
정의: ConfigMap은 환경설정 데이터를 파드에 전달하기 위해 사용되는 리소스입니다.
역할: 환경 변수, 명령줄 인수, 설정 파일 등을 파드에 제공할 수 있습니다.
시크릿 (Secret):
정의: Secret은 암호화된 데이터를 저장하고 전달하기 위한 리소스입니다.
역할: 비밀번호, 토큰, SSH 키 등의 민감한 정보를 안전하게 관리할 수 있습니다.
컨테이너 런타임 인터페이스(CRI)는 클러스터 컴포넌트를 다시 컴파일하지 않아도 Kubelet이 다양한 컨테이너 런타임을 사용할 수 있도록 하는 플러그인 인터페이스다.
클러스터의 모든 노드에 동작 중인 컨테이너 런타임이 존재해야, kubelet이 파드들과 컨테이너들을 구동할 수 있다.
컨테이너 런타임 인터페이스(CRI)는 kubelet과 컨테이너 런타임 사이의 통신을 위한 주요 프로토콜이다.
쿠버네티스 컨테이너 런타임 인터페이스(CRI)는 클러스터 컴포넌트 kubelet과 container runtime 사이의 통신을 위한 주요 gRPC 프로토콜을 정의한다.
쿠버네티스 1.31 버전은 클러스터 네트워킹을 위해 컨테이너 네트워크 인터페이스(CNI) 플러그인을 지원한다. 사용 중인 클러스터와 호환되며 사용자의 요구 사항을 충족하는 CNI 플러그인을 사용해야 한다. 더 넓은 쿠버네티스 생태계에 다양한 플러그인이 (오픈소스와 클로즈드 소스로) 존재한다.
CNI 플러그인은 쿠버네티스 네트워크 모델을 구현해야 한다.
v0.4.0 이상의 CNI 스펙과 호환되는 CNI 플러그인을 사용해야 한다. 쿠버네티스 플러그인은 CNI 스펙 v1.0.0과 호환되는 플러그인의 사용을 권장한다(플러그인은 여러 스펙 버전과 호환 가능).