Seldon Core – 사전 패키지된 추론 서버들

Kubeflow 에 함께 포함된 Selcon Core 를 이용하여 추론 서버를 배포하는 방법에 대해서 알아 보겠습니다.

Istio IngressGateway에 접근하기

Kubeflow 에 함께 포함된 Selcon Core는 트래픽을 전달하기 위해서 Istio를 사용하고 있습니다. 그래서 추론 서버를 배포할 네임스페이스에 Istio와의 연결 통로인 게이트웨이를 먼저 만들어야합니다.

네임스페이스에 kubeflow-gateway라는 게이트웨이를 만듭니다. 이 게이트웨이를 통해서 요청을 전달 받게 됩니다. 게이트웨이를 정의할 때, selector 를 이용하여 실제 트래픽을 받을 ingressgateway 를 지정해줘야 합니다. 기본적으로는 istio-system 네임스페이스에 있는 istio-ingressgateway 포드를 사용합니다. 그래서 서비스에 정의된 레이블인 istio: ingressgatewayselector 를 통해서 지정하였습니다. 별도의 ingressgateway 를 사용하려면 selector 의 조회 조건을 변경하면 됩니다. 예를 들어 kfserving-ingressgateway를 사용하려면, selectorkfserving: ingressgateway 를 지정하면 됩니다.

kubeflow-gateway.yaml

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: kubeflow-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - '*'
    port:
      name: http
      number: 80
      protocol: HTTP

admin 네임스페이스에 Gateway 를 생성합니다.

kubectl -n admin apply -f kubeflow-gateway.yaml

kfserving-ingressgateway를 조회해 보겠습니다.

다음은 istio-system 네임스페이스에 있는 kfserving-ingressgateway을 조회하는 예제입니다.

kubectl -n istio-system get service kfserving-ingressgateway 

KFServing이 설치된 쿠버네티스 클러스터에 따라 결과가 다르게 나옵니다. 응답 결과에 따른 크게 세가지 방법으로 접근 할 수 있습니다.

  • LoadBalancer 를 통해서 접근하기
  • NodePort를 통해서 접근하기
  • kubectl port-forward를 통해서 접근하기

LoadBalancer

쿠버네티스 클러스터가 LoadBalancer 를 지원하면 다음과 같은 결과를 얻을 수 있습니다. 서비스의 타입이 LoadBalancer 이고, EXTERNAL-IP 에 IP가 할당되어 있습니다. 이럴 경우에는 EXTERNAL-IP 를 통해서 ingressgateway에 접근할 수 있습니다.

NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                                                                                                                                   AGE
kfserving-ingressgateway   LoadBalancer   10.101.141.37   10.201.121.4  15020:30543/TCP,80:32380/TCP,443:32390/TCP,31400:32400/TCP,15011:30263/TCP,8060:32119/TCP,853:32180/TCP,15029:32156/TCP,15030:30674/TCP,15031:30230/TCP,15032:32563/TCP,15443:30995/TCP   2d23h

앞으로 만들 예제에서 사용하기 위해서 ingressgateway 의 접근 주소를 다음과 같이 정의하겠습니다. EXTERNAL-IP 주소를 사용합니다.

CLUSTER_IP=10.201.121.4

NodePort

쿠버네티스 클러스터가 LoadBalancer 를 지원하지 않거나, 서비스의 타입이 NodePort 인 경우 EXTERNAL-IP 의 값이 비어 있습니다. 이럴 경우에는 클러스터의 노드 IP 와 NodePort를 통해서 접근할 수 있습니다.

NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                                                                                                                                   AGE
kfserving-ingressgateway   LoadBalancer   10.101.141.37   <pending>     15020:30543/TCP,80:32380/TCP,443:32390/TCP,31400:32400/TCP,15011:30263/TCP,8060:32119/TCP,853:32180/TCP,15029:32156/TCP,15030:30674/TCP,15031:30230/TCP,15032:32563/TCP,15443:30995/TCP   2d23h

노드 IP는 노드를 조회하면 알 수 있습니다.

다음은 노드를 조회 하는 예제입니다.

kubectl get node -o wide

정상적으로 조회되면 다음과 같은 응답 결과가 나옵니다.

NAME     STATUS   ROLES    AGE   VERSION    INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
mortar   Ready    master   13d   v1.15.10   192.168.21.38   <none>        Ubuntu 18.04.3 LTS   4.15.0-91-generic   docker://18.9.9

