Pod란?
- Docker에서 최소 배포 단위가 컨테이너라면, k8s에서는 최소 배포 단위가 Pod 다.
- Pod는 1개 이상의 컨테이너를 가질 수 있으며 다음과 같은 특징을 지닌다.
- k8s에서는 일반적으로 1개의 Pod에 1개의 컨테이너를 포함시킨 후 컨테이너 대신 Pod를 관리하지만, 컨테이너간 밀접하게 연결되어있고 리소스를 공유해야 한다면 1개의 Pod안에 2개이상의 컨테이너를 포함시켜 캡슐화한다.
- Pod는 1개이상의 컨테이너가 하나의 완전한 애플리케이션으로 동작하도록 추상화 한다.(같은 Pod 내의 컨테이너들은 네트워크 인터페이스를 같이 공유한다.)
Pod 오브젝트 yaml 파일 정의 및 생성
# nginx-pod.yaml
apiVersion: v1 # yaml 구문 분석 버전을 나타냄
kind: Pod
metadata:
name: nginx-pod # Pod의 이름을 설정
spec:
containers:
- image: nginx:1.14.2 # Pod에 포함시킬 컨테이너 설정
name: nginx # 컨테이너의 이름을 설정
ports:
- containerPort: 8081 # 컨테이너가 바인딩할 port 번호를 지정하며, 이 port는 Pod IP와 함께 사용할 수 있다.
# 추가적인 내용은 https://docs.openshift.com/container-platform/3.5/architecture/core_concepts/pods_and_services.html 여기를 참조.
kubectl apply -f nginx-pod.yaml
Nginx Pod에 요청 날려보기
kubectl get pods -o wide
# 정상적으로 동작중인것을 확인할 수 있고,
# Pod IP는 172.16.154.186로 할당됐으며
# nginx-pod.yaml 내 containerPort 값을 80으로 설정했으니
172.16.154.186:80 or 172.16.154.184 로 요청을 날려보자.
# NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
# nginx-pod 1/1 Running 0 20m 172.16.154.186 k8s-worker-1.novalocal <none> <none>
# woker node에 생성된 Pod는 k8s 클러스터 외부로 부터 접근이 불가능하니 master node 내에서 요청을 날려본다.
curl --request GET http://172.16.154.186
아래와 같이 응답을 정상적으로 받을 수 있다.
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Pod 생성 상태 확인
# 파드 상태를 확인한다. -w 를 추가로 붙이면 실시간으로 모니터링할 수 있다.
kubectl get -f nginx-pod.yaml
# NAME READY STATUS RESTARTS AGE
# nginx-pod 1/1 Running 0 12m
# NAME : pod이름 목록이며 기본적으로 (deployment-name + random-string) 형식을 이룬다. (random-string은 pod-template-hash를 시드로 사용한다.)
# READY : 사용 가능한 pod 내 컨테이너 개수를 표시한다. 사용가능 컨테이너 수 / 의도한 pod 내 컨테이너수
# STATUS : Pod 상태를 표시
# RESTARTS : Pod가 restart 된 횟수
# AGE : Pod가 실행된 시간을 표시한다.
# 더 자세히 확인한다.
kubectl describe -f nginx-pod.yaml
# 내용이 많아서 Events 부분만 간단히 보면 다음과 같이 nginx 이미지를 도커허브에서 pull하고 컨테이너로 실행하여 Pod가 잘 생성된것을 확인할 수 있다.
# Events:
# Type Reason Age From Message
# ---- ------ ---- ---- -------
# Normal Scheduled 12m default-scheduler Successfully assigned default/nginx-pod to k8s-worker-1.novalocal
# Normal Pulling 12m kubelet, k8s-worker-1.novalocal Pulling image "nginx:1.14.2"
# Normal Pulled 11m kubelet, k8s-worker-1.novalocal Successfully pulled image "nginx:1.14.2"
# Normal Created 11m kubelet, k8s-worker-1.novalocal Created container nginx
# Normal Started 11m kubelet, k8s-worker-1.novalocal Started container nginx
Pod 내 컨테이너 로그 확인
kubectl logs nginx-pod -c nginx
# 방금 curl을 날렸던 로그를 확인할 수 있다.
172.16.41.0 - - [02/Oct/2021:10:32:40 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
Pod의 리소스 공유와 통신
Pod는 Pod에 속한 컨테이너간 데이터 공유와 통신을 지원한다.
- Pod Storage
- Pod Networking
- Pod에 속한 컨테이너간에는 localhost로 통신할 수 있다.
- https://kubernetes.io/ko/docs/concepts/cluster-administration/networking/ 참조
Pod의 LifeCycle & 컨테이너 상태
Pod 의 Phase는 Pod LifeCycle 중 어느 단계에 해당하는지 나타낸다.
Phase | 설명 |
Pending | Pod를 아직 실행할 준비가 되지 않은 상태를 뜻함, 컨테이너 이미지 다운로드 시간도 포함됨. |
Running | 모든 컨테이너가 실행전 생성을 마치고 , 적어도 하나의 컨테이너가 실행중이거나, 시작 또는 재시작 중에 있을 경우의 상태를 뜻함. |
Succeeded | Pod에 있는 모든 컨테이너들이 성공적으로 종료된상태를 뜻함. 재시작되지는 않음. |
Failed | Pod에 있는 모든 컨테이너들이 종료됐지만 적어도 하나 이상의 컨테이너가 실패로 종료될경우의 상태를 뜻함. |
Unknown | 어떤 이유에 의해서 Pod의 상태를 얻을 수 없는 상태를 뜻함. Ex) Pod와 노드간 통신오류, Pod 삭제가 정상적으로 이루어지지 않은경우 |
Pod의 단계뿐만 아니라 파드 내부의 각 컨테이너 상태를 확인할 수 있다.
Container Status | 설명 |
Running | 컨테이너가 문제없이 실행되고 있음을 나타낸다. |
Terminated | 컨테이너가 실행 이후 완료(종료?) 됐거나 어떠한 이유로 실패했기 때문에 뜨는 상태다. 정확한 이유도 kubectl 를 통해 확인이 가능하다. |
Waiting | 컨테이너가 시작을 완료하는 데 필요한 작업(예를 들어, 컨테이너 이미지 레지스트리에서 컨테이너 이미지 가져오거나, 시크릿(Secret) 데이터를 적용하는 작업)을 계속 실행하고 있는 중이다. |
Pod의 Phase와 Pod 내의 컨테이너 상태를 확인하고 싶다면 아래의 커맨드를 입력해보면된다.
kubectl describe pod nginx-pod
Name: nginx-pod
Namespace: default
Priority: 0
Node: k8s-worker-1.novalocal/192.168.0.12
Start Time: Sat, 02 Oct 2021 20:57:48 +0900
Labels: <none>
Annotations: cni.projectcalico.org/podIP: 172.16.154.187/32
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"nginx-pod","namespace":"default"},"spec":{"containers":[{"image":"ngi...
Status: Pending
IP:
Containers:
nginx:
Container ID:
Image: nginx:1.14.2
Image ID:
Port: 80/TCP
Host Port: 0/TCP
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-9bxv2 (ro)
...
위의 내용은 Pod 생성 커맨드를 입력한 직후에 describe 커맨드를 입력한 내용이다.
Status 는 Pod의 Phase이며 아직 Pending 중인것으로 확인되고
Containers.nginx.State 는 nginx 컨테이너 상태이며 Waiting 상태인것으로 확인된다.
참고
https://kubernetes.io/ko/docs/home/
'☸ Kubernetes' 카테고리의 다른 글
[K8S] 2.Replica Set & Deployment (0) | 2021.10.03 |
---|