Judaeng

쿠버네티스(Kubernetes) - MiniKube에서 배포해보기 본문

DevOps/Kubernetes

쿠버네티스(Kubernetes) - MiniKube에서 배포해보기

Judaeng 2022. 4. 12. 08:00

쿠버네티스에 배포해보기 전에 Docker(3) - 이미지 만들고 배포해보기 +Docker Hub를 먼저 완료하고, 진행하는 것을 추천한다.

 

Docker(3) - 이미지 만들고 배포해보기 +Docker Hub

Docker를 설치하고 컨테이너를 실행해 보았으니 이번엔 이미지를 만들고 서버에 배포해보도록 하자. Docker 이미지 만들기 Docker는 이미지를 만들기 위해 컨테이너의 상태를 그대로 이미지로 저장

hi-judaeng.tistory.com

쿠버네티스에서 구동되는 애플리케이션은 컨테이너 이미지로 패키징 되어야 하므로, 우선 Docker 사용의 기본적인 방법을 아래 순서로 가볍게 알아보자.

 

1. Docker 설치와 "Hello World" 컨테이너 실행하기

2. k8s에 배포할 간단한 Node.js 애플리케이션 생성하기

3. 애플리케이션을 컨테이너 이미지로 패키징하기

4. 이미지 기반의 컨테이너 실행하기

5. Docker Hub에 이미지 Push 하기(누구든 실행할 수 있도록 만들어보자.)

 

Hello Minikube


Minikube란?

Minikube는 로컬에서 쿠버네티스를 테스트하고 애플리케이션을 개발하는 목적으로 단일 노드 클러스터를 설치하는 도구이다.

완전하게 동작하는 쿠버네티스를 가장 간단하고 빠르게 접근하는 방법이 minikube를 사용하는 것이라고 한다.

 

minikube 설치

--mac intel
curl -Lo minikube https://storage.googleapis.com/minikube/release/v0.23.0/minikube-darwin-amd64 
chmod +x minikube && sudo mv minikube /usr/local/bin/

--mac Apple Silicon m1
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-arm64
sudo install minikube-darwin-arm64 /usr/local/bin/minikube

# 또는
brew install minikube

# 또는
sudo install minikube-darwin-amd64 /usr/local/bin/minikube

 

minikube로 쿠버네티스 클러스터 시작하기

minikube가 로컬에 설치되면 minikube start 명령어를 통해 쿠버네티스 클러스터를 바로 시작할 수 있다.

minikube start

minikube start

쿠버네티스 클라이언트 설치하기

쿠버네티스를 다루려면 kubectl CLI 클라이언트가 필요하다.

mac에서는 brew로 설치한다. 다른 OS는 찾아보는 것을 추천한다.

brew install kubectl

# 아래처럼 brew로 kubectl과 minikube를 동시에 install할 수도 있습니다.
brew install kubectl minikube

 

클러스터 작동 여부 확인과 kubectl 사용해보기

kubectl cluster-info 명령어를 사용해 클러스터가 정상 작동하는지 확인한다.

kubectl cluster-info

 

디플로이먼트(deployment) 생성

나 같은 경우, 아래와 같이 yaml 파일을 생성했다. 

만약 지금 docker 이미지가 없고, 처음 minikube를 진행하고 있다면 yaml 파일은 만들 필요가 없다.

yaml 파일은 생성하면 어느 디렉터리에 저장하는 것이 좋을까? 고민을 했었는데, 그냥 프로젝트 상위 디렉토리에 저장하고 yaml 파일을 실행할 때, 그 디렉터리에서 생성하는 것으로 했다.

# yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dokdok-server
  labels:
    app: dokdok-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dokdok-server
  template:
    metadata:
      labels:
        app: dokdok-server
    spec:
      containers:
      - name: dokdok-server
        image: alinos/dokdok-server:1.0
        imagePullPolicy: Always
        ports:
        - containerPort: 3000

위의 디플로이먼트를 생성하려면 다음 단계를 따라야 한다.

 

1. 다음 명령어를 실행해서 디플로이먼트를 생성한다.

# 아래는 예시 yaml 생성 방법
kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml

# 나같은 경우는
kubectl apply -f dokdok-server.rc.yaml

2. kubectl get deployments을 실행해서 디플로이먼트가 생성되었는지 확인한다.

클러스터에서 디플로이먼트를 점검할 때, 다음 필드가 표시된다.

NAME은 네임스페이스에 있는 디플로이먼트 이름의 목록이다.

READY는 사용자가 사용할 수 있는 애플리케이션의 레플리카의 수를 표시한다.

