Post

03 POD

03 POD

1. Note

1. Note

  • 파드를 어떻게 유지하고 구성할 것인지가 중요한 포인트
    • 외부적인 부분도 고민해야하지만, 파드 자체는 내부적인 부분에 집중해야할듯
    • 파드안에 컨테이너들이 있고 그중 한곳에서 AP가 동작.
    • 여러개의 컨테이너는 가능은 하지만 파드를 나눠쓰는것을 추천하고, 로깅이나 캐싱정도만 분리
    • 파드라는 개념을 조금더 관리하기 편하게 만든 디플로이
    • 외부에서 접근하기 쉽게 도와주는 서비스 객체
  • 기존에 인지하던것 보다는 더 큰 영역인듯

2. Pod

1. Pod

  • Kubernetes에서 배포할 수 있는 가장 작은 단위이자, 클러스터에서 스케줄링되는 기본적인 빌딩 블록
  • 하나의 Pod는 하나 이상의 컨테이너를 포함할 수 있으며, 이 컨테이너들은 저장소, 네트워크, 그리고 운영 체제의 일부 설정을 공유함
  • Pod 내의 컨테이너들은 항상 함께 위치하고, 함께 스케줄되며, 동일한 노드에서 함께 실행됨.

2. 특징

  • 공유 리소스
    • Pod 내의 컨테이너들은 IP 주소와 포트 번호를 공유하며,
    • 로컬로 연결된다는 개념을 사용하여 서로 통신할 수 있음
    • 볼륨을 공유하여 데이터를 교환하고 저장할 수 있음
  • 라이프사이클
    • 일반적으로 Pod는 한 번에 하나의 메인 컨테이너를 실행하는데 사용
    • Pod의 컨테이너는 함께 생성되고, 함께 종료
    • Pod가 한 개의 애플리케이션 인스턴스를 구성하는 것으로 취급되어야 함을 의미
  • 임시성 (Ephemeral nature)
    • Pod는 일시적
    • Pod는 불변이 아니며, 주로 재시작할 때는 새 IP 주소를 받게 됨
    • Pod는 스토리지와 같은 지속적인 리소스와 결합하여 사용되는 경우가 많음

3. 생명주기

1. Pod의 생성

1
2
3
# 생성 방식은 2가지
kubectl apply -f pod.yaml       # YAML 기반 생성/수정 (실무 표준)
kubectl run nginx-pod --image=nginx --port=80 # 명령어로 바로 실행

2. 확인

1
 kubectl describe pods {pod-name}

3. 파드의 상태

  • Pending
    • Pod가 생성되었지만,
    • 하나 이상의 컨테이너 이미지가 아직 클러스터 노드에 설치되지 않았거나
    • 필요한 자원 할당이 완료되지 않았을 때 이 상태
    • 컨테이너 이미지를 다운로드한 후 전체 컨테이너를 실행하는 도중이므로 시간이 조금 걸림
  • Running
    • Pod 내의 모든 컨테이너가 생성되어 최소 하나 이상이 정상적으로 동작 중인 상태
    • Pod가 네트워크와 볼륨에 접근할 수 있으며, 설정된 주소에서 Pod를 찾을 수 있음
  • Succeeded
    • Pod 내의 모든 컨테이너가 성공적으로 실행을 마치고 종료됨
    • 일반적으로 배치 작업이나 일회성 프로세스에서 이 상태를 볼 수 있음
  • Failed
    • Pod 내의 최소 하나 이상의 컨테이너가 실패하여 종료되었습니다(종료 상태 코드가 0이 아닌 경우).
    • 실패 원인은 로그를 통해 파악할 수 있음
  • Unknown
    • 어떤 이유로 클러스터의 마스터가 Pod의 상태를 알 수 없을 때 발생함
    • 보통 pod가 있는 노드와 통신할 수 없을 때

3. Yaml

1. Yaml

1. Pod yaml구조

1
2
3
4
5
6
7
8
9
10
11
apiVersion: <API 버전>   # 어떤 API를 사용할지
kind: <리소스 종류>      # 무엇을 만들지
metadata:                # 공통 메타 정보
  name: <이름>            # 필수 항목
  namespace: prod        # 네임스페이스
  labels:                # 선택 / key value형태로 사용함
    env: prod            # 환경구분
    tier: backend        # 역할구분
    app: nginx           # 서비스 구분(이 리소스는 nginx 라벨에 속함)     
spec:                    # 리소스별 상세 설정 (핵심 영역)
  ...

2. kind

