본문 바로가기
kubernetes

[kubernetes] 쿠버네티스(kubernetes) 팟(pod)이란?

by devjh 2021. 6. 13.
반응형

1. Pod이란

Pod 는 쿠버네티스에서 관리하는 가장 작은 배포 단위입니다.

쿠버네티스는 여러 컴퓨터에 흩뿌려져있는 컨테이너를 관리하도록 도와주는 플랫폼이지만

쿠버네티스의 가장 작은 배포단위는 컨테이너가 아닌 pod입니다.

pod안에 컨테이너(여러개가 존재할 수도 있음) 존재하는 구조입니다.

쿠버네티스의 마스터 노드에서 명령이 떨어지면 워커노드에 팟(컨테이너포함)을 생성하는게 기본 동작입니다.

2. pod 생성하기

먼저 8080포트 /에 http request를 보내면 hello world 문자열을 내려주는 백엔드 애플리케이션을 실행하는 이미지를 만들어줍니다.
저는 spring으로 만들어줬습니다.

이미지 만드는 방법을 모른다면 아래 게시글을 참고해주세요(만들지않고 제 도커허브에 있는 이미지를 pull 받아서 사용하셔도 됩니다)
https://frozenpond.tistory.com/98

 

[Docker] Dockerfile 작성법(jar파일을 실행하는 이미지 만들기)

1. Dockerfile이란 도커파일이란 도커 이미지를 만들기 위해 작성하는 파일을 말합니다. docker build 명령어를 통해 Dodkcerfile에서 작성한 내용을 바탕으로 이미지를 생성할 수 있습니다. 도커 이미지

frozenpond.tistory.com

 

pod는 보통 두가지 방법으로 만듭니다.

(1). kubectl run

kubectl run 명령어를 통해 pod를 생성할 수 있습니다.

# run 명령어를 통해 pod를 생성하고 image는 jaeho310/helloworld:1 을 사용합니다. 
$ kubectl run mypod --image=jaeho310/helloworld:1 
pod/mypod created

 

(2). yaml파일로 상세스펙을 정의하여 생성

apiVersion: v1 
kind: Pod 
metadata: 
  name: mypod 
spec: 
  containers: 
  - name: mypod 
    image: jaeho310/helloworld:1 
    ports: 
    - containerPort: 8080 
      protocol: TCP

쿠버네티스의 yaml파일은 크게 apiVersion, kind, metadata, spec으로 구성됩니다.
다음과 같이 yaml파일을 생성하고 kubectl apply 명령어를 사용하여 쿠버네티스에 적용합니다.

$ kubectl apply -f mypod.yaml

이제 쿠버네티스로 연결된 여러 컴퓨터중 한군데에는 팟(컨테이너)가 올라가게 됩니다.

 

- 번외

위처럼 yaml파일을 작성해도 되지만 아래와같은 명령어를 작성하여 생성하기전 yaml파일을 뽑아낸후 작성할 수도 있으며

$ kubectl run mypod --image=jaeho310/helloworld:1 --dry-run=client > mypod.yaml

 

 

처음 만드는것이 아니며 수정이 아래와같은 명령어로 yaml파일을 뽑아내 수정후 다시 apply 하거나 edit 명령어로 수정이 가능합니다.

$ kubectl get pod mypod -o yaml > mypod.yaml
$ kubectl edit pod mypod

 

3. pod 확인하기

(1). pod 생성 확인하기

# pod의 생성 및 상태를 확인합니다. 
$ kubectl get pod 
NAME READY STATUS RESTARTS AGE 
pod/mypod 1/1 Running 0 57m

쿠버네티스 cli 클라이언트인 kubectl을 가장 대표하는 명령어는 kubectl get {resource} 입니다.

해당 명령어를 통해 pod 같은 리소스를 확인할 수 있습니다.

pod이 정상적으로 올라왔는지 확인할때는 $ kubectl get pod를 입력해줍니다

 

(2) describe 명령어를 사용해 pod의 상세내역을 확인하기

describe 명령어를 사용해 pod의 상세내역을 확인할 수 있습니다.

# pod의 상태를 자세히 봅니다. 
$ kubectl describe pod mypod 
# 보통 아래쪽의 이벤트를 확인합니다. 
$ kubectl describe pod mypod
Name:         mypod
Namespace:    default
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Sat, 19 Jun 2021 23:18:27 +0900
Labels:       run=mypod
Annotations:  <none>
Status:       Running
IP:           172.17.0.3
IPs:
  IP:  172.17.0.3
