쿠버네티스-POD-기초 개념(Container, Label, NodeSchedule)
By on November 27, 2023
Kubernetes(k8s)?
Kubernetes(K8s) 란 K8s라고도 알려진 쿠버네티스는 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링 및 관리해주는 오픈소스 시스템입니다. K8s 공식페이지에서 제공한 문구입니다. 그럼 이 K8s 의 탄생은 아래표에서 보듯이 점차 기술을 보완 해나가기 위해 발전이 되었습니다.
PM | VM | Container(Docker) | K8s |
---|---|---|---|
서버를 1대 구매 하여 사용 중에 해당 서버에 설치되어 있는 서비스는 피크타임에만 리소스를 많이 사용한다. Scale out을 하여 1대의 서버를 더 추가 하였으나 피크타임외에는 두대의 서버의 리소스가 낭비되고 있다. |
PM서버의 단점을 보완 하기 위해서 VM이 탄생 하였다. 하나의 서버의 자원을 나누어 여러개의 독립적인 VM을 생성하고 어플리케이션을 세팅한다. 하지만 VM안에 OS를 또 설치해야하고 느리고 무거운 단점이 있다. |
VM의 단점을 보완 하고자 Docker가 탄생하였다. Os가 제공하는 namespace, cgroup 을 이용하여 하나의 OS위에 컨테이너 단위로 분류를 하여 서비스를 관리할 수 있다. 서비스가 커질수록 컨테이너가 많아지게 되며 관리가 어렵다. |
Container를 관리 할 수 있도록 K8s가 탄생 하였다. Container를 Pod로 묶어 관리 할 수 있으며 여러 컨테이너를 묶어서 하나의 Pod에 넣을 수 있고 필요시 Pod를 확장 하고 관리 할 수 있도록 한다. |
물리적인 하나의 서버에서 VM 가상화 기능으로 VM 가상화 기능에서 Container 기능으로 진화 하면서 해당 Container를 오케스트레이션을 할 수 있는 K8s까지 점차적으로 발전 되어온 것입니다. K8s를 학습 하면서 기초적인 개념에 대해서 정리하려 합니다.
쿠버네티스-POD(Container, Label, NodeSchedule)
Pod란 쿠버네티스에서 관리되는 최소 단위 입니다. Pod 단위로 생성,삭제,관리 되며 Pod단위로 복구 하거나 복제 되는 단위 입니다.
하나의 Pod내에서는 여러개의 Container 가 존재 할 수 있습니다.
Container
Pod 내에서 실행 되는 어플리케이션 단위이며 Pod 내에는 다수의 Container 를 생성 하여 사용 할 수 있으며 중복 된 포트는 사용 할 수 없습니다.
해당 Pod 내의 Container 끼리는 localhost 로 호출이 가능 합니다.
예시)
apiVersion: v1
kind: Pod
metadata:
name: pod-1
spec:
containers:
- name: container1
image: test/p8000
ports:
- containerPort: 8000
- name: container2
image: test/p8080
ports:
- containerPort: 8080
Label
Pod 생성시 key:value 타입의 label 을 설정하여 Pod 관리시 해당 라벨을 이용하여 구분 하여 묶어서 관리 할 수 있습니다.
예를 들어 개발(Dev)과 운영(Prod) 을 나누어 관리 하거나 Web 서비스(type: web) 끼리만 묶어 관리 할 수 있습니다.
예시)
//Pod
//type : web , lo: dev 의 Label을 가진 Pod를 생성.
apiVersion: v1
kind: Pod
metadata:
name: pod-1
labels:
type: web //service 등등
lo: dev //prod 등등
spec:
containers:
- name: container
image: test/init
//Service
//type: web 인 Pod 를 묶어 관리 서비스로 사용함.
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
selector:
type: web
ports:
- port: 8080
Node Schedule
Pod 생성시 특정한 지정 노드에 지정 생성을 하거나 자원을 체크 하여 스케쥴러가 판단하여 자동으로 해당 노드에 생성 관리할 수 있습니다.
예시)
//Pod 생성시 특정한 노드를 선택하여 생성
//k8s-node1 에 해당 Pod 를 생성 하도록 설정됨.
apiVersion: v1
kind: Pod
metadata:
name: pod-3
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node1
containers:
- name: container
image: kubetm/init
//Pod 생성시 특정한 자원(CPU, Memory) 을 설정하여 생성
//memory 1Gi 이상 확보 되어 있는 Node 에 자동 생성됨.
apiVersion: v1
kind: Pod
metadata:
name: pod-1
spec:
containers:
- name: container
image: test/init
resources:
requests:
memory: 1Gi
limits:
memory: 1Gi
resources 를 설정 하는 경우 Memory 가 Limit 초과시 Pod 종료됨. CPU 초과 시에는 Pod가 종료 되지 않으나 속도가 느려짐.