Kubernetes 기초 (3) - Pod

Pod 개념과 특징

Pod은 무엇일까?

Pod은 여러 컨테이너를 감싸고 있는 콩껍질과 같다

  • 노드에서 컨테이너를 실행하기 위한 가장 기본적인 배포 단위
  • 여러 노드에 1개 이상의 Pod을 분산 배포/실행 가능 (Pod Replicas)

Pod 내부

  • 쿠버네티스는 Pod을 생성할 때 노드에서 유일한 IP를 할당 (서버 분리 효과)
  • Pod 내부 컨테이너 간에 localhost로 통신 가능, 포트 충돌 주의!
  • Pod 안에서 네트워크와 볼륨 등 자원 공유

Pod IP

  • 클러스터 내부에서만 접근 가능
  • 클러스터 외부 트래픽을 받기 위해서는 Service 혹은 Ingress 오브젝트가 필요

Pod 단위 배포와 스케일 아웃

단 하나의 명령어로 원하는 수만큼 Pod 생성

kubectl scale deployment app --replicas=3

Pod과 컨테이너 설계시 고려할 점

Pod : Container = 1:1 or 1:N 결정

  1. 컨테이너들의 라이프사이클이 같은가?
    • Pod 라이프사이클 = 컨테이너들의 라이프사이클
    • 컨테이너 A가 종료되었을 때 컨테이너 B 실행이 의미가 있는지
  2. 스케일링 요구사항이 같은가?
    • 웹 서버 vs 데이터베이스, 트래픽이 많은 vs 적은
  3. 인프라 활용도가 더 높아지는 방향으로
    • 쿠버네티스가 노드 리소스 등 여러 상태를 고려하여 Pod을 스케쥴링

노드에 배포되는 과정

  1. 사용자로부터 Pod 배포 요청을 수락
  2. 요청 받은 수 만큼 Pod Relicas를 생성 (Pod desired state == current state)
  3. Pod을 배포할 적절한 노드를 선택 (nodeSelector)
  4. 이미지 다운로드를 명령, Pod 실행 준비, Pod 상태 업데이트
  5. 이미지를 다운로드하고 컨테이너를 실행

Pod 오브젝트 표현 방법

기본 속성

apiVersion:v1

Kubernetes API 버전

kind:Pod

오브젝트 타입

metadata:
	name: kube-basic    # 이름
    labels:             # 오브젝트 집합을 구할 때 사용할 이름표
    	app:kube-basic
        project:simon

오브젝트를 유일하게 식별하기 위한 정보 및 이름, 이름표

spec:               
	nodeSelector:   # Pod을 배포할 노드
    containers:     # Pod 안에서 실행할 컨테이너 목록
    - name: kube-basic
      image: kube-basic:1.0
      imagePullPolicy: "Always:
      ports:
      - containerPort: 80 # 통신에 사용할 포트
      env:                # 환경변수 목록
      - name: PROFILE     # 환경변수 이름
        value: simon      # 환경변수 값
      - name: LOG_DIRECTORY
        value: /logs/${PROFILE}
      volumneMounts:          # 컨테이너에서 사용할 Pod 볼륨 목록
      - name: html            # Pod 볼륨 이름
        mountPath: /var/html  # 마운트할 컨테이너 경로
    volumes:        # 컨테이너가  사용할 수 있는 볼륨 목록

사용자가 원하는 오브젝트의 상태

  • Pod 볼륨 라이프 사이클 = Pod 라이프 사이클
  • Container에서 볼륨 마운트 => volumeMounts 속성 사용
  • 목적에 맞는 볼륨 사용 (hostPath, gitRepo, ConfigMap, Secret, ...)

쿠버네티스에서 지원하는 볼륨 타입 docs

Pod의 한계

  1. Pod이 나도 모르는 사이에 종료가 되면?
    -> 자가 치유 능력이 없음, Pod이나 노드 이상으로 종료되면 끝
    -> 사용자가 선언한수 만큼 Pod을 유지 해주는 ReplicaSet 오브젝트 도입

  2. Pod IP는 외부에서 접근할 수 없다, 그리고 생성할 때 마다 IP가 변경
    -> 클러스터 외부에서 접근 가능한 고정적인 단일 엔드포인트 필요
    -> Pod집합을 클러스터 외부로 노출하기 위한 Service 오브젝트 도입


좋은 웹페이지 즐겨찾기