상세 컨텐츠

본문 제목

DevOps 파이프라인 구성_2(제작한 마이크로 서비스 앱을 쿠버네티스에서 실행)

클라우드+마이크로서비스

by 김일국 2019. 6. 11. 11:02

본문

작업성공^^ 드디어 마이크로서비스앱을 클라우드로 배포하는 파이프라인을 1사이클 돌려 보았습니다.

지금까지 내용을 정리하자면, 

노드js앱 또는, APM스택(워드프레스)로 개발된 웹을 [도커 이미지로 빌드하고, 쿠버네티스로 배포(프로비저닝)]을 해 보았습니다.

기존 웹/앱 개발 프로세스에서 추가된 부분은 [밑줄친] 부분 입니다.


작업2, 제작한 마이크로 서비스 imagini 앱을 쿠버네티스에서 실행하기.

고유한 네트웍 주소가 할당된다.

 - 포드(pods): 앱을 도커 이미지로 배포하는 장소로서, 일반적으로 1개의 컨테이너를 1pod 로 사용한다. 사용 포트충돌을 피하기 고유한 네트웍 주소가 할당된다.

 - 라벨(label): 여러 pod를 그룹 지울때 지정하는 그룹명 이다.

 - 서비스(service): 위 포드(컨테이너)로 배포된 마이크로서비스 앱이나 Mysql 데이터베이스 서버를 말하며, pod(컨테이너)의 라벨을 정의한 후 서비스를 생성할 수 있다.


쿠버네티스는 도커를 사용하기 때문에,

이 문서에서는 앞으로 '도커를 이용한 배포'라는 용어 대신, '쿠버네티스를 이용한 마이크로서비스 앱 배포' 를 사용할 예정 입니다.

- 일단 쿠버네티스를 시작합니다.(설치는 이전 포스트 참조)

 ~$ minikube start

- 쿠버네티스 클러스터실행 확인

 ~$ kubectl cluster-info

==================== 여기서 부터 쿠버네티스를 위한 도커 확장 이미지 빌더 환경 만들기 시작 ==========================

 $ minikube docker-env (현재 환경 확인)

   export DOCKER_TLS_VERIFY="1"

   export DOCKER_HOST="tcp://192.168.99.100:2376"

   export DOCKER_CERT_PATH="/Users/dresende/.minikube/certs/"

   export DOCKER_API_VERSION="1.23"

  위 내용 처럼 출력되면, 아래 라인 실행할 필요 없음.

 - (환경실행) $ eval $(minikube docker-env) | $ eval $(minikube docker-env -u)

==================== 여기서 부터 쿠버네티스를 위한 도커 확장 이미지 빌더 환경 만들기 끝 ==========================

 참고용 시작

 - (빌드)$ docker build -t 이미지명:0.0.1(버전)

 - (이미지배포)$ kubectl run 앱이름 --image=이미지명:0.0.1(버전) --port=3000

 - (외부노출) kubectl expose deployment 앱이름 --type=LoadBalancer

 - (서비스실행확인) kubectl get services

 참고용 끝

==================== 여기서 부터 도커 확장 이미지 만들기 시작 ==========================

위 클러스터가 정상 실행 되는 것을 확인 한 후 서비스를 배포하기 전에 서비스를 실행할 이미지를 만들어야 한다.

이미지를 최대한 슬림하게 유지하기 위해 node:alpine 노드:알파인버전 이미지를 도커 기본이미지로 다운 받아서 노드확장을 합니다.

즉, 노드확장이란 기본 도커이미지에 제작한 imagini 앱을 추가 하는 것을 말합니다.

 FROM node:alpine 라인추가.(아래소스)

( Ps. 워드프레스 앱도 비슷한 기본 이미지를 다운받아서 노드를 확장 합니다.)

 ~/app_node $ sudo docker images (현재 로컬서버에서 보유중인 도커 이미지 확인)

 ~/app_node $ sudo docker pull node:alpine (노드:알파인 버전 이미지 pull명령으로 내려받음, 77.8M)

  (현재 개발버전은 10.15.3 이라서 FROM node:10.15.3 버전으로 변경)

 ~/app_node $ sudo docker rmi -f 이미지ID (현재 node:alpine 도커이미지 삭제 도커 캐시파일 삭제: docker system prune -a )

 ~/app_node $ sudo docker pull node:10.15.3 (버전 도커 이미지로 새로 받을 필요없이 FROM node:10.15.3 으로 변경하면, 도커파일 실행시 자동으로 받지만, 속도 때문에 미리 받아 놓습니다.)

 ~/app_node$ touch Dockerfile (도커파일 생성:도커이미지 생성규칙 설정)

  도커파일 내용:

  FROM node:10.15.3 (다른 버전으로 하면 에러나더군요^^)

  MAINTAINER Kim ilguk

  //ADD imagini(폴더명) /opt/app (폴더명으로 처리시 속도가 소스 전송 속도가 느려질 수 있기 때문에 아래처럼 변경)

  ADD imagini/imagini.js /opt/app/imagini.js

  ADD imagini/package.json /opt/app/package/json

  ADD imagini/settings.json /opt/app/settings.json

  WORKDIR /opt/app

  RUN npm i

  CMD ["node", "/opt/app/imagini"] (imagini/imagini.js 와 같습니다. 폴더명/노드실행파읾명)

 ~/app_node$ sudo docker build --no-cache -t imagini:1.0.0 . (맨마지막 . 있음)