노드가 한 개가 아닌 경우에는 여러개의 노드 정보가 출력됩니다. 해당 노드들 중에서 아무 노드의 INTERNAL-IP 를 사용하면 됩니다.

앞으로 만들 예제에서 사용하기 위해서 ingressgateway 의 접근 주소를 다음과 같이 정의하겠습니다. 노드의 IP 와 80 PORT(80:32380/TCP)의 노드 포트인 32380을 포트로 사용합니다.

CLUSTER_IP=192.168.21.38:32380

port-forward

외부에서 쿠버네티스 클러스터의 서비스에 접근할 수 없는 경우, kubectl 의 port-forward를 사용할 수 있습니다. 접근 하려는 외부 시스템에서 다음 명령어 실행하면 로컬 포트를 경유 해서 쿠버네티스 서비스에 접근할 수 있습니다.

kubectl -n istio-system port-forward svc/kfserving-ingressgateway 8080:80

포트 포워딩이 정상적으로 실행되면, 로컬포트로 ingressgateay 서비스로 접근할 수 있습니다. http://localhost:8080 처럼 선언한 로컬 포트의 주소로 접근하면, 쿠버네티스 ingressgateway 의 80 포트로 포워딩 됩니다.

앞으로 만들 예제에서 사용하기 위해서 ingressgateway 의 접근 주소를 다음과 같이 정의하겠습니다.

CLUSTER_IP=localhost:8080

PVC 생성하기

SeldonDeployment 에 사용할 모델은 PVC에 저장하겠습니다. 만약 클라우드 스토리지와 같은 다른 저장소를 사용하려면, “클라우드 저장소를 이용하여 InfeerneceService 배포와 예측”을 참조하시기 바랍니다.

seldon-models-pvc라는 PVC 매니페스트를 작성합니다.

seldon-models-pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: seldon-models-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

다음 명령어를 실행하여, admin 네임스페이스에 seldon-models-pvc라는 PVC를 생성하겠습니다.

kubectl -n admin apply seldon-models-pvc.yaml

SKLearn Server

XGBoost Server

MLflow Server

Tensorflow Serving

“Seldon Core – 사전 패키지된 추론 서버들”에 대한 5개의 댓글

  1. kubectl -n istio-system get service kfserving-ingressgateway
    은 조회되지 않고
    kubectl -n istio-system get service istio-ingressgateway
    은 NodePort 타입으로 조회됩니다

    따라서 CLUSTER_IP 를 위 방법으로 설정하고,
    kubeflow UI를 통해 pipeline을 업로드하여 띄운 InferenceService에
    동일한 방법으로 curl을 날리지만 작동하지 않습니다
    무슨문제인지 알 수 있을까요?

    1. 이 부분이 사용하는 쿠버네티스 환경에 따라서 좀 다릅니다.
      kubeflow 1.0 + 인증 환경이라면,istio-ingressgateway 에는 인증(?) 부분이 부여되어 있어서, 일반적인 방법으로는 접근이 차단됩니다.
      그래서 별도의 ingressgateway 를 만들어서 사용하는게 편합니다.
      주말쯤에 정리해서 올리도록 해볼께요.

  2. 안녕하세요 SeldonDeployment로 모델 배포후 올려주신 yaml과 동일하게 selector:
    istio: ingressgateway
    설정하여 Gateway 생성하였습니다
    (kubectl -n istio-system get service istio-ingressgateway 적용시 nodeport type으로 정상적으로 나옵니다.)

    curl -X http://{clusterip}/seldon/{namespace}/{modelname}/api/v1.0/predictions -H ‘Content-Type: application/json’ -d {datapath}

    요청을 보냈을때 404 not found가 뜨는데 뭔가 빠진게 있을까요?

    참고로 배포된 seldon deployment svc를 port-forwarding 해서 요청을 보냈을때는 정상적으로 prediction이 오는 상태입니다. ingress를 적용하려고 하는데 어려움이 있네요..

    1. kubeflow 네임스페이스 있는 seldon-controller-manager 디플로이먼트의 환경변수의 ISTIO_GATEWAY 값이 사용하는 ingressgateway와 일치하시는지 먼저 확인해보시는게 좋을거 같네요.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다