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.