[기본 오브젝트] Pod

2 minute read

본문은 인프런의 대세는 쿠버네티스 [초급~중급] 강의를 정리한 글입니다.

모든 본문의 내용과 이미지의 출처는 강의자료에 있습니다.


Object - Pod

image-20210404184100432

Container

  • Pod안 에는 하나의 독립적인 서비스를 구동할 수 있는 Container들이 있다.

  • 그 Container들은 서비스가 연동될 수 있도록 Port를 가지고 있다.

  • 한 Container가 하나 이상의 포트를 가질 수는 있지만, 한 Pod 내에서 포트가 중복될 수는 없다.

  • 이 두 Container는 하나의 Host로 묶여있다고 보면된다.

    • 그래서 Container1에서 Container2로 접근할 때, localhost:8080으로 접근할 수 있다.
  • Pod가 생성될 때 고유의 IP 주소가 할당된다.

    • Kubernetes Cluster 내에서만 (Service 없이) 해당 IP를 통해서 접근할 수 있지만,

      외부에서는 해당 IP로는 접근할 수 없다.

    • 휘발성 IP 주소이다.

    • Pod에 문제가 생기면 시스템이 이를 감지해서 해당 Pod를 삭제하고 재생성 시키는데 이 때 IP주소는 변경된다.

Label 속성

  • Label은 Pod 뿐만 아니라 모든 오브젝트에 달 수 있는데, Pod에서 가장 많이 사용된다.

  • Label 사용 이유?

    • 목적에 따라 오브젝트를 분류하고, 분류된 오브젝트들만 따로 골라서 연결하기 위해서이다.
  • Label의 구성

    • Key : Value가 한 쌍이다.
    • 한 Pod에는 여러개의 Label을 달 수 있다.
  • 이미지 예시

    • (type) web, db, server가 한 쌍으로 (lo) dev 즉, 개발 서버에 존재하는 것이고,

      (type) web, db, server가 한 쌍으로 (lo) production 즉, 상용에서 돌아가는 Pod들이다.

    • 각각의 담당자는 자신이 원하는 Pod들만 골라서 접속할 수 있다.

    • 이 상황에서 웹 개발자가 웹 화면만 보고싶다면

      type이 web인 라벨이 달린 Pod들을 Service에 연결해서 이 Service 정보를 웹 개발자에게 알려주면 된다.

    • 상용 환경을 담당하는 운영자에게는

      lo에 production 라벨이 붙은 Pod들을 Service에 연결해서 이 Service 정보를 담당자에게 알려주면 된다.

  • 사용 목적에 따라 Label을 등록해놓으면 Hash 태그를 붙여서 검색 용도로 사용하듯이 원하는 Pod를 선택해서 사용할 수 있다.

  • Pod에 labels에 key : value 타입으로 라벨을 붙인다.

apiVersion: v1
kind: Pod
metadata:
  name: pod-2
  labels:
    type: web # labels에 key : value로 달 수 있다.
    lo: dev
spec:
  containers:
  - name: container
    image: kubetm/init

추후 서비스를 만들 때, selector에 해당하는 Label의 key와 value를 넣으면 해당 Label과 매칭되는 라벨이 붙어있는 Pod에 연결이 된다.

apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  selector:
    type: web # 이 라벨이 붙어있는 파드와 연결된다.
  ports:
  - port: 8080

Node Schedule

  • Pod는 결국 여러 Node들 중에 한 Node에 올라가야 한다.
    1. 직접 Node를 선택
    2. 쿠버네티스가 자동으로 Node를 지정해주는 방법

직접 Node 선택

  • Node에 Label을 달고, Pod를 만들 때, Node를 지정할 수 있다.
    • Pod 생성 yaml에 nodeSelector:항목에 Node의 Label과 매칭되는 key : value 값을 넣어주면 된다.

쿠버네티스의 스케쥴러가 판단해서 Node를 선택

  • 전체 사용가능한 자원(메모리, CPU)을 파악
  • 이미지를 예시
    • Node1 : 여러 Pod들이 들어가 있고 남은 메모리가 1GB
    • Node2 : 남은 메모리가 3.7GB
    • Pod를 생성할 때, 이 Pod에서 요구될 리소스의 사용량을 명시할 수 있다.
    • 생성한 Pod가 2GB의 메모리를 요구한다 했을 때, 쿠버네티스가 알아서 Node2로 알아서 Pod를 스케쥴링 해준다.
  • 요구될 리소스의 사용량을 명시하는 이유?
    • 만약 이를 설정하지 않으면, Pod안에 있는 앱에서 부하가 생길 때, 무한정 Node에 있는 자원을 사용하려고 할 것이다.
    • 그러면 그 Node에 있는 다른 Pod들은 자원이 없어서 다같이 죽게된다.
    • resourcesrequests: 요구되는 리소스 양, limits : 최대 허용 메모리
  • limits
    • Memory : limits 초과 시 Pod를 종료 시킴
    • Cpu : limits 초과시 request로 낮추지만, 직접 Pod를 종료시키지는 않는다.
  • Memory와 Cpu가 다르게 동작하는 이유?
    • 각 자원의 특성 때문이다.
    • Memory는 다른 영역을 침범하면 프로세스가 종료되는 치명적인 문제가 있기 때문에 바로 종료시켜 버리는 것이다.