본문 바로가기
Devops/Kubernetes

[Kubernetes] Kubernetes 시작하기 (2)

by 볼링치는 개발자 2021. 6. 11.
반응형

앞의 포스팅에서 Kubernetes를 설치하고 기본적인 사용법을 알아봤습니다.

이번 포스팅에서는 Kubernetes에 대해 좀 더 자세히 알아보겠습니다.

 

일단 주의할 점은 minikube는 docker와 달리 실행한 상태를 유지해야 한다는 것입니다.

 

Kubernetes는 기본적으로 master node와 worker node로 구성되어있습니다.

 

Master node는 어느 node에 놓고 실행할 건지 결정하고 전체적인 node들을 관리합니다.

Worker node는 말 그대로 일을 하는 작업 node입니다.

 

 

 

Docker에서는 컨테이너가 작업 단위이지만, Kubernetes에서는 pods, deployment들이 작업 단위, 즉 처리 대상입니다.

 

Pod는 컨테이너를 관리하면서 다른 컨테이너와 통신을 담당하고, master node가 이들을 관리합니다. 컨테이너의 경우 ip가 빈번하게 바뀌어서 컨테이너끼리 소통하는데 힘든 점이 있지만, pod는 컨테이너만큼 ip의 변화가 빈번하지 않아서 컨테이너들의 통신을 도와줍니다.

 

Deployment는 하나의 애플리케이션으로 다양한 컨테이너들로 구성되어 있습니다. 이들이 kubernetes의 기본 처리 대상입니다.

 

Replicaset은 컨테이너가 포함된 pod를 몇 개 둘 것인가 하는 것입니다. Replicaset을 묶어서 deployment가 됩니다.

 


Kubernets의 명령을 학습하기 위해 Docker명령어와 비교하면서 실습해보겠습니다

$ docker ps -a
$ kubectl get po
$ kubectl get pods

docker ps -a는 컨테이너들의 리스트를, kubectl get pods는 pod의 리스트를 출력합니다.

$ docker run -it ubuntu /bin/bash
$ kubectl run my-ubuntu --image=ubuntu -it -- /bin/bash

이 둘의 이미지도 동일한 작업을 합니다.

 

동일하다기엔 애매한 부분이, docker run의 경우 ubuntu이미지로 컨테이너를 생성해서 실행하지만, kubectl의 경우 ubuntu이미지로 pod를 생성해서 실행합니다.

 

차이점으로는 docker run을 통해 붙은 ubuntu에서 exit을 하면 종료하면서 빠져나오지만, kubectl이 생성한 ubuntu pod에서 exit으로 빠져나와도 그대로 실행 중입니다.

$ docker run -dit nginx
$ kubectl run my-nginx --image=nginx -it

이 두개의 명령어도 동일한 작업을 합니다.

여태까지 실행했던 kubectl의 명령어들은 모두 pod를 실행하는 명령이었습니다.

 

그럼 이제부터 deployment를 실행시켜 보겠습니다.

nginx을 사용하는 명령어로 pod를 실행하는 명령어와 비교해보겠습니다.

$ kubectl create deployment my-nignx --image=nignx
$ kubectl run my-nginx-po --image=nginx -it

 

실행 결과를 보면, create deployment 명령어는 my-nginx라는 이름을 갖는 deployment.apps파일을 생성했습니다.

run 명령어는 my-nginx-po라는 이름을 갖는 pod를 생성했습니다.

 

$ kubectl get deployment 명령어를 통해 deployment 리스트를 출력하면 방금 생성한 my-nginx deployment를 볼 수 있습니다.

$kubectl get pods 명령어를 통해 pods 리스트를 출력하면 방금 생성한 my-nginx-po와, my-nginx deployment 안에 있는 pod를 확인할 수 있습니다.

이름을 잘 보시면 my-nginx-6b74b79f57-9f8 kj라고 되어있습니다.

여기서 my-nginx는 deployment이름, 6b74b79f57는 replicaset 이름, 9f8kj는 pod이름입니다.

즉, deployment, replicaset, pod 순서로 점점 더 작은 단위로 들어오는 것입니다.

이를 확인하기 위해 $ kubectl get replicaset 아니면 $ kubectl get rs 명령어로 replicaset을 확인해봅시다.

해당 deployment를 가지고 get pods, get rs, get deployment를 통해 결과를 비교해 보겠습니다.

결과를 보면 id가 점점 상세하게 출력되는 것을 확인할 수 있습니다.

 

그럼 다음 명령어를 통해 pod를 관찰하고 삭제해보겠습니다.

$ kubectl get pods --watch

$ kubectl delete pods [pod 이름] 명령어를 통해 지금 실행 중인 pod를 삭제해 보겠습니다

 

 

실행 결과를 보면 기존에 실행 중인 9f8kj pod를 삭제하면, j65wl의 이름을 가진 pod가 자동으로 생성되면서 실행되고 기존의 9f8kj의 pod가 삭제되는 것을 볼 수 있습니다.

 

이는 Kubernetes의 deployment내의 작은 서비스가 종료되어도 다시 실행되어 실행을 유지하는 작업입니다.

 

위의 pod를 종료하기 위해서는 pod가 아닌 deployment를 전부 삭제해줘야 합니다.

이를 통해 kubernetes의 처리 대상이 deployment라는 것을 알게 되었습니다.


그럼 다음 명령어를 통해 nginx deployment를 하나 생성해 보겠습니다.

$ kubectl create deployment our-nginx --image=nginx

이제 생성해준 nginx deployment를 외부에서 접속할 수 있게끔 외부로 노출시켜 주겠습니다.

$ kubectl expose deployment our-nginx --type=LoadBalancer --port=80

그리고 다음 명령어를 통해 해당 서비스를 확인할 수 있습니다.

$ minikube service list

실행한 our-nignx deployment가 보이고, 오른쪽 URL을 열면 아래와 같이 nginx을 확인할 수 있습니다.

 

그럼 해당 웹 페이지가 방금 실행한 our-nginx deployment가 맞는지 nginx의 index.html 파일을 수정해 확인해보겠습니다.

 

다음 명령어를 통해 해당 deployment내의 replicaset내의 pod에 접근해보겠습니다.

$ kubectl exec -it [pod ID] --bin/bash

그리고 index.html 파일이 있는 usr/share/nginx/html로 이동해 index.html 파일을 수정했습니다.

웹페이지에서 수정한 대로 잘 나오는 것을 확인할 수 있었습니다.


PS. Pods정보 확인하는 명령어는 아래와 같이 두 가지가 있습니다.

$ kubectl get pods -o wide
$ kubectl describe pod [pod이름]

 

반응형

'Devops > Kubernetes' 카테고리의 다른 글

[Kubernetes] Deployment (2)  (0) 2021.06.11
[Kubernetes] Deployment (1)  (0) 2021.06.11
[Kubernetes] Kubernetes 시작하기 (1)  (0) 2021.06.11

댓글