Kubernetes

kfserving-1.2

아르비스 2022. 4. 9. 21:22
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: minio-secret    # Secret 명
  namespace: myspace    # Secret이 설치될 Namespace
  annotations:
    serving.kubeflow.org/s3-endpoint: minio-service.kubeflow:9000  # 설치된 Minio 서비스 endpoint
    serving.kubeflow.org/s3-usehttps: "0"   # http를 사용하지 않음 (설치된 Minio 설정)
    serving.kubeflow.org/s3-verifyssl: "0"  # ssy verify 하지 않음 (설치된 Minio 설정)
    serving.kubeflow.org/s3-region: us-east-0
type: Opaque
stringData:
  AWS_ACCESS_KEY_ID: minio
  AWS_SECRET_ACCESS_KEY: minio123
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kfserving-sa    # ServiceAccount 명
  namespace: myspace    # ServiceAccount가 설치될 Namespace
secrets:
- name: minio-secret    # 이 ServiceAccount가 사용할 Secret (위에서 생성한 Secret)
EOF

 

 

  •  minio service 확인 (GCP VM SSH 에서 확인)
    •  endpoit는 <Namespae>.<Service명>:<Port(내부)>
      • Namespae: kubeflow
      • Service명: minio-service
      • Port(내부): 9000
kubectl get svc -A | grep minio
kubeflow      minio-service       NodePort       10.99.254.139    <none>       9000:32001/TCP​

 

 

nferenceService 배포

- 터미널에서 아래 실행 

  (또는 kubectl apply -f covid19-InferenceService.1.2.yaml 실행)

cat << EOF | kubectl apply -f -
apiVersion: serving.kubeflow.org/v1alpha2
kind: InferenceService
metadata:
  name: covid-19        # KFServing InferenceService 명
  namespace: myspace   # KFServing InferenceService가 배포될 Namespace
  annotations:
    sidecar.istio.io/inject: "false"
spec:
  default:
    predictor:
      serviceAccountName: kfserving-sa   # s3:// 레파지토리(Minio)를 사용하기 위해 이 KFServing InferenceService가 사용할 serviceAccount (Step1.에서 생성함)
      tensorflow:
        storageUri: 's3://model/covid-19/'  # 모델을 저장한 경로 s3://<bucket명>/<저장경로>
        resources:
          limits:
            cpu: 100m
            memory: 1Gi
          requests:
            cpu: 100m
            memory: 100Mi
EOF
  • 진행상화 확인 

       #   kubectl get po -n myspace

         STATUS가  'PodInitializing' 이면 대기, 오류인 경우 로그 확인

 

$ kubectl get inferenceservice -n myspace covid-19
NAME      URL                                                     READY   DEFAULT TRAFFIC   CANARY TRAFFIC   AGE
covid-19   http://covid-19.kubeflow.example.com/v1/models/covid-19   True    100                                125m

 

 InferenceService 테스트 (GCP VM SSH 에서 실행)

  • kfserving-ingressgateway를 NodePort로 노출
# kubectl edit svc -n istio-system kfserving-ingressgateway
kubectl edit svc -n istio-system istio-ingressgateway
...
  ports:
...
  - name: https-tracing
    nodePort: 31204
    port: 15032
    protocol: TCP
    targetPort: 15032
  - name: tls
    nodePort: 30103
    port: 15443
    protocol: TCP
    targetPort: 15443
  selector:
    app: istio-ingressgateway
    kfserving: ingressgateway
  sessionAffinity: None
  type: NodePort  # 변경
...

터미널에서 ./kfserving-test.1.2.sh 실행

   또는 아래 구문으로 테스트

MODEL_NAME=covid-19
TEST_JSON="../image_data.json"
 
# Jupyter Notebook Terminal (K8s 내부)에서 실행 시
INGRESS_HOST=istio-ingressgateway.istio-system
INGRESS_PORT=80
 
# Host ssh 접속하여 (K8s 외부) 실행 시
# INGRESS_HOST=<VM 외부 IP>
# INGRESS_PORT=32380
 
SERVICE_HOSTNAME=$(kubectl get inferenceservice -n myspace $MODEL_NAME -o jsonpath='{.status.url}' | cut -d "/" -f 3)
SERVING_URL=http://${INGRESS_HOST}:${INGRESS_PORT}/v1/models/$MODEL_NAME:predict
 
curl -v -H "Host: ${SERVICE_HOSTNAME}" ${SERVING_URL} -d @${TEST_JSON}