kubernetes started(2) pod

2020. 2. 13. 21:02devops/kubernetes

Pod

쿠버네티스에서는 컨테이너 애플리케이션의 기본 단위를 포드라고 부릅니다. 쿠버네티스에서 배포할 수 있는 가장 작고 간단한 단위입니다.  포드는 1개 이상의 컨테이너로 구성되어 있습니다. 도커에서는 기본 단위가 컨테이너 였고 스웜 모드에서는 여러 개의 컨테이너로 구성된 서비스였습니다. 쿠버네티스에서는 컨테이너 애플리케이션을 배포하기 위한 기본 단위 포드라는 개념을 사용합니다. 

 

그럼 연습삼아 nginx pod를 한번 만들어보겠습니다. 

apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
spec:
  containers:
    - name: my-nginx-container
      image: nginx:latest
      ports:
        - containerPort: 80
          protocol: TCP

위 yaml 파일을 설명

 

apiVersion: YAML 파일에서 정의한 오브젝트의 API 버전을 나타냅니다.

 

kind: 이 리소스의 종류를 나타냅니다. 현재는 pod를 생성하기 때문에 pod로 작성했습니다. 다른 오브젝트의 종류는 kubectl api-resources 명령어를 통해 확인할 수 있습니다. 

 

metadata: 라벨, 주석, 이름과 같은 리소스의 부가 정보들을 입력합니다. 

 

spec: 리소스를 생성하기 위한 자세한 정보를 입력합니다. 생성되는 container의 이름, 이미지, 포트 등을 설정할 수 있습니다. 

kubectl apply -f yaml 파일이름

그리고 생성된 pod를 확인하기 위해서는 kubectl get 오브젝트 이름으로 확인할 수 있습니다. 

pod의 정보를 확인하기 위해 describe를 통해 확인할 수 있습니다. 

kubectl describe pods my-nginx-pod
Status:       Running
IP:           10.1.0.5
Containers:
  my-nginx-container:
    Container ID:   docker://27f4d298748e4af9f4f1ad57f5075716fcc26559e529b3470a1fe5a769cfda44
    Image:          nginx:latest
    Image ID:       docker-pullable://nginx@sha256:ad5552c786f128e389a0263104ae39f3d3c7895579d45ae716f528185b36bc6f
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
 ....

 

pod도 container와 같이 kubectl exec를 통해 명령어를 실행시킬 수 있습니다. 

kubectl exec -it my-nginx-pod bash

그리고 도커와 같이 logs를 통해 kubectl logs를 통해 포드의 로그를 확인할 수 있습니다. 

kubectl logs my-nginx-pod

그리고 오브젝트는 kubectl delete -f 명령어로 삭제할 수 있습니다. 

 

컨테이너 두개 이상을 포함한 pod 만들기

 

apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
spec:
  containers:
    - name: my-nginx-container
      image: nginx:latest
      ports:
        - containerPort: 80
          protocol: TCP
    - name: sidecar
      image: ubuntu:14.04
      command: ["echo", "hello"]
      args: ["ubuntu"]

두개가 생성되었고 한개만 실행하고 있는 것을 확인할 수 있습니다. 

kubectl exec -it my-nginx-pod -c sidecar bash

-c  옵션을 통해서 어떤 컨테이너를 선택하여 접속할 것인지 확인할 수 있다. 

포드 vs 도커 컨테이너

지금까지 한것을 생각해보면 도커 컨테이너와 크게 차이가 없게 느껴진다. 그러나  쿠버네티스의 pod만의 차이점이 있으니 이에 대해 알아보자!!

 

두개 이상 생성한 예제에서 curl localhost라고 명령하면 nginx의 응답이 도착하는 것을 확인할 수 있습니다. 

root@my-nginx-pod:/# curl localhost
<!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>
root@my-nginx-pod:/#

위와 같이 작동하는 이유는 리눅스 네임스페이스를 공유하기 때문입니다. 여러 개의 리눅스 네임스페이스를 공유합니다. 포드 내분의 컨테이너들이 

 

포드를 구성할 때

쿠버네티스 환경에서 1개의 컨테이너로 구성된 포드를 사용하는 경우가 많습니다. 우리가 만들었던 포드는 nginx 하나만 존재하는 데요 이는 nginx 하나가 완전한 기능을 나타내기 때문입니다. 하지만 추가적인 기능이 필요하다면 계속해서 로그를 작성해주고 변경사항을 적용해주는 등등의 기능 이러한 기능들은 nginx 컨테이너와 함께 실행돼야합니다. 이런 경우에는 nginx를 주 컨테이너로 하되 추가 기능이 포함된 컨테이너를 포함시킬 수 있습니다. 이러한 추가기능을 나타내는 컨테이너를 사이드카라고 부르며 다른 컨테이너와 리눅스 네임스페이스를 공유합니다.

 

최종적으로 포드에 정의된 여러 개의 컨테이너는 하나의 완전한 애플리케이션으로서 동작하게 되는 것입니다.