Type Here to Get Search Results !

쿠버네티스:Kubernetes에서 파드:Pod와 디플로이먼트:Deployment 실행 테스트 하기

쿠버네티스를 사용하여 Pod를 생성하고 서비스하는 방법은 다양하게 있습니다. 

그 중에서 이 글에서는 Pod를 직접 생성하는 법과 Deployment를 통해 생성하는 방법을 알아보도록 하겠습니다. 



  • Pod 개념 및 테스트
  • Deployment 개념 및 테스트 
이 글에서는 nginx docker 이미지로 테스트 합니다. 해당 이미지는 docker hub에서 자동으로 다운받게 됩니다. 





이 글은 Pod와 Deployment 실행만 테스트하며 설치 등은 다루지 않습니다. 

Pod 실행하기


Kubernetes에서 Pod는 컨테이너를 실행할 수 있는 배포 가능한 가장 작은 단위입니다. 하나 이상의 컨테이너에 대한 논리적 호스트이며 클러스터에서 실행 중인 프로세스의 단일 인스턴스를 나타냅니다.

파드(Pod)는 동일한 네트워크 네임스페이스, 마운트 네임스페이스 및 IPC 네임스페이스를 공유하는 하나 이상의 컨테이너를 포함할 수 있습니다. 이는 Pod의 컨테이너가 'localhost'를 사용하여 서로 통신하고 동일한 파일 시스템을 공유하며 동일한 프로세스 간 통신 메커니즘에 액세스할 수 있음을 의미합니다.

각 Pod에는 Kubernetes에서 할당하는 클러스터 내 고유한 IP 주소가 있습니다. 이 IP 주소는 Pod에서 실행 중인 컨테이너와 통신하는 데 사용됩니다.

파드(Pod)는 일시적으로 설계되어 필요에 따라 동적으로 생성 및 소멸될 수 있습니다. 파드(Pod)가 생성되면 Kubernetes는 이를 클러스터의 물리적 또는 가상 머신인 노드에 할당합니다. 노드는 Docker와 같은 컨테이너 런타임을 실행하고 파드(Pod)에서 컨테이너 실행을 담당합니다.

Kubernetes는 ReplicaSets, Deployments 및 StatefulSets를 포함하여 파드(Pod) 관리를 위한 여러 메커니즘을 제공합니다. 이러한 상위 수준의 추상화를 통해 애플리케이션의 원하는 상태를 정의하고 Kubernetes가 해당 상태를 충족하도록 파드(Pod) 생성 및 확장을 관리하도록 할 수 있습니다.

전반적으로 파드(Pod)는 클러스터에서 컨테이너화된 애플리케이션을 관리하는 간단하고 유연하며 강력한 방법을 제공하는 Kubernetes의 기본 빌딩 블록입니다.

Pod를 단독으로 실행하여 서비스 하는것은 일반적으로 잘 사용되지는 않습니다. 하지만, 어떻게  사용하는지 알아봅니다. 

파드를 실행하기 위해서는 먼저 pod에 해당하는 yaml(야믈) 파일을 작성합니다. 

아래는 간단한 yaml 파일을 보여줍니다. 

[root@master test]# cat > pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80

이 yaml 파일을 이용하여 kubectl(줄여서 k)에 적용합니다. 
쿠버네티스는 이 yaml에 적힌대로 nginx라는 파드를 생성합니다. 그리고, 해당 컨테이너 이미지는 nginx:latest라는 이미지를 다운 받아서 수행합니다. 여기서는 docker hub에 있는 nginx의 최신 버전을 컨테이너 이미지로 사용합니다. 
[root@master test]# k apply -f pod.yaml
pod/nginx created
[root@master test]#

이제 쿠버네티스는 적용되어 pod가 생성되었습니다. 파드가 잘 실행중인지 확인하기 위해서 다음의 명령으로 확인합니다. 

[root@master test]# k get pod -o wide
NAME                     READY   STATUS    RESTARTS         AGE    IP             NODE      NOMINATED NODE   READINESS GATES
nginx                    1/1     Running   0                94s    10.244.2.64    worker1   <none>           <none>

파드가 정상적으로 실행되었으므로, nginx 서비스가 잘 동작중인지 확인합니다. 
실행중인 IP에 curl을 요청하여 정상적인 html 페이지를 받아오는지 확인합니다.
[root@master test]# curl 10.244.2.64
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
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>
파드가 실행되면 해당 파드에 bash 쉘로 접속이 가능합니다. 아래와 같이 접속하여 파드 내부에서 명령을 실행할 수도 있습니다. 
[root@master test]# k exec -it nginx -- bash
root@nginx:/# echo $HOSTNAME
nginx
root@nginx:/#
생성했던 파드를 삭제합니다. 

[root@master test]# k delete pod nginx
pod "nginx" deleted


Deployment 개념 및 테스트


k8s의 Deployment는 Pod와 ReplicaSet에 대한 선언적 업데이트를 제공합니다. Deployment에서 원하는 상태를 설명하면 Deployment Controller가 실제 상태를 제어된 속도로 원하는 상태로 변경합니다. 새로운 ReplicaSet을 생성하거나 기존 Deployment를 제거하고 새로운 Deployment로 모든 리소스를 갱신하기 위해 Deployment를 정의할 수 있습니다

간단하게 다시 설명하면, 파드 또는 리플리카셋을 관리하기 위한 선언이라고 생각하시면 되겠습니다. 

디플로이먼트는 아래와 같이 선언합니다.  아래는 nginx-deployment를 생성하는 예제입니다.

[root@master test]# cat pod-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80


실행은 파드와 동일하게 쿠버네티스에 적용하고 확인합니다. 

[root@master test]# k apply -f pod-deployment.yaml
deployment.apps/nginx-deployment created
[root@master test]#  k get pod -o wide
NAME                                READY   STATUS    RESTARTS         AGE    IP             NODE      NOMINATED NODE   READINESS GATES
nginx-deployment-544dc8b7c4-4f9nd   1/1     Running   0                45s    10.244.2.111   worker1   <none>           <none>


curl을 통하여 정상적으로 서비스되는지 확인합니다. 호스트이름으로 접속은 실패하였습니다. 호스트이름으로 접속하기 위해서는 서비스를 추가해야합니다. 서비스는 다음에 알아보겠습니다.

[root@master test]# curl nginx-deployment-544dc8b7c4-4f9nd
curl: (6) Could not resolve host: nginx-deployment-544dc8b7c4-4f9nd; Unknown error
[root@master test]# curl 10.244.2.111

<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
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@master test]# k exec -it nginx-deployment-544dc8b7c4-4f9nd -- bash
root@nginx-deployment-544dc8b7c4-4f9nd:/# hostname
nginx-deployment-544dc8b7c4-4f9nd

root@nginx-deployment-544dc8b7c4-4f9nd:/# curl nginx-deployment-544dc8b7c4-4f9nd
<html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } 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@master test]# k get deployments
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   1/1     1            1           30m
[root@master test]# k delete deployments nginx-deployment
deployment.apps "nginx-deployment" deleted

이렇게 디플로이먼트를 삭제하면 디플로이먼트가 관리하는 파드는 자동으로 삭제됩니다. 

롤링 업데이트를 할 때에도 디플로이먼트를 통해서 가능합니다.