Containers:
  mypod:
    Container ID:   docker://7db35f18b7d4f298e82c215a83745e22ebbbc784662424b04496a6da03b0ec6f
    Image:          jaeho310/helloworld:1
    Image ID:       docker-pullable://jaeho310/helloworld@sha256:c227f6acd0b6ec6e0329f484eeb4725bf8263fa6e6d0edb0d4412a026e414dfc
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Sat, 19 Jun 2021 23:18:28 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-g89bx (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  default-token-g89bx:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-g89bx
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  17s   default-scheduler  Successfully assigned default/mypod to minikube
  Normal  Pulled     16s   kubelet            Container image "jaeho310/helloworld:1" already present on machine
  Normal  Created    16s   kubelet            Created container mypod
  Normal  Started    16s   kubelet            Started container mypod

 

(3) 쿠버네티스 클러스터의 이벤트로그로 확인하기

pod을 여러개 생성한경우 get event 명령어로 전체 pod를 확인할 수 있습니다.

# kubectl get event를 입력해 확인하기도 합니다. 
$ kubectl get event 
$ kubectl get event
LAST SEEN   TYPE     REASON                    OBJECT          MESSAGE
106s        Normal   Starting                  node/minikube   Starting kubelet.
106s        Normal   NodeHasSufficientMemory   node/minikube   Node minikube status is now: NodeHasSufficientMemory
106s        Normal   NodeHasNoDiskPressure     node/minikube   Node minikube status is now: NodeHasNoDiskPressure
106s        Normal   NodeHasSufficientPID      node/minikube   Node minikube status is now: NodeHasSufficientPID
106s        Normal   NodeAllocatableEnforced   node/minikube   Updated Node Allocatable limit across pods
93s         Normal   Starting                  node/minikube   Starting kube-proxy.
82s         Normal   RegisteredNode            node/minikube   Node minikube event: Registered Node minikube in Controller
5d22h       Normal   Killing                   pod/mypod       Stopping container mypod
48s         Normal   Scheduled                 pod/mypod       Successfully assigned default/mypod to minikube
47s         Normal   Pulled                    pod/mypod       Container image "jaeho310/helloworld:1" already present on machine
47s         Normal   Created                   pod/mypod       Created container mypod
47s         Normal   Started                   pod/mypod       Started container mypod

 

(4) pod 컨테이너의 애플리케이션 로그 확인하기

kubectl logs 명령어를 통해 확인합니다.

해당 로그는 스프링 애플리케이션이 시작될때 뜨는 로그입니다.

$ kubectl logs mypod

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.5.1)

2021-06-19 14:18:30.970  INFO 1 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication v0.0.1-SNAPSHOT using Java 11.0.1 on mypod with PID 1 (/app.jar started by root in /)
2021-06-19 14:18:30.973  INFO 1 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to default profiles: default
2021-06-19 14:18:32.911  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2021-06-19 14:18:32.932  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-06-19 14:18:32.933  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.46]
2021-06-19 14:18:33.031  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-06-19 14:18:33.031  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1959 ms
2021-06-19 14:18:34.035  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2021-06-19 14:18:34.050  INFO 1 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 4.02 seconds (JVM running for 5.485)

 

(5) pod 컨테이너에 직접 접근해 curl 명령어로 확인하기

# pod의 컨테이너에 접근합니다. 
$ kubectl exec mypod -it -- sh 
# pod에 접근했다면 curl 명령어로 웹 애플리케이션이 동작하는지 확인합니다. 
$ curl get -x 127.0.0.1:8080 
# response로 hello world 를 내려주는것을 확인합니다.

8080포트 "/" 에 hello world를 내려주도록 했으므로 실험해봅니다.

쿠버네티스 service라는 리소스를 공부하기 이전이므로 브라우저에서는 접근할 수 없습니다.

pod안에 접속해 http request를 보내 확인합니다.

4. pod를 삭제하기

# 이름으로 삭제합니다. 
$ kubectl delete pod mypod 
# 연습용 pod를 많이 생성했다면 모두 삭제합니다. 
# 네임스페이스를 지정한적이 없으므로 모든 resource는 default 네임스페이스에 올라갑니다.
# default 네임스페이스에 있는 모든 pod을 삭제할 수도 있습니다. 
$ kubectl delete pod --all -n default

$ kubectl delete {resource} 명령어를 사용해서 쿠버네티스 리소스를 삭제할 수 있습니다.

삭제할때는-A --all 등을 사용해서 한번에 삭제할 수 있으나,

all이 어떤 부분을 의미하는지 정확하게 확인한 상태가 아니면 운영쪽에서는 사용을 안하는게 좋습니다.

 

5. 마치며

쿠버네티스에서 pod이 가장 유명하지만 사실 pod을 단독으로는 잘 사용하지 않습니다.

생성, 복제, 관리를 대신 해주는 replicaset이라는걸 사용합니다.

다음게시글에서는 replicaset을 정리해보겠습니다.

반응형

댓글