Kubeflow 에 함께 포함된 Selcon Core 를 이용하여 추론 서버를 배포하는 방법에 대해서 알아 보겠습니다.
Istio IngressGateway에 접근하기
Kubeflow 에 함께 포함된 Selcon Core는 트래픽을 전달하기 위해서 Istio를 사용하고 있습니다. 그래서 추론 서버를 배포할 네임스페이스에 Istio와의 연결 통로인 게이트웨이를 먼저 만들어야합니다.
네임스페이스에 kubeflow-gateway
라는 게이트웨이를 만듭니다. 이 게이트웨이를 통해서 요청을 전달 받게 됩니다. 게이트웨이를 정의할 때, selector
를 이용하여 실제 트래픽을 받을 ingressgateway 를 지정해줘야 합니다. 기본적으로는 istio-system
네임스페이스에 있는 istio-ingressgateway
포드를 사용합니다. 그래서 서비스에 정의된 레이블인 istio: ingressgateway
을 selector
를 통해서 지정하였습니다. 별도의 ingressgateway 를 사용하려면 selector
의 조회 조건을 변경하면 됩니다. 예를 들어 kfserving-ingressgateway
를 사용하려면, selector
에 kfserving: 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
kubectl -n istio-system get service kfserving-ingressgateway
은 조회되지 않고
kubectl -n istio-system get service istio-ingressgateway
은 NodePort 타입으로 조회됩니다
따라서 CLUSTER_IP 를 위 방법으로 설정하고,
kubeflow UI를 통해 pipeline을 업로드하여 띄운 InferenceService에
동일한 방법으로 curl을 날리지만 작동하지 않습니다
무슨문제인지 알 수 있을까요?
이 부분이 사용하는 쿠버네티스 환경에 따라서 좀 다릅니다.
kubeflow 1.0 + 인증 환경이라면,istio-ingressgateway 에는 인증(?) 부분이 부여되어 있어서, 일반적인 방법으로는 접근이 차단됩니다.
그래서 별도의 ingressgateway 를 만들어서 사용하는게 편합니다.
주말쯤에 정리해서 올리도록 해볼께요.
수정 버전이 나온거 같네요.
https://github.com/kubeflow/kfserving/blob/master/docs/samples/istio-dex/README.md
참고 하셔서 한번 해보시면 될거 같네요.