1. 파드 개념
- 파드는 쿠버네티스가 관리하는 컨테이너 묶음
- 파드에 속한 컨테이너들은 하나의 노드 안에서 실행되고 자원을 공유함
2. 파드 사용
파드의 템플릿 설정 예시 - pod-sampel.yaml
Info Notice: 여기에서 템플릿은 오브젝트나 컨트롤러가 어떤 상태여야 하는지 젹용할 때 사용하는 yaml 파일을 의미
apiVersion: v1
kind: Pod
metadata:
name: kubernetes-simple-pod
labels:
app: kubernetes-simple-pod
spec:
containers:
- name: kubernetes-simple-pod
image: arisu1000/simple-container-app:latest
ports:
- containerPort: 8080
항목 | 설명 |
---|---|
.metadata.name | 파드 이름 |
.metadata.labels.app | 오브젝트 식별 레이블 |
.spec.containers[].name | 컨테이너 이름 설정 |
.spec.containers[].image | 컨테이너에서 사용할 이미지 |
.spec.containers[].ports[].containerPort | 컨테이너 접속용 포트 |
아래 명령으로 파드를 실행
kubectl apply -f pod-sample.yaml
3. 파드 생명 주기
파드 생성 부터 삭제까지 생명 주기는 아래 5가지로 정의
항목 | 설명 |
---|---|
Pending | 파드 생성 중 |
Running | 파드 안 컨테이너가 실행 중 |
Succeeded | 파드 안 컨테이너가 정상 종료 |
Failed | 파드 안 컨테이너 중 비정상적으로 종료되지 않는 상태 |
Unknown | 파드 상태 할 수 없음 |
파드 상태는 kubectl describe pods 파드명 실행 후 Status 항목으로 확인 가능
파드 Conditions 항목은 파드의 현재 상태 정보로 Type과 Status로 구분되어 있음
항목 | 설명 |
---|---|
Initialized | 모든 초기화 컨테이너가 성공적으로 시작 완료 |
Ready | 요청을 수행할 수 있음 |
ContainersReady | 파드 안 컨테이너가 준비상태 |
PodScheduled | 파드가 하나의 노드로 스케쥴 완료 상태 |
Unschedulable | 제약으로 당장 파드를 스케쥴 할 수 없음 |
4. kubelet으로 컨테이너 진단
컨테이너 실행 후에는 kubelet이 컨테이너를 주기적으로 진단함
Probe
컨테이너 진단에 2가지 프로브 필요
- livenessProbe: 컨테이너가 실행됐는지 확인. 진달 실패시 컨테이너 재시작
- readinessProbe: 컨테이너가 실행된 후 서비스 요청에 응답할 수 있는지 진단
Handler
컨테이너 진단은 kubelet이 컨테이너가 구현한 아래 세가지 유형의 핸들러를 호출하여 실행
- ExecAction: 컨테이너 안에 지정된 명령 수행
- TCPSocketAction: 컨테이너 안에 지정된 IP와 포트로 TCP 상태 확인
- HTTPGetAction: 컨테이너 안에 지정된 IP와 포트로 HTTP GET 요청 보냄
진단결과
진단 결과는 세 가지로 구분
- Success: 컨테이너가 진달에 성공
- Failure: 컨테이너가 진단에 실패
- Unknown: 컨테이너 상태 알 수 없음
5. 컨테이너 유형
5.1 초기화 컨테이너
- 앱 컨테이너 실행 전 파드를 초기화
- 여러개 구성 가능하고 탬플릿(yaml) 명시한 순서대로 초기화 실행
- 초기화 컨테이너는 실행 실패 시 성공할 때까지 재시작
- readinessProbe 지원하지 않음
apiVersion: v1
kind: Pod
metadata:
name: kubernetes-simple-pod
labels:
app: kubernetes-simple-pod
spec:
initContainers:
- name: init-myservice
image: arisu1000/simple-container-app:latest
command: ['sh', '-c', 'sleep 2; echo helloworld01;']
- name: init-mydb
image: arisu1000/simple-container-app:latest
command: ['sh', '-c', 'sleep 2; echo helloworld02;']
containers:
- name: kubernetes-simple-pod
image: arisu1000/simple-container-app:latest
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
5.2 파드 인프라 컨테이너
- 모든 파드에서 항상 실행되는 pause 컨테이너
- 파드 안에 기본 네트워크로 실행
- kubelet에 –pod-infra-container-image 옵션으로 지정 가능
5.3 스태틱 파드
- kube-apiserver를 통하지 않고 kubelet이 직접 실행하는 파드
- kubelet 옵션 중 –pod-manifest-path에 지정한 디렉토리에 스태딕 파드 탬플릿을 두면 kebelet이 스태틱 파드로 실행
- 스태틱 파드 예 : mac 환경에 설치된 docker-desktop에서 아래 스크립트를 통해 스태틱 파드 탬플릿 확인 가능
~# screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
[Enter 입력]
docker-desktop:~# cd /etc/kubernetes/manifests
docker-desktop:~# ls -alF
6. Pod 정보 확인
kubectl describe pods whms-pod
Name: whms-pod
Namespace: default
Priority: 0
Node: minikube/192.168.99.100
Start Time: Mon, 17 Aug 2020 06:02:37 +0000
Labels: app=whms-pod
Annotations: Status: Running
IP: 172.17.0.3
IPs:
IP: 172.17.0.3
Containers:
whms-pod:
Container ID: docker://600c885e88a717f651d3b25de5295fc96541565e102772eed8cc145f9a78c616
Image: sftth/whms:latest
Image ID: docker-pullable://sftth/whms@sha256:bf79e4c73874e98f64347251428eca9e75d4dfb378ccdf4a630d52a746dbbd30
Port: 8080/TCP
Host Port: 0/TCP
State: Running
Started: Mon, 17 Aug 2020 06:05:13 +0000
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-7qmh7 (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-7qmh7:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-7qmh7
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events: <none>
Conditions
Type
정보 | 설명 |
---|---|
Initialized | 초기화 컨테이너가 성공적으로 시작 완료 |
Ready | 요청 실행 가능, 로드배런싱 풀에 추가 필요 |
ContainerReady | 모든 컨테이너가 준비 상태 |
PodScheduled | 파드가 하나의 노드로 스케쥴을 완료 |
Unschedulable | 자원 부족, 기타 제약으로 지금 파드를 스케쥴 할 수 없음 |
Status
- True, False, Unknown 값을 출력
댓글남기기