쿠버네티스에서 관리하는 가장 작은 배포 단위.
도커(docker)의 가장 작은 배포 단위는 컨테이너이지만, 쿠버네티스는 (다른 것도 가능하지만 보통) 이 도커의 한 개 이상의 컨테이너를 포함하는 Pod라는 더 큰 배포 단위를 통해 컨테이너 상태 모니터링
, 컨테이너 메타데이터 관리
등 다양한 부가기능을 수행함.
YAML 파일에서 kind: Pod
로 표시됨.
Pod을 정해진 수만큼 복제
하고 관리하기 위한 배포 단위.
Pod는 단독으로 만들면 서버가 예상치 못한 에러로 죽어서 Pod이 사라지는 등 문제가 생겼을 때 자동으로 복구되지 않음. 따라서 Pod을 정해진 수 만큼 복제하고 그 개수를 유지하도록 ReplicaSet이라는 배포 단위로 관리함.
YAML 파일에서 kind: ReplicaSet
으로 표시됨.
ReplicaSet을 이용하여 Pod을 업데이트
하거나, 이력을 관리하여 롤백(Rollback)
하거나, 특정 버전(revision)으로 변경
하는 등의 기능을 제공하는 배포 단위. 쿠버네티스에서 가장 널리 사용됨.
다시 말해 Deployment를 이용하면 Pod을 새로운 버전으로 업데이트하거나 이전 버전으로 롤백할 때 전체 Replica 개수를 유지하며 순차적으로 버전을 변경하여 무중단 배포 등의 버전관리를 쉽게 구현해줌.
YAML 파일에서 kind: Deployment
로 표시됨.
Pod를 외부에 노출하여 클러스터 외부에서 접근
할 수 있게 하는 k8s 오브젝트.
Pod은 자체 IP를 가지고 k8s 내에서 다른 Pod와 통신할 수는 있지만, 쉽게 사라지고 생성되기 때문에 직접 통신하는 것은 권장되지 않음. 대신 별도의 고정 IP
를 가진 Service를 만들고, 그 Service를 통해 각 Pod에 접근하는 방식을 권장함.
노출 범위에 따라 ClusterIP, NodePort, LoadBalancer 타입으로 나뉨.
실전에서는 NodePort와 LoadBalancer를 제한적으로 사용함.
YAML 파일에서 kind: Service
로 표시됨.
도메인
을 이용하여 서로 다른 서비스에 접근
할 수 있도록 라우팅 기능을 제공하는 k8s 오브젝트.
하나의 클러스터에서 여러 서비스를 운영한다면, 앞 단에 Ingress 오브젝트를 두어 수많은 NodePort 서비스로 여러 포트를 오픈하는 대신 하나의 포트(80 또는 443)
, 여러 도메인
에 따른 여러 개의 서비스
를 운영할 수 있음.
YAML 파일에서 kind: Ingress
로 표시됨.
클러스터 내 자원을 각기 그룹 짓기 위한 논리적인 분리 단위
임.
예를 들면 클러스터 내에 "개발", "운영", "테스트" 등의 네임스페이스를 만들고 각 네임스페이스에 필요에 따라 하나 이상의 Pods, Services, Deployments 등을 등록하여 상황에 맞게 자원을 다르게 할당해서 관리하는 식으로 활용할 수 있음.
YAML 파일에서 kind: Namespace
로 표시됨.
metadata:
하위에 namespace: [네임스페이스명]
으로 배포 단위에 네임스페이스 지정 가능.
kubernetes는 컨테이너를 Pods에 배치시켜 Nodes에서 실행되도록 해서 사용자의 작업을 수행함. Nodes는 클러스터에 따라 가상 머신일 수도 물리 머신일 수도 있는데, 각 노드는 Control Plane에서 관리되며, Pods 실행에 필수적인 서비스들을 포함하고 있음.
k8s 작업의 실제 실행 단위라고 보면 됨.
일반적으로 클러스터엔 여러 개의 노드가 있으며, 노드 내의 컴포넌트로는 kublet, container runtime(pod들이 실행되는 곳), kube-proxy가 있다. 자세한 내용은 아래 그림 참고
위 그림은 k8s의 cluster architecture임. 하나의 클러스터는 하나의 Control Plane과 1개 이상의 Nodes를 가지며, Node의 모든 API 사용은 Control Plane의 API 서버로 감.
Control Plane은 현재 클러스터 상태를 사용자가 원하는 클러스터 상태로 끊임없이 조정해주는 컨트롤 센터임.