1
2
3
4
5
6
7
8
# kubectl에서 Type 부분과 같은 “리소스 종류”를 가리키지만, 
# 사용되는 위치와 역할이 다르기 때문에 표현 방식이 다름

Pod         → 컨테이너 실행 (단일)
Service     → 네트워크 연결
Deployment  → 파드 관리 (자동 복구, 스케일링)
ConfigMap   → 설정값
Secret      → 비밀번호/토큰

2. mysql pod yaml 기본형

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
  labels:
    app: mysql            # Service가 이걸 기준으로 Pod 찾음
spec:
  containers:
    - name: mysql
      image: mysql:8.0
      ports:
        - containerPort: 3306      # MySQL 기본 포트
      env:
        - name: MYSQL_ROOT_PASSWORD
          value: "root1234"        # 루트 비밀번호 (필수)
      volumeMounts:
        - mountPath: /var/lib/mysql  # MySQL 데이터 저장 경로
          name: mysql-storage
  volumes:
    - name: mysql-storage
      emptyDir: {}                 # Pod 종료 시 데이터 초기화

3. SpringBoot pod yaml 기본형

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
  name: springboot-service          # 서비스 이름
spec:
  type: NodePort                   # 외부 접근 허용
  selector:
    app: springboot               # springboot-pod 연결
  ports:
    - port: 8080                  # 서비스 포트
      targetPort: 8080            # 컨테이너 포트
      nodePort: 30008             # 외부 접속 포트

4. nginx pod yaml 기본형

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1                  # 쿠버네티스 API 버전
kind: Service                  # 리소스 타입 (Service)
metadata:
  name: nginx-service          # 서비스 이름
spec:                          # service는 Container를 안만듬.
  type: NodePort               # 외부에서 접근 가능하도록 NodePort 사용
  selector:
    app: nginx                 # 이 라벨을 가진 파드와 연결됨 (nginx-pod)
  ports:
    - port: 80                 # 서비스 내부 포트
      targetPort: 80           # 파드 컨테이너 포트 (nginx 80)
      nodePort: 30007          # 외부에서 접근할 포트 (노드IP:30007)

4. 파드 관련 명령어

1. 파드조회

1
2
3
4
kubectl get pods                         # 현재 네임스페이스의 파드 목록 조회
kubectl get pods -o wide                # 노드, IP 등 상세 정보 포함 조회
kubectl get pods -A                     # 모든 네임스페이스의 파드 조회
kubectl get pods -n <namespace>         # 특정 네임스페이스의 파드 조회

2. 파드 상세 (디버깅 핵심)

1
kubectl describe pod <pod-name>         # 이벤트 포함 상세 정보 확인 (에러 원인 파악)

3. 로그 확인

1
2
3
4
kubectl logs <pod-name>                 # 기본 로그 출력
kubectl logs -f <pod-name>              # 실시간 로그 스트리밍
kubectl logs <pod-name> -c <container-name>  # 특정 컨테이너 로그 확인
kubectl logs --previous <pod-name>      # 이전 컨테이너(재시작 전) 로그 확인

4. 파드 내부 접속

1
2
3
kubectl exec -it <pod-name> -- /bin/bash  # 컨테이너 내부 bash 접속
kubectl exec -it <pod-name> -- /bin/sh    # bash 없을 경우 sh로 접속
kubectl exec -it <pod-name> -c <container-name> -- /bin/bash  # 특정 컨테이너 접속

5. 파드 생성(기본) / 삭제

1
2
3
4
kubectl apply -f pod.yaml              # YAML 정의 기반 파드 생성/적용
kubectl run test-pod --image=nginx     # 간단 테스트용 파드 생성
kubectl delete pod <pod-name>          # 파드 삭제 (컨트롤러 있으면 자동 재생성)
kubectl delete pod <pod-name> --force --grace-period=0  # 강제 즉시 삭제

6. 기타

1
2
3
4
5
6
7
8
9
10
kubectl top pod                        # CPU/메모리 사용량 확인
kubectl top pod -n <namespace>         # 특정 네임스페이스 사용량 확인

kubectl get pod <pod-name> -o yaml     # 파드 리소스 정의 전체 확인

kubectl port-forward pod/<pod-name> 8080:80  # 로컬 8080 → 파드 80 포트 연결

kubectl get pods -l app=<label>        # 특정 라벨 기준 파드 필터 조회

kubectl get pods --field-selector=status.phase=Running  # Running 상태 파드만 조회
This post is licensed under CC BY 4.0 by the author.