[쿠버네티스] Deployment - 명령적 접근 방식

 

이러한 파일구조를 가지고있는 디렉토리에서 작업을 할 것이다.


app.js

const express = require('express');

const app = express();

app.get('/', (req, res) => {
  res.send(`
    <h1>Hello from this NodeJS app!</h1>
    <p>Try sending a request to /error and see what happens</p>
  `);
});

app.get('/error', (req, res) => {
  process.exit(1);
});

app.listen(8080);

app.js의 내용을 보면 알 수 있듯이 간단한 모양이다. 엔드포인트가 '/'와 '/error'밖에 없다.


Dockerfile

그리고 이 애플레케이션을 기반으로 이미지를 생성하려면 도커를 사용해야한다.

쿠버네티스는 컨테이너 기반이기 때문이다. 그리고 그 컨테이너를 실행하기 위해서는 이미지가 필요하다.

FROM node:14-alpine

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

EXPOSE 8080

CMD [ "node", "app.js" ]

그래서 도커파일을 작성해주어야한다.


도커 이미지 생성

docker build -t kub-first-app .

도커 빌드를 해서 이미지를 만들어준다.

그리고 Deployment의 일부분으로 Pod를 생성하면, Pod에서 실행되는 컨테이너를 제공한다. 그리고 알아서 관리를 할 것이다.


클러스터

일단 클러스터가 구동중인지 확인을 할 것이다.

minikube status

명령을하면 실행중인 것들이 표시가 되는데, 이는 클러스터가 실행중임을 뜻한다.

만약에 그렇지 않다면,

minikube start --driver=<docker or virtualbox>로 설정해야한다.


kubectl 명령은 쿠버네티스 클러스터에 지침을 보내는데 사용하는 명령이다. 마스터 노드와 해당 클러스터의 컨트롤 플레인이라고 할 수 있다.

kubectl create 명령으로 객체를 생성한다.

kubectl create 명령으로 만들 수 있는것들이 저렇게나 많지만, 나는 이번에 deployment 객체를 만들것이다.

kubectl create deployment로 만든 새로운 deployment 객체는 자동으로 쿠버네티스 클러스터로 전송된다.

kubectl create deployment <지정할 이름> --image=사용할 이미지

사용할 이름을 지정하고 그 다음 중요한건, --image 옵션이다. deployment에서 생성된 pod의 컨테이너에 사용할 이미지를 지정할 때 사용한다. 나는 방금 로컬에서 빌드한 이미지인 kub-first-app을 사용할 것이다.

kubectl get deployments

kubectl get deployments 명령을 사용하면 연결한 클러스터에 deployment가 얼마나 있는지 확인할 수 있다. (이미 이전에 디플로이먼트 몇개 연습을해서 밑에 두개 존재함)

***kubectl은 자동적으로 minikube와 연결되니 minikube와 상호작용하고 싶다고 따로 명령을 할 필요는 없다.

first-app옆에 READY에 0/1이 되어있는건 하나의 deployment가 있고, 그 중 0개가 준비되어있다는 뜻이다.

이는 하나의 deployment중 하나가 실패했음을 의미한다.

kubectl get pods

이유를 알기 위해  kubectl get pods를 명령한다.

포드 하나가 생성되지 않았다. STATUS에는 ErrImagePull 이미지를 못 가져왔다는 말이다... 이게 원인이다

로컬에서 빌드한 이미지는 로컬에서만 존재하고 쿠버네티스 클러스터에는 없기에 당연히 찾을수가 없다. 그래서 DockerHub와 같은 이미지 레지스트리의 일부분인 이미지를 지정해야한다.

kubectl delete deployment first-app

도커 허브에 올린 이미지를 기반으로 deployment로 생성을 해야 하므로 지금 만든 deployment 객체를 삭제해준다.


Docker Hub

도커 허브에서 kube-first-app이름으로 새 레포지토리를 만들어준다.

docker tag kub-first-app crowssnest/kube-first-app

docker tag 명령어를 사용해서 기존 이미지를 도커 허브의 레포지토리 이름이랑 같게 만들어준다.

docker push crowssnest/kube-first-app

도커 허브에 docker push 명령으로 이미지를 올린 뒤

확인을 해보면 새로운 이미지가 레포지토리에 올라온것을 확인할 수 있다.


Deployment

kubectl create deployment first-app --image=crowssnest/kube-first-app

도커허브에 새로 만든 리모트 이미지를 기반으로 deployment 객체를 다시 생성해준다.

kubectl get deployments

kubectl get deployments 명령으로 확인해보면 1/1로 READY가 된 deployment를 확인할 수 있다.

 

kubectl get pods

kubectl get pods를 실행해도 1/1로 준비된 파드가 있는것을 확인할 수 있다.


minikube dashboard

minikube dashboard

당장 실제로는 접근할 수 없고, 가시적인것으로 보기위해 minikube 대시보드로 접근한다.

대시보드에서는 실행중인 deployment와 pod 들이 보이고, pod에는 기본적으로 연결된 특정 메타데이터인 레이블이 있다. 레이블은 애플리케이션과 해당 deployment를 식별한다.

디플로이먼트에 들어가면 더 세부적인 정보를 볼 수도 있다.

파드에서도 더 세부사항을 볼 수 있다.

IP주소를 확인할 수 있지만, 이는 클러스터 내부의 내부적인 IP주소이다. 따라서 그 pod에 접근하기 위해 브라우저에서 이를 사용하려고 하면, 컨테이너에 의해 노출된 포트를 사용하더라도 작동하지 않는다.

JUNE .

20'S LIFE IN SYDNEY and BUSAN

    이미지 맵

    DevOps Study/Kubernetes 다른 글

    이전 글

    다음 글