믹스 컴피 중독자가 되가는 중..
Kubernetes와 Mysql Workbench 연동하기-2(로드 밸런서 사용하기)
이번 포스팅을 읽기 전에 자신만의 SpringBoot 앱이 있는 것이 좋다. 물론 내가 도커 허브에 저장한 이미지를 써도 무방하다.
일단 도커 메인 홈페이지에 가입이 되어 있어야 한다. 그리고 repository를 생성한다.
클러스터에 접속하고 target 디렉터리를 만든다음 그 안에 .jar 파일을 넣고 이전 디렉터리로 이동한 다음 Dockerfile를 생성하자.
Dockerfile
FROM openjdk:11
LABEL description="Echo OP Java Development"
COPY ./target/application.jar /opt/application.jar
WORKDIR /opt
ENTRYPOINT ["java", "-jar", "application.jar"]
하나 하나 살펴보면 아래와 같다.
Dockerfile
#import openjdk:8 image
#FROM <이미지 이름>:[태그] 형식으로 이미지를 가져온다.
#가져온 이미지 내부에서 컨테이너 이미지를 빌드한다.
#누군가 만들어 놓은 이미지에 필요한 부분을 추구한다고 보면 된다.
#여기서는 openjdk를 기초 이미지로 사용한다.
FROM openjdk:11
#Label_desc="Echo IP Java Application"
#즉 컨테이너 이미지를 설명한다.
#LABEL <레이블 이름>=<값>의 형식으로 이미지에 부가적인 설명을 위한 레이블을 추가할 때 사용한다.
LABEL description="Echo OP Java Development"
#호스트에서 새로 생성하는 컨테이너 이미지로 필요한 파일을 복사한다.
#COPY <호스트 경로> <컨테이너 경로>의 형식이다.
#application.jar 파일을 이미지의 /opt/application.jar로 복사한다
COPY ./target/application.jar /opt/application.jar
#이미지의 현재 작업 위치를 opt로 변경한다.
WORKDIR /opt
#ENTRYPOINT ["명령어", "옵션",... "옵션"]의 형식이다.
#컨테이너 구동 시 ENTRYPOINT 뒤에 나오는 대활호([]) 안에 든 명령을 실행한다.
#콤마(,)로 구분된 문자열 중 첫 번째 문자열은 실행할 명령어고, 두 번째
#문자열부터 명령어를 실행할 때 추가하는 옵션이다.
#여기서는 컨테이너를 구동할 때 java -jar application.jar이 실행된다는 의미이다.
ENTRYPOINT ["java", "-jar", "application.jar"]
도커 이미지를 빌드하는 명령을 친다.
docker build --tag youngkyonyou/springboot-project:spring .
빌드가 되었다면 도커 허브에 우리가 만든 리포지토리에 이미지를 저장한다.
docker push youngkyonyou/springboot-project:spring
spring이라고 저장된 이미지가 존재하는 것을 볼 수 있다.
다시 클러스터로 돌아와서 yaml 파일을 만든다.
deployment-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: demo
name: demo
spec:
replicas: 1
selector:
matchLabels:
app: demo
strategy: {}
template:
metadata:
labels:
app: demo
spec:
containers:
- image: youngkyonyou/springboot-project:spring
name: kubernetes-spring
설명은 이전 포스트에서 많이 했고 비슷하므로 생략한다.
주의해서 볼 것은 우리가 도커 허브 리포지터리에 올린 이미지를 사용하는 부분이다.
image: youngkyonyou/springboot-project:spring
이제 deployment를 배포한다.
kubectl apply -f deployment-app.yml
성공적으로 만들어졌는지도 확인한다.
kubectl get deployment
이제 expose 명령으로 외부로 노출시켜야 한다.
kubectl expose deployment demo --type=LoadBalancer --name=webapp --port=80 --target-port=8080
위는 컨테이너 포트 8080을 포트 80으로 노출하여 위의 서비스를 노출한다는 것이다.
위와 같이 명령을 입력하고 확인해 본다.
kubectl get service
예시:192.168.1.10:30003
위 사진은 마스터노드와 포트를 사용해 웹에 접근한다.
위 사진은 External IP만을 사용해서 접근한다. 다시 말하지만 expose할 때 port 옵션에 80를 사용하였기 때문에 가능한 것이다. 즉 192.168.1.16:80를 쓴 것과 다름이 없다.