쿠버네티스-POD-기초 개념(Container, Label, NodeSchedule)


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가 종료 되지 않으나 속도가 느려짐.

Back to blog