작업성공^^ 드디어 마이크로서비스앱을 클라우드로 배포하는 파이프라인을 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.
클라우드와 마이크로서비스는 아직 수익과 연결되는 작업이 흔하지 않기 때문에 앞으론 실제 수익과 연결되는 프런트엔드 부분에 집중할 예정 입니다.
Bosh라이트+보시AdminUI+파스타4.0설치+샘플자바앱컨테이너생성_01 (0) | 2019.07.28 |
---|---|
클라우드 파스타 전문가 교육 수료 (0) | 2019.07.27 |
DevOps 파이프라인 구성_1(Nodejs로 마이크로 서비스 앱 제작) (0) | 2019.06.09 |
컨테이너(쿠베_도커)를 이용해 클라우드 네이티브 앱(마이크로서비스) 구축 (0) | 2019.06.09 |
워드프레스 웹사이트 도커기반 쿠버네티스로 프로비저닝 하기_2 (0) | 2019.06.08 |
댓글 영역