Application을 pod로 실행 하는 방법

작성자 이호영 수정일 2023-05-15 08:53

들어가며

  • 이 글에서는 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 작성의 경우 예시 이외의 옵션을 추가하여 변경하여 사용하실 수 있습니다. 

아티클이 유용했나요?

훌륭합니다!

피드백을 제공해 주셔서 감사합니다.

도움이 되지 못해 죄송합니다!

피드백을 제공해 주셔서 감사합니다.

아티클을 개선할 수 있는 방법을 알려주세요!

최소 하나의 이유를 선택하세요
CAPTCHA 확인이 필요합니다.

피드백 전송

소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.

02-558-8300