들어가며
- 이 글에서는 TwinReader가 운영되는 서버 내 Application을 pod로 띄우는 방법을 예시로 알아봅니다.
- 이 글에서는 JAVA 8로 build 한 jar파일을 예시로 사용하였습니다.
1. Dockerfile 작성 예시
- Dockerfile이 위치하는 경로는 Build 된 jar 파일이 있는 경로와 일치시켜 줍니다.
FROM openjdk:8-jdk ADD hylee-0.0.1-SNAPSHOT.jar /home/hylee-0.0.1-SNAPSHOT.jar ENTRYPOINT ["java","-jar","/home/hylee-0.0.1-SNAPSHOT.jar"]
- FROM openjdk:8-jdk
: jar 파일을 Build한 버전을 사용하여 줍니다.
: 해당 예시에서는 java-8을 사용하였습니다.
- ADD hylee-0.0.1-SNAPSHOT.jar /home/hylee-0.0.1-SNAPSHOT.jar
- hylee-0.0.1-SNAPSHOT.jar
: 작성한 jar 파일 명을 입력합니다.
- /home/hylee-0.0.1-SNAPSHOT.jar
: 컨테이너 내 위치 할 경로를 입력합니다.
- ENTRYPOINT ["java","-jar","/home/hylee-0.0.1-SNAPSHOT.jar"]
- 해당 명령어는 컨테이너가 실행 되었을 때 jar 파일이 실행 될 수 있도록 합니다.
2. Docker Image build
- 작성한 Dockerfile을 활용하여 Docker Image를생성합니다.
docker build -t {AppName}:{Tag} .
- AppName
: Docker Image가 생성 될 때 사용되는 이름입니다.
- Tag
: 다른 이미지와 구별되도록 하는 값으로 유일한 값으로 설정해 주시기 바랍니다.
- build 한 이미지 확인
- 위에서 선언한 AppName으로 검색합니다.
docker images | grep {AppName}
2. Kubernetes yaml
a. deployment.yaml 수정
apiVersion: v1 kind: Service metadata: name: app-deploy-service labels: app: twinreader-deploy spec: selector: app: twinreader-deploy type: ClusterIP ports: - name: http port: 8088 protocol: TCP targetPort: 8080 --- apiVersion: apps/v1 kind: Deployment metadata: name: twinreader-deployment-service labels: app: twinreader-deploy spec: replicas: 1 selector: matchLabels: app: twinreader-deploy template: metadata: labels: app: twinreader-deploy spec: containers: - name: twinreader-deploy-service image: hohospring:0511 imagePullPolicy: Never volumeMounts: - name: data-volume mountPath: /data ports: - containerPort: 8080 volumes: - name: data-volume hostPath: path: /data/twinreader type: DirectoryOrCreate |
- port: 8088
: 실행 시킬 pod의 port를 설정하는 부분으로 다른 pod들의 port와 중복되지 않도록 설정합니다.
- image
: 위에서 build 한 Docker Image의 AppName과 Tag를 지정하여줍니다.
- path
: 서버와 컨테이너 내부와 mount 되는 경로입니다.
: 컨테이너 내에서 사용할 파일이 있을 경우 이 경로에 넣어줍니다.
: 이 예시에서는 실행한 pod에서 TwinReader로 이미지 분석을 요청하기 위해 Twinreader data 경로를 입력하였습니다.
- metadata:name
: ingress.yaml 에서 사용되는 이름으로 만약 변경 시 ingress.yaml에서도 같은 이름으로 변경해 주셔야 합니다.
b. Ingress.yaml
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: twinreader-app-deploy labels: app: twinreader-deploy annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/proxy-connect-timeout: "70000" nginx.ingress.kubernetes.io/proxy-body-size: "0" nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - http: paths: - path: /app-deploy-service(/|$)(.*) backend: serviceName: app-deploy-service servicePort: 8088 |
- /app-deploy-service
: 서버 IP 뒤 해당 path를 입력하면 jar 파일이 운영되는 pod로 요청이 들어갑니다. - serviceName
: deployment.yaml에서 생성한 이름으로 동일하게 합니다.
- servicePort
: 실행시킬 pod의 port 번호로 deployment.yaml에서 선언한 port 번호로 동일하게 합니다.
3. Kubernetes pod 실행
- pod 실행 순서는 ingress.yaml을 실행 시킨 후 deployment.yaml을 실행하시기 바랍니다.
kubectl apply -f app-deployment-ingress.yaml
kubectl apply -f deployment.yaml
- 정상 실행 되었는지 확인
kubectl get pod
kubectl get svc
kubectl get ingress
4. pod test
ⓐ pod 내에서 jar 파일이 잘 실행 되고 있는지 확인해 봅니다.
(* 해당 글에서는 간단한 'Hello World'가 출력되는 jar 파일을 사용하였습니다.)
ⓑ 생성한 pod 내로 접근하여 twinreader로 이미지 분석을 요청합니다.
ㄱ. ingress 주소를 확인합니다.
kubectl get ing kubectl describe ing {조회한 ingress 이름}
ㄴ. 생성한 pod 내로 접근합니다.
kubectl exec -it {생성한 pod name} -- bash
ㄷ. 접근한 pod 내에서 이미지 분석 요청을 합니다.
curl http://{조회한 ingress 주소}/api/v2/flow/twrd \ --request POST \ --header "Content-Type: application/json" \ --data '{"pipelineName": "inference", "requestId":"invoice_sample", "pathList": ["/{분석 요청 이미지 directory name}/"]}'
- 정상적으로 요청이 전달 되어 "success":true 가 출력 된 것을 확인할 수 있습니다.
마무리
- 해당 예시의 경우 간단한 문장이 출력 되는 jar 파일을 활용하여 pod로 실행하는 방법에 대해 알아보았습니다.
- Dockerfile 작성의 경우 예시 이외의 옵션을 추가하여 변경하여 사용하실 수 있습니다.
아티클이 유용했나요?
훌륭합니다!
피드백을 제공해 주셔서 감사합니다.
도움이 되지 못해 죄송합니다!
피드백을 제공해 주셔서 감사합니다.
피드백 전송
소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.