파드(Pod)?
워크로드: 쿠버네티스에서 구동되는 애플리케이션
쿠버네티스에서 워크로드를 일련의 파드 집합 내에서 실행
Pod는 하나 이상의 컨테이너 그룹이며, 컨테이너를 실행하기 위한 오브젝트
쿠버네티스에서 관리할 수 있는 가장 작은 Workload는 Pod
즉, 쿠버네티스는 컨테이너를 직접 컨트롤하지 않고, 파드만 관리 가능
하나의 파드는 하나의 호스트에만 배치되고, 하나의 노드에 배치
파드의 생성 및 관리
명령형 커맨드로 파드 실행
$ kubectl run
$ kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server|client] [--overrides=inline-json]
[--command] -- [COMMAND] [args...] [options]
파드 상세 정보 확인
$ kubectl get pods
NAME : Pod의 이름
READY : 준비된 컨테이너의 개수/컨테이너의 총 개수
RESTARTS : 재시작 횟수
AGE : 현재를 기준으로 만들어진 시각
-o wide 옵션을 사용하면 더 상세한 정보까지 확인
$ kubectl get pods -o wide
원하는 형식으로 etcd에 저장된 로우 데이터를 확인하는 것도 가능
$ kubectl get pods -o yaml
$ kubectl get pods -o json
kubectl describe
좀 더 깔끔하게 정돈된 형태로 확인하려면
$ kubectl describe pods myweb
여기서 Events는 지정한 리소스의 lifecycle에 대한 정보
Events 정보는 kubectl describe를 통해서만 확인
쿠버네티스에서 리소스 자체에 대한 이벤트 로그로, 시간 순으로 나타남
YAML 파일로 파드 정의
명령형이랑 섞어서 사용해도 상관없다.
myweb.yaml
apiVersion: v1
kind: Pod
metadata:
name: myweb
spec:
containers:
- name: myweb
image: httpd
파드 생성
$ kubectl create -f myweb.yaml
파드 확인
$ kubectl get -f myweb.yaml
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 1 (22m ago) 4h53m
상세 정보 확인 및 이벤트 정보 확인
$ kubectl describe -f myweb.yaml
파드 삭제
$ kubectl delete -f myweb.yaml
Web Server가 메인 기능
단일 컨테이너 : 일반적인 형태
멀티 컨테이너 : 메인 애플리케이션이 존재하고, 메인 애플리케이션 기능을 확장하기 위한 컨테이너를 배치
파드는 기본적으로 파드에 속한 컨테이너에 네트워킹과 스토리지라는 두 가지 종류의 공유 리소스를 제공하고,
하나의 Pod는 네트워크와 볼륨을 공유
Pod는 네트워크를 공유하므로, Pod에는 하나의 IP만 부여
중요함
다음 yaml 파일을 통해 파드를 생성
myweb.yaml
apiVersion: v1
kind: Pod
metadata:
name: myweb
spec:
containers:
- name: myweb
image: httpd
- name: myweb2
image: httpd
$ kubectl create -f myweb.yaml
kubectl get pods로 확인해보면 2개의 컨테이너 중 1개만 준비된 상태이며,
STATUS가 CrashLoopBackoff인 것을 확인 가능함
myweb1은 정상적으로 실행되지만, myweb2 계속 Start과 Backoff 을 반복함
파드는 동일한 네트워크를 공유하므로, 포트가 겹치기 때문
Pod에 컨테이너가 한 개일 때는 컨테이너를 지정하지 않아도 되지만, 여러 개로 구성된 경우 컨테이너를 지정
-c 옵션을 통해 컨테이너를 지정 가능
Pod 포트 포워딩
파드의 포트 포워딩이 가능은 하나, 파드의 포트 포워딩은 외부로 노출시키기 위해 사용
포그라운드(foreground) 상태로 작동하며, 테스트 & 디버깅 목적으로 사용
$ kubectl port-forward TYPE/NAME [options] [LOCAL_PORT]:[REMOTE_PORT]
쿠버네티스는 외부에 노출시키기 위해 네트워크(서비스) 오브젝트를 사용
💻 실습
myweb.yaml
apiVersion: v1
kind: Pod
metadata:
name: myweb
spec:
containers:
- name: myweb
image: httpd
ports:
- containerPort: 80
protocol: TCP
$ kubectl create -f myweb.yaml
0~1023번 포트는 열려면 관리자 권한이 필요하므로 8080 포트로 진행
$ kubectl port-forward pods/myweb 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
다른 터미널 창을 열어 확인해보면 정상적으로 작동하는 것을 확인
$ curl localhost:8080
<html><body><h1>It works!</h1></body></html>
'Cloud > Kubernates' 카테고리의 다른 글
[k8s, kubernates] 레이블 (0) | 2024.07.09 |
---|---|
[k8s, kubernates] 네임스페이스 (0) | 2024.07.09 |
[k8s, kubernates] 오브젝트 (0) | 2024.07.09 |
[kubernates, k8s] 노드 (0) | 2024.07.08 |
[kubernates, k8s] 쿠버네티스 기본 개념, 구성요소 (0) | 2024.07.08 |