ready/desired 패턴을 따른다.

UP-TO-DATE는 의도한 상태를 얻기 위해 업데이트된 레플리카의 수를 표시한다.

AVAILABLE은 사용자가 사용할 수 있는 애플리케이션 레플리카의 수를 표시한다.

AGE는 애플리케이션의 실행된 시간을 표시한다.

 

클러스터와 상호작용


kubectl이 이미 설치되어 있다면 이제 이를 사용하여 반짝이는 새 클러스터에 액세스 할 수 있다.

kubectl get po -A

또는 minikube에서 적절한 버전의 kubectl을 다운로드할 수 있으며 다음과 같이 사용할 수 있다.

minikube kubectl -- get po -A

셸 구성에 다음을 추가하여 삶을 더 쉽게 만들 수도 있다고 한다. 간략하게 변수 선언

alias kubectl="minikube kubectl --"

처음에는 스토리지 제공자와 같은 일부 서비스가 아직 실행 중 상태가 아닐 수 있다.

이것은 클러스터를 불러오는 동안 정상적인 상태이며 잠시 동안 자체적으로 해결된다고 한다.

클러스터 상태에 대한 추가 통찰력을 위해 minikube는 Kubernetes 대시보드를 번들로 제공하므로 새 환경에 쉽게 적응할 수 있다고 한다.

minikube dashboard

위에 명령어를 사용하면 지금 나의 이미지가 잘 로컬에서 배포되었다는 것을 확인할 수 있다.

브라우저가 하나 뜨는 것을 확인하면 된다.

브라우저가 짜쟌!

애플리케이션 배포


기본적으로 파드는 쿠버네티스 클러스터 내부의 IP 주소로만 접근할 수 있다.

hello-node 컨테이너를 쿠버네티스 가상 네트워크 외부에서 접근하려면 파드를 쿠버네티스 서비스로 노출해야 한다.

 

1. kubectl expose 명령어로 퍼블릭 인터넷에 파드 노출하기

kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4
kubectl expose deployment hello-minikube --type=NodePort --port=8080

2. 생성한 서비스 살펴보기

kubectl get services

# or
kubectl get services hello-minikube

다음과 유사하게 출력된다. TYPE이 위에 대로라면 NodePort로 뜰 것이다.

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
hello-node   LoadBalancer   10.108.144.78   <pending>     8080:30369/TCP   21s
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP          23m

로드 밸런서를 지원하는 클라우드 공급자의 경우에는 서비스에 접근할 수 있도록 외부 IP 주소가 프로비저닝 한다.

minikube에서 LoadBalancer 타입은 minikube service 명령어를 통해서 해당 서비스를 접근할 수 있게 한다.

하지만 우리는 NodePort 타입을 설정해주었기 때문에 Node의 고정된 Port를 사용하게 된다.

 

3. 다음 명령어를 실행한다.

minikube service hello-node

또는 kubectl을 사용하여 포트를 전달한다.

나 같은 경우 위에 명령어를 사용해도 port가 열리지 않아 타임아웃 에러가 났다.

그러니 안된다면 port-forward를 해주고 그 정해준 포트로 들어가 보자.

kubectl port-forward service hello-minikube 7080:8080

kubectl port-forward service [이미지 이름] <NodeIP>:<NodePort>

port-forward

이제 http://localhost:7080/ 에서 애플리케이션을 사용할 수 있다.

CLIENT VALUES, SERVER VALUES, HEADERS RECEIVED와 같은 nginx의 요청 메타데이터를 BODY애플리케이션 출력에서 ​​볼 수 있어야 한다. 

요청 경로를 변경하고 에서 변경 사항을 관찰해보자.

CLIENT VALUES. BODY마찬가지로, 동일한 항목에 대해 POST 요청을 수행하고 출력 섹션에 본문이 표시되는 것을 관찰할 수 있다.

* NodePort: 고정 포트(NodePort)로 각 노드의 IP에 서비스를 노출시킨다.

NodePort 서비스가 라우팅 되는 ClusterIP 서비스가 자동으로 생성된다.

<NodeIP>:<NodePort>를 요청하여, 클러스터 외부에서 NodePort 서비스에 접속할 수 있다.

* LoadBalancer: 클라우드 공급자의 로드 밸런서를 사용하여 서비스를 외부에 노출시킨다.

외부 로드 밸런서가 라우팅되는 NodePort와 ClusterIP 서비스가 자동으로 생성된다.

 

이렇게 하면 당신의 앱을 서비스하는 브라우저 윈도우를 띄우고 애플리케이션의 응답을 볼 수 있다.

