본문 바로가기
Infra/Kubernetes

[Kubernetes] Pod - Container, Label, NodeSchedule

by 진꿈청 2024. 8. 12.

Kubernetes

 

 

 

Pod

`Pod` 안에는 하나의 독립적인 서비스를 구동할 수 있는 `컨테이너`들이 존재한다.

해당 `컨테이너`는 서비스가 연결될 수 있도록 포트를 가지고 있는데,

 

한 `컨테이너`가 포트를 여러 개는 가질 수 있지만, 한 `Pod`내에서 포트가 중복될 순 없다.

 

한 `Pod` 내에서 컨테이너는 `localhost:{해당 컨테이너 포트}`으로 접근할 수 있다.

 

 

그리고 `Pod`는 생성이 될 때 고유의 IP 주소가 할당이 된다.

하지만, 이는 `Kubernetes Cluster` 내부에서만 접속이 가능하고, 외부에서는 접속이 불가능하다.

 

또한, 만약 `Pod`에 문제가 생기면 시스템이 이걸 감지해서 `Pod`를 삭제하고 다시 재성성한다.

이때, 고유의 IP 주소는 변경이 된다.

 

즉, 휘발성이 있는 특징을 가진 IP라고 할 수 있다.

 

 

Pod 생성 예시

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
spec:
  containers:
  - name: container1
    image: kubetm/p8000
    ports:
    - containerPort: 8000
  - name: container2
    image: kubetm/p8080
    ports:
    - containerPort: 8080
  • metadata:
    • name: pod - 1
    • 네임은 pod-1이다.
  • spec
    • containers:
      • 컨테이너1과 컨테이너2를 생성한다.
    • containerPort:
      • 컨테이너 생성시 사용할 포트번호를 설정한다.

 

 

Label

라벨은 `Pod` 뿐만 아니라 모든 오브젝트에 적용할 수 있지만, `Pod`에서 가장 많이 사용이 된다.

 

라벨을 사용하는 이유는 목적에 따라 오브젝트들을 분류를 하고,

분류된 오브젝트들만 따로 골라 연결을 하기 위해서이다.

 

라벨의 구성은 Key와 Value가 한 쌍이다.

또한, 한 `Pod`에 여러 개의 라벨을 달 수 있다.

 

대세는 쿠버네티스 강의 사진

 

위의 그림을 살펴보면 type: web을 라벨을 갖는 `Pod`만을 뽑아서 추후 설명할 `Service`와 연결한 뒤

서비스 정보를 웹 개발자에게 알려줄 수 있을 것이다.

 

또한, lo:production을 갖는 `Pod`만을 뽑아 운영자에게 줄 수도 있을 것이다.

그렇게 되면 담당자는 자신이 원하는 파드들만 골라서 접속을 할 수 있다.

 

이렇게 사용 목적에 맞게 라벨을 잘 달아 놓으면 우리는 해시태그처럼

원하는 `Pod`를 쉽게 선택을 해서 사용할 수 있다.

 

 

Label 활용 코드

 

Pod 생성

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  labels:
    type: web
    lo: dev
spec:
  containers:
  - name: container
    image: kubetm/init

 

type: web 이라는 라벨을 갖는 파드를 생성한다.

 

apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  selector:
    type: web
  ports:
  - port: 8080

 

type: web 라벨을 갖는 `Pod`와 `Service`를 연결한다.

 

 

이런식으로, Label를 활용해서 쉽게 쿠버네티스 컴포넌트 간의 연결이 가능하다.

 

 

Node Schedule

`Pod`는 결국 여러 노드들 중에 한 노드에 올라가야 한다.

이때, 쿠버네티스에서 노드를 지정하는 방식은 두 가지가 존재한다.

 

  1.  `Pod` 생성시 직접 노드를 선택하는 방법
  2. 쿠버네티스가 자동으로 지정해주는 방법

 각각에 관해 알아보자.

 

 

`Pod` 생성시 직접 노드를 선택하는 방법

apiVersion: v1
kind: Pod
metadata:
  name: pod-3
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node1
  containers:
  - name: container
    image: kubetm/init

 

nodeSelector 항목에 `node`의 라벨과 매칭되는 Key Value를 넣으면 된다.

 

 

쿠버네티스가 자동으로 지정해주는 방법

apiVersion: v1
kind: Pod
metadata:
  name: pod-4
spec:
  containers:
  - name: container
    image: kubetm/init
    resources:
      requests:
        memory: 2Gi
      limits:
        memory: 3Gi
  • requests:
    • `Pod`를 만들 때 사용될 리소스는 메모리 2기가이다.
  • limits:
    • 최대 허용 메모리는 3기가로 한다.
    • `리밋`의 옵션(?)
      • 자원의 성격에 따라 `Kubernetes`에서는 다르게 판단을 한다. 
      • Memory: 초과시 Pod를 그냥 종료 시킴
      • Cpu: 초과시 request로 낮출 뿐, `Pod`를 종료시키진 않는다.
      • 예시
        • 우리가 파일을 복사할 때 하나를 추가로 복사하면 첫번째 파일이 좀 늦어지면서,
          두번째 파일이 복사되는 것을 생각하면 된다. 
  • 사용량을 넣는 큰 이유
    • 사용량을 설정하지 않으면 `Pod` 안에 있는 앱에서 부하가 생길 때,
    • 무한정 `node`에 있는 자원을 사용하려 하여 해당 `node`에 있는 다른 파드들도 자원이 없어 죽게 된다.

 

Node Schedule 간단 정리

 

우선, `node`도 서버이므로, 전체 사용 가능한 자원량이 존재한다.

 

자원량에는 메모리와 CPU가 대표적인데 일단 메모리로 예로 들면,

`노드1`에는 남은 메모리가 1기가이고 `노드2`에는 남은 메모리가 3.7기가라고 하자.

 

이때, 한 `Pod`가 위의 코드처럼 2기가의 메모리를 요구한다고 했을 때,

`Kubernetes`가 해당 `Pod`를 적절히 스케줄링을 해줘야 한다.  

 

그때, 사용하는 것이 Node Schedule 방법이다.

 

 

실습

 

 

Pod 실습

 

 

 

`Pod`가 정상적으로 생성이 되었고 사진에 보이는 IP는 같은 클러스터 내에서만 접근할 수 있는 IP 이다.

 

 

실제 `Container`와 통신

 

클러스터IP를 통해 `Container`와 통신해본다.

 

 

 

 

이런식으로, `Pod`에 직접 접근해서 localhost로 접근할 수도  있다.

 

 

Label 실습

 

pod-2 생성

apiVersion: v1
kind: Pod
metadata:
  name: pod-2
  labels:
    type: web
    lo: dev
spec:
  containers:
  - name: container
    image: kubetm/init

 

pod-3 생성

apiVersion: v1
kind: Pod
metadata:
  name: pod-3
  labels:
    type: web
    lo: dev
spec:
  containers:
  - name: container
    image: kubetm/init

 

해당 Label을 선택하는 `Service` 생성

apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  selector:
    type: web
  ports:
  - port: 8080

 

type: web 지정하여 해당 Label을 갖는 위 `Pod`와 연결한다.

 

 

 

실제로, `Service`에 `Pod`가 잘 연동되어있는 것을 확인할 수 있다.