[쿠버네티스] 4. 파드
- 클라우드 & 인프라/쿠버네티스
- 2020. 6. 7.
파드
파드는 컨테이너 그룹이며 쿠버네티스의 기본 빌딩 블록이다.
컨테이너를 개별적으로 배포하기보다는 컨테이너를 가진 파드를 배포하고 운영한다.
일반적으로 파드는 하나의 컨테이너만 포함한다. 또 모든 컨테이너는 항상 하나의 워커 노드에서 실행되며 여러 워커노드에 걸쳐 실행되지 않는다.
파드가 필요한 이유
여러 프로세스를 다중 컨테이너로 실행해야 하는 이유
- 컨테이너는 단일 프로세스를 실행하는 것을 목적으로 설계했다.(프로세스가 자기 자신의 자식 프로세스를 생성하는 것을 제외)
- 모든 프로세스는 동일한 표준 출력으로 로그를 기록해야 함 -> 어떤 프로세스가 남긴 로그인지 파악하는 것이 중요
- 각 프로세스를 자체의 개별 컨테이너로 실행해야함
위와 같은 이유로 모든 프로세스는 개별 컨테이너에서 실행하는 것이 더 좋다.
따라서 여러 프로세스를 단일 컨테이너로 묶지 않기 때문에 컨테이너를 함께 묶고 하나의 단위로 관리 할 수 있는 또 다른 상위 구조가 필요하다.
파드를 사용해서 밀접하게 연관된 프로세스를 함께 실행하는 것처럼 동일한 환경을 제공하면서 이들을 격리된 상태로 유지 할 수 있다.
깉은 파드에서 컨테이너간의 분리
- 한 파드 안에서 컨테이너가 특정한 리소스를 공유하기 위한 방법
- 쿠버네티스는 파드 안에 있는 모든 컨테이너가 자체 네임스페이스가 아닌 동일한 리눅스 네임스페이스를 공유하도록 도커를 설정
- 파드 안의 컨테이너가 동일한 네트워크 네임스페이스에서 실행 되기 때문에, 동일한 IP주소와 포트 공간을 공유한다. -> 즉 같은 포트 번호를 사용하지 않도록 주의 해야함
파드간 플랫 네트워크
쿠버네티스 클러스터의 모든 파드는 하나의 플랫 공유 네트워크 주소 공간에 상주한다. 즉 모든 파드는 다른 파드의 IP 주소를 사용해 접근 가능하다.
둘 사이에 어떠한 NAT도 존재하지 않는다.
파드안에 있는 모든 컨테이너는 동일한 루프백 네트워크 인터페이스를 갖기 때문에 컨테이너들이 로컬호스트를 통해 서로 통신 할 수 있다.
파드를 정의하는 주요 부분
kubectl get po {podName} -o yaml
실행중인 파드는 위 명령어를 통해 파드를 구성하는 내용을 yaml로 확인할 수 있다.
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2020-05-31T06:15:16Z"
labels:
run: kubia
managedFields:
- apiVersion: v1
.
.
spec:
containers:
- image: ohu6698/kubia
imagePullPolicy: Always
name: kubia
ports:
- containerPort: 8080
protocol: TCP
resources: {}
.
.
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2020-05-31T06:15:16Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2020-06-01T13:04:48Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2020-06-01T13:04:48Z"
status: "True"
type: ContainersReady
.
.
.
hostIP: 192.168.64.2
phase: Running
podIP: 172.17.0.3
podIPs:
- ip: 172.17.0.3
qosClass: BestEffort
startTime: "2020-05-31T06:15:16Z"
위와 마찬가지로 파드는 크게 3가지 부분으로 나뉜다.
- Metadata : 이름. 네임스페이스, 레이블 및 파드에 관한 기타 정보를 포함
- Spec : 파드 컨테이너, 볼륨, 기타 데이터 등 파드 자체에 관한 실제 명세
- Status : 파드 상태, 각 컨테이너 설명과 상태, 파드 내부 IP, 기타 기본 정보 등 현재 실행 중인 파드에 관한 현재 정보
status 부분에는 특정 시간의 리소스 상태, 런타임 데이터 포함
새 파드를 만들때 status 부분은 작성 할 필요없다.
참고
kubectl explain pods
위 명령어를 이용하면 파드 속성에 관한 설명을 볼수 있다.
YAML 파일로 파드 정의하기
YAML 파일에 파드 속성을 정의하고 파드를 생성할 수 도 있다.
apiVersion: v1
kind: Pod
metadata:
name: kubia-manual
spec:
containers:
- image: luksa/kubia
name: kubia3
ports:
- containerPort: 8080
protocol: TCP
kubectl create -f kubia-manual.yaml
위 명령어로 해당 파일을 파드로 생성하고 kubectl get pods 명령어로 생성된 파드를 볼 수 있다.
파드 로그 가져오기
kubectl logs kubia-manual
위 명령어로 파드의 로그를 가져올수 있다.
정확히 말하면 컨테이너의 로그이다.
Q1.만약 한 파드안에 다중 컨테이너가 존재한다면?
kubectl logs kubia-manual -c
으로 해당 컨테이너 명으로 된 프로세스의 로그만 가져온다.
컨테이너 이름은 앞서 정의한 yaml에서 spec.name을 말한다.
Q2.로그는 파드가 지워지면 같이 지워진다 안지워 지게 하려면?
파드가 삭제되면 로그도 삭제되기 때문에 모든 로그를 따로 저장해야함
파드에 요청 보내기
서비스를 거치지 않고 로컬 네트워크 포트를 파드의 포드로 포워딩하여 요청을 보낼수 있다.
kubectl port-forwad kubia-manual 8888:8080
Forwarding from 127.0.0.1:8888 -> 8080
Forwarding from [::1]:8888 -> 8080
포트 포워딩 프로세스를 실행하면 아래와 같은 간략한 과정을 거친다.
(몇몇 과정이 생략)
'클라우드 & 인프라 > 쿠버네티스' 카테고리의 다른 글
[쿠버네티스] 6. 레플리케이션 및 파드 컨테이너 관리 (0) | 2020.06.07 |
---|---|
[쿠버네티스] 5. 레이블을 이용한 파드 관리 (0) | 2020.06.07 |
[쿠버네티스] 3. 쿠버네티스 클러스터 환경 구성. (0) | 2020.06.07 |
[쿠버네티스] 1. 개념 정리 (0) | 2020.06.07 |
[쿠버네티스] 2. 도커 설치 및 실행 환경 구성 (0) | 2020.06.07 |