Hello World 배포 성공!
curl

로드밸런서 배포


LoadBalancer 배포에 액세스 하려면 "minikube tunnel" 명령을 사용한다.

다음은 배포 예다.

kubectl create deployment balanced --image=k8s.gcr.io/echoserver:1.4  
kubectl expose deployment balanced --type=LoadBalancer --port=8080

다른 창에서 터널을 시작하여 '균형' 배포를 위한 라우팅 가능한 IP를 생성한다.

minikube tunnel

라우팅 가능한 IP를 찾으려면 다음 명령을 실행하고 EXTERNAL -IP 열을 검사해보아라.

kubectl get services balanced

이제 <EXTERNAL -IP>:8080에서 배포할 수 있다.

 

클러스터 관리 및 제거하기


배포된 애플리케이션에 영향을 주지 않고 Kubernetes를 일시 중지한다.

minikube pause

일시 중지된 인스턴스 일시중지 해제

minikube unpause

클러스터 중지

minikube stop

기본 메모리 제한을 늘린다. (다시 시작해야 한다.)

minikube config set memory 16384

쉽게 설치되는 Kubernetes 서비스 카탈로그를 찾아보자.

minikube addons list

이전 Kubernetes 릴리스를 실행하는 두 번째 클러스터를 만든다.

minikube start -p aged --kubernetes-version=v1.16.1

모든 minikube 클러스터를 삭제한다.

minikube delete --all

이제 클러스터에서 만들어진 리소스를 제거할 수 있다.

kubectl delete service hello-node
kubectl delete deployment hello-node

필요하면 Minikube 가상 머신(VM)을 정지한다. (중복)

minikube stop

필요하면 minikube VM을 삭제한다. (중복)

minikube delete

 

🤔 블로그 정리 후, 느낀 점

minikube 문서를 보고 한번 블로그를 작성해보았다.

원래 나는 docker를 정리 후에, hello world 이미지를 Docker Hub에 저장하고, 그 이미지를 사용했었다.

하지만 이번엔 "내 프로젝트를 로컬에 minikube로 띄워봐야겠다."라는 마음으로 블로그에 정리한 것이다.

생각보다 순탄하게 잘 진행되다가... 어느 순간 에러가 두둥... 에러 로그는 대충 적어보자면

error: failed to create deployment: deployment.apps

이런 식의 에러였다. 결국 해결방법을 찾아내지 못했고, 쉬는 시간을 가졌다.

과자와 커피를 먹으면서 머리를 식히고, 다시 생각해보니, 내가 minikube와 Kubernetes와 같다고 생각한 것이었다.

사실 전혀 모르고 있다가, 누군가 옆에서 minikube랑 kubernetes랑 헷갈린 것 아니야?라고 물어봐서 다시 봤더니 헷갈린 것이었다...

minikube 공식문서, Kubernetes 공식문서는 다른 것이었다... 당연한 거지만ㅎ;

어쨌든 그렇게 다시 minikube를 삭제하고 다시 문서에 있는 과정대로 따라 해 보았다.
(심지어 minikube도 Apple Silicon 용도 안 다운로드하고, intel 다운로드받음;)

그렇게 하나씩 과정을 다시 따라 해 보니, 정상적으로 hello world가 뜨는 것을 확인하고 너무 기뻤다. (이게 뭐라고...😭)

어쨌든 minikube에서 내 프로젝트를 배포해보니까 힘든 만큼 너무 행복했다. 

다음은 GitOps를 구현하는 방법을 생각하고 만들어보고 싶다. 나처럼 힘들게 하지 말라고 내 식대로 잘 정리해보았다.

그리고! kubectl 명령어와 minikube kubectl은 다른 명령어이니, 잘 생각하고 명령어 사용을 하기 바란다.

이 글을 보고도 헷갈린다면 내가 읽었던 문서들을 남겨놓으니 참고하길 바란다. 🙏🏻

 

 

📝 이번 게시물을 만들기 위해 참고한 사이트

1. minikube 시작 - 쿠버네티스 문서

2. 디플로이먼트(deployment) - 쿠버네티스 문서

3. 서비스(service) - 쿠버네티스 문서

4. 클러스터 내 애플리케이션에 접근하기 위해 서비스 사용하기 - 쿠버네티스 문서

5. katacoda - Docker, Kubernetes, Minikube를 쉽게 실습해볼 수 있는 곳

6. 다른 사람의 블로그(1) - MiniKube에서 배포해보기(참고만)

 

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

쿠버네티스(Kubernetes) - 알아보기  (0) 2022.04.12
Comments