Kubeflow 1.0.0에서 InferenceService 의 상태 갱신이 실패할때

Kubeflow 1.0.0 이나 1.0.1에서 kfserving이 정상적으로 작동하지 않는 분을 위해서 참고삼아 적어 봅니다.

Kubeflow 설치 환경이 워낙 다양하고, 설치 환경 파일도 다양하기 때문에 이 글이 의미가 없을 수도 있습니다.

그리고, 이 방법은 정상적인 방법이 아니기 때문에, 단순히 테스트 삼아 KFServing을 사용하는게 목적일때만 사용하시기 바랍니다.

혹시 업그레이드가 가능하신 분들은 최신 버전으로 업데이트해 보시기 바랍니다.


KFServing는 InferenceService 라는 사용자 리소스를 사용합니다. InferenceService 는 정의한 추론 서버를 실행시킨 다음, 서버가 정상적으로 구동되었는지를 체크하는데, 환경에 따라서 이 상태 체크가 정상적으로 안되는 문제가 있습니다. 그 이유는 istio 때문입니다. Kubeflow에서 인증/권한을 위해서 istio를 사용합니다. InferenceService 를 관리하는 컨트롤러에서 상태 체크를 위해서 URL을 호출하는데, istio에서 인증/권한 체크 부분 때문에 200 OK가 반환되지 않는 문제가 생기는 것이죠. 그래서 실패한 상태로 인식이 되고, InferenceService 가 정상작동하지 않습니다.

이 문제를 제대로 해결하기 위해서는, Kubeflow에서 해결해 줄때까지 기다리던지, 아니면, kfserving + istio 전문가를 부르면 됩니다.

하지만 그럴 여건이 안되거나, 단순히 취미 생활로 KFServing 을 사용할 예정이라면, 다음과 같이 작동하게는 바꿀 수 있습니다. (권장하는 방법은 아닙니다.)

KFServing 에서 사용하는 istio-ingressgateway를 만들고, 보안 설정 부분을 삭제하는 것입니다.

먼저 kfserving-ingressgateway 을 생성합니다. 만약 생성되어 있다면 무시하시면 됩니다. 보통 istio-system 네임스페이스나, knative-serving 네임스페이스 존재할 수 있습니다. DeploymentService 를 확인해 보시면 됩니다.

 $ kubectl -n istio-system get deploy
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
cluster-local-gateway      1/1     1            1           54d
istio-citadel              1/1     1            1           54d
istio-galley               1/1     1            1           54d
istio-ingressgateway       1/1     1            1           54d
istio-pilot                1/1     1            1           54d
istio-policy               1/1     1            1           54d
istio-sidecar-injector     1/1     1            1           54d
istio-telemetry            1/1     1            1           54d
kfserving-ingressgateway   1/1     1            1           54d
prometheus                 1/1     1            1           54d
$ kubectl -n istio-system get service
NAME                       TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                                                                                                                                   AGE
authservice                ClusterIP      10.98.242.196    <none>        8080/TCP                                                                                                                                                                                  54d
cluster-local-gateway      ClusterIP      10.109.28.157    <none>        80/TCP,443/TCP,31400/TCP,15011/TCP,8060/TCP,15029/TCP,15030/TCP,15031/TCP,15032/TCP                                                                                                       54d
istio-citadel              ClusterIP      10.102.226.47    <none>        8060/TCP,15014/TCP                                                                                                                                                                        54d
istio-galley               ClusterIP      10.111.115.206   <none>        443/TCP,15014/TCP,9901/TCP                                                                                                                                                                54d
istio-ingressgateway       NodePort       10.103.205.239   <none>        15020:30536/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:32168/TCP,15030:32077/TCP,15031:31505/TCP,15032:32021/TCP,15443:31546/TCP                                                54d
istio-pilot                ClusterIP      10.110.53.9      <none>        15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                                                                                    54d
istio-policy               ClusterIP      10.106.248.16    <none>        9091/TCP,15004/TCP,15014/TCP                                                                                                                                                              54d
istio-sidecar-injector     ClusterIP      10.105.132.134   <none>        443/TCP,15014/TCP                                                                                                                                                                         54d
istio-telemetry            ClusterIP      10.105.24.245    <none>        9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                                                                                    54d
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   54d
prometheus                 ClusterIP      10.101.81.54     <none>        9090/TCP                                                                                                                                                                                  54d

만약 없다면 생성해 줍니다.

kubeflow 네임스페이스에 있는 inferenceservice-config라는 ConfigMap을 수정해 줍니다. inferenceservice-configingress 부분의 ingressService 를 앞서 생성했거나, 존재하는 kfserving-ingressgateway 으로 수정해 줍니다. 주소 형식은 “서비스명.네임스페이스.svc.cluster.local” 입니다.

$ kubectl -n kubeflow edit cm inferenceservice-config 

apiVersion: v1
data:
...
  ingress: |-
    {
        "ingressGateway" : "knative-ingress-gateway.knative-serving",
        "ingressService" : "kfserving-ingressgateway.istio-system.svc.cluster.local"
    }
...

설정이 변경이 되었으면, 혹시 모르니 kfserving-controller-manager 를 재시작해 줍니다.

그리고, istio RBAC 설정이 담겨 있는 clusterrbacconfig 을 삭제합니다.

$ kubectl get clusterrbacconfig
$ kubectl delete clusterrbacconfig XXXX

이제 kfserving-ingressgateway 의 주소로 요청을 보낼 수 있고, 상태가 갱신되는것을 확인할 수 있습니다. 아.마.도….