==================== 여기 까지가 도커 이미지 만들기 끝 ==========================

쿠버네티스 배포는 이전 wordpress 배포 실행하기에서 사용한 방식인 kustomization.yaml 로 실행

==================== 여기서 부터 쿠버네티스에 배포 시작 ==========================

#실행 순서: (yaml파일 3개로 구성)

1. kustomization.yaml(시크릿 생성자) + mysql-deployment.yaml(DB) + imagini-deployment.yaml(이미지변환앱)

2. 쿠버네티스 명령어로 kustomization.yaml 파일을 실행
 $ kubectl apply -k ./

3. 실행 확인
 $ kubectl get secrets (시크릿 생성자 확인)
 $ kubectl get pvc (퍼시스턴스볼륨 프로지버닝확인-컨테이너가 다운되더라도 상태저장되는 스토리지)
 $ kubectl get pods (배포된 도커 파드>컨테이너 가 실행중인지 확인)
 $ kubectl get services imagini (이미지 웹서비스 실행확인)
 $ minikube service imagini --url (웹서비스 주소URL 확인- 아래 첫번째 이미지)
 $ minikube dashboard (쿠버네티스 대시보드에서 생성된 Pods>도커콘테이너 확인 -아래 두번째 이미지)

 - 컨테이너(pod)에 서비스중인 imagini 접속확인:

 $ kubectl exec -it imagini-dcb8d958d-hrqnw(위에서 get pods 로 구한 이름) /bin/sh

 - 컨테이너(pod)에 서비스중인 mysql 접속확인: mysql://root:암호@imagini-mysql/imagini 로 DB접속 가능.

 $ kubectl exec -it imagini-mysql-659b4fb858-x46w2(위에서 get pods 로 구한 이름) /bin/sh
4. 위 작업한 결과 삭제
 $ kubectl delete -k ./

==================== 여기 까지가 쿠버네티스에 배포 끝 ==========================

$ kubectl apply -k ./ 실행시 mysql-deployment.yaml 파일에 MYSQL_DATABASE 값에 DB명을 적어넣으면, 실행시 자동생성 됩니다.

 기술참조: https://cleanupthedesk.tistory.com/16

이 후 앱에서 사용할 Table 들은 앱 최초 실행시  자동 생성되도록 코딩을 해 놓았습니다.

그래서, 워드프레스와 마찬가지로 바로 사용이 가능한 이미지 변환 앱을 쿠버네티스에 배포할 수 있었습니다.

이전 포스트에서 쿠버네티스로 워드프레스 배포때 사용한 파일 3개(아래)

DB종류-deploymen.yaml, 앱명-deployment.yaml, Kustomization.yaml(시크릿생성자) 를

-> 노드js앱에 맞게 변경처리 후, $ kubectl apply -k ./ 명령으로 프로비저닝 됩니다.

추가한 내용은 기본 도커 이미지에 제작한 앱을 추가해서 확장시킬때 필요한 Dockfile 1개만 추가했습니다.

 (워드프레스 작업때는 확장하지 않았음.)


wordpress_kube_file.zip : 워드프레스용 쿠버네티스 배포 yaml 파일3개

nodejs_kube_file.zip : 노드js용 앱 쿠버네티스 배포 yaml 파일4개


그리고, 개발 앱에서 로컬로 접속한 DB커넥션 부분을 쿠버네티스 Pods(컨테이너2개-앱pod, 디비pod)간 통신때문에,

 -기본적으로 컨테이너간은 격리가 되어 있기 때문에...

Pod(컨네이너)서비스 이름으로 접속이 가능하게 변경 하였습니다.(노드js앱 소스에서)

변경전 "db": "mysql://root:암호@127.0.0.1/imagini(DB명)" => 변경 "db": "mysql://root:암호@imagini-mysql/imagini(DB명)"

쿠버네티스 대시보드에서 아래는 결과 확인:imagini 앱(이미지변환앱-지난포스트에 사용법있음)과 imagini-mysql(DB에 이미지저장)

즉, 2개의 컨테이너가 올라가서 컨테이너간 통신하게 됩니다.(아래)

Ps. 

클라우드와 마이크로서비스는 아직 수익과 연결되는 작업이 흔하지 않기 때문에 앞으론 실제 수익과 연결되는 프런트엔드 부분에 집중할 예정 입니다.

nodejs_kube_file.zip
0.0MB
wordpress_kube_file.zip
0.0MB

관련글 더보기

댓글 영역