본문 바로가기

Docker, CI/쿠버네티스

쿠버네티스 공부하기 2 - 간단하게 deploy/service/scale 하기

반응형

https://loy124.tistory.com/400

 

쿠버네티스 공부하기 1 - minikube 설치하기

쿠버네티스를 공부하기로 시작한 계기는 아무래도 내가 회사에서 개발 + 운영및 배포를 다같이 하면서 필요성에 의해 공부를 시작하게 되었다. Docker 기반으로 컨테이너 관리는 docker-compose 정도

loy124.tistory.com

위 minikube 설치에 이어 진행한다.

 

이제 쿠버네티스의 큰 흐름에 대해 알아보고 진행하려고 한다. 

 

쿠버네티스에 대해 이해하려면 먼저 클러스터라는 개념에 대해 이해하고 있어야한다.

 

쿠버네티스 클러스터 

간단하게 클러스터는 영어로 군체, 집속체, 무리라는 뜻으로 쿠버네티스에서도 각 컨테이너화 된 애플리케이션을 실행하는 집합 요소들 이라는 의미를 가지고 있다. 

 

클러스터 다이어그램

 

  • Control plane (Master Node)
    쿠버네티스 클러스터 전체를 컨트롤하는 시스템이다. 
    스케줄링, 스케일링, 반영등 모든 기능들을 조율한다. 

  • Worker Node
    마스터 노드에 의해 명령을 받고 실제로 서비스 하는 컴포넌트

 

즉 마스터노드와 워커 노드로 나뉘어져 있으며 마스터 노드에서 워커 노드를 관리한다! 라고 생각할수 있겠다. 

 

minikube를 활용하면 한대의 컴퓨터에서 편리하게  마스터 노드와 워커 노드들을 모두 구성할수 있다.

 

이제 간단하게 명령어를 정리하고 쿠버네티스 워커 노드들을 추가해 보자.

 

minikube 명령어

minikube node [add|start|stop|delete|list] 를 통한 제어가 가능하다. 

 

minikube 는 운영환경에서 사용하는게 아닌 로컬환경에서 공부를 위해 사용되다보니

간략하게 정리하였고 자세한 내용은 아래 사이트에서 확인이 가능하다.

https://minikube.sigs.k8s.io/docs/commands/node/

 

일단 해당 minikube 명령어를 활용해 node를 추가해주겠다.

 

 

minikube node add

minikube-m02 라는 노드가 추가되었다.

 

여기에서 worker node를 하나 더 추가해주겠다.

docker desktop 컨테이너 갯수

 

현재 이런 상태가 구성된것이다. 이제 나는 해당 워커 노드에 nginx를 추가 해서 서비스 하고싶다.

 

 

공식문서 캡쳐

 

쿠버네티스 공식문서에서도 

  1. 클러스터 만들기 (minikube로 실행시 클러스터가 생성된다)
  2. 앱 배포하기 
  3. 앱 탐색하기
  4. 앱을 공개적으로 노출하기
  5. 앱 스케일링하기
  6. 앱 업데이트하기 

순으로 되어있으니 비슷한 방식으로 가보려고 한다.

 

현재 1. 클러스터 만들기만 진행한 상태니 이제 앱을 배포해볼 상태다. 

 

쿠버네티스 Deploy

쿠버네티스에서는 기본적으로 명령어 형식이 kubectl action resource 방식인데

 

kubectl get node  - 현재 노드들 조회

 

kubectl get deployment - 현재 배포 조회 

 

kubectl create deployment - 배포 생성하기 

 

위와같은 식으로 동작한다.

 

 

 

 

이제 쿠버네티스 배포를 해보겠다.

kubectl create deployment nginx --image=nginx
kubectl get deployment

위와 같이 deployment가 정상적으로 수행된것을 확인할 수 있다.

deployment가 정상적으로 수행된 경우 그 결과를 기반으로 pod가 생성이 된다.

 

pod

 

  • 쿠버네티스에서 만들고 관리할수 있는데 가장 작은 컴퓨팅 단위 
  • 볼륨으로 공유스토리지
  • 고유한 클러스터 IP주소로 네트워킹 가능
  • 컨테이너 이미지 버전 또는 특정 포트등 정보가 들어있다.

 

kubectl get pod -o wide

생성되어있는 pod 조회를 해보면

 

 

현재 워커 노드중 minikube-m02에 pod가 생성된것을 확인할 수 있다. (나머지 m03에도 nginx를 추가하는건 추후  scale에서 다룬다.)

 

 

 

 

 

 

 

node에는 여러 pod들이 들어 갈 수 있다.

 

여기까지 어떻게? 해당 pod들이 생성되었을까에 대한 세부 정보들을 조회하기 위해서는

 

kubectl describe

상세 정보 조회시 사용한다. 

 

kubectl describe pod

위와같은 명령어를 통해 세부 정보 또한 조회가 가능하다. 

 

어떤 컨테이너를 사용했는지, nginx에 대한 이미지는 어디에서 가져왔는지, 어느 node에 해당 pod가 생성되었는지 알수 있다.

 

 

kubectl logs

쿠버네티스에서 로그를 조회할 때 사용한다. 

 

kubectl get pod

kubectl logs $파드이름

 

 

kubectl exec 

특정 파드에 접속하고 싶을때 사용한다.

(접속 후 나갈때는 exit를 통해 나오면된다.)

kubectl exec -it 파드이름 -- bash

( bash 쉘을 활용해서  해당 파드에 접근하는 명령어)

 

파드에 접근하게 되면 해당 파드에 대한 linux 명렁어를 수행할수 있다.

 

쿠버네티스 Service

현재 배포를 하게 되면 각 노드에 맞게 pod가 생성되어있는 상태이다.

이제 생성된 애플리케이션을 외부나 내부에서 접근할수 있도록 해주는 작업이 Service 이다.

 

즉 디플로이로 파드를 생성하고 해당 파드들에 접근하는게 서비스이다.

 

이제 해당 deployment를 기반으로 노출을 시켜보겠다. 

kubectl get deployment

kubectl expose deployment nginx --type=NodePort --port=80

kubectl get service

 

 

kubectl expose deployment nginx --type=NodePort --port=80

이름이 nginx 라고 되어있는 deployment 의 80번대 port를 노출하겠다라는 뜻

 

위까지 진행하면 이제 성공적으로 service 배포까지 완료하였다.

여기서 우리가 만든 서비스에 접근하고 싶다면

minikube가 아닌경우 -> 내 ip:30457 (get service 시 나온 port) 로 진행하면 된다

 

minikube인 경우 

minikube service 서비스이름

 

 

위 코드가 실행됨과 동시에 새로 local에 포트가 할당되고 nginx가 실행되는것을 확인할 수 있다. 

kubectl get service떄 나온 포트와 다르게 포트가 새로 할당된것을 확인할수 있다.

 

여기까지 진행하면 일단 간단하게 쿠버네티스를 통해 deploy -> service를 통해 실제 애플리케이션 동작까지 확인하였다. 

 

 

 

스케일링

서버(컨테이너)를 여러개로 늘리는 행위를 스케일링이라 하는데 쿠버네티스에서도 해당 스케일링을 지원해준다. 

 

현재 worker node는 두대 존재한다.
하지만 사용되는 worker node는 한대 뿐이다

이제 현재 하나의 노드에만 pod가 배포되어있는 상태인데 스케일링을 통해 pod의 수를 늘려보려고한다. 

 

 

해당 작업을 위해 기존에 존재하는 service와 deployment를 지워주겠다. 

kubectl delete service nginx

kubectl delete deployment nginx

 

kubectl scale

쿠버네티스에서 각 컨테이너 갯수를 조절할때 사용하는 명령어로 

--replicas 에 만들고 싶은 갯수를 작성하면 된다.

 

kubectl create deployment nginx --image=nginx

kubectl scale deployment nginx --replicas=3

 

마지막으로 동일한 방법으로 service를 만들어주면 완성이다. 

kubectl expose deployment nginx --type=NodePort --port=80

kubectl get service

minikube service nginx

 

 

여기까지 진행하면  앱을 만들고~ 서비스 하고 스케일링 하는것 까지 맛을 본거 같다.

하지만 불편한 요소가 존재했다. 

 

반복 작업  

 같은 nginx를 배포하는 명령어가 지금은 짧지만 길다고 가정하면 이를 작성하는것 또한 일이다.
 (개발자는 단순 반복작업의 귀찮은게 싫다..)

 

 

이제 해당 deployment와 service를 파일로 관리하는 법에 대해 적용해보고 service 배포시 NodePort라는 방식을 사용했는데 해당  방식이 어떤거고 어떤 방식을 또 활용할수 있는지 알아보려 한다.

 

반응형