• 【kserve】流量是如何一步一步的转发到kserve具体的容器接口的


    背景

    kserve在kubeflow0.6之后独立出来,在kfserving的基础上做了大量的重构。其重度依赖knative和istio。本文记录kserve启动后,流量如何一步一步通过istio转发给最终的serving的。

    开始

    首先启动一个pmml服务,为了方便理解,该pmml同时启动两个版本,并且灰度:

    apiVersion: serving.kserve.io/v1beta1
    kind: InferenceService
    metadata:
      annotations:
        predict-phantom.wenyangchou.com/group: ""
        predict-phantom.wenyangchou.com/message: ""
        predict-phantom.wenyangchou.com/modelName: test-pmml
        predict-phantom.wenyangchou.com/modelVersion: v20211225.1
      labels:
        predict-phantom.wenyangchou.com/modelName: test-pmml
        predict-phantom.wenyangchou.com/modelVersion: v20211225.1
      name: test-pmml
      namespace: phantom
    spec:
      predictor:
        maxReplicas: 1
        minReplicas: 1
        nodeSelector:
          device: cpu
        pmml:
          resources:
            limits:
              cpu: "2"
              memory: 4Gi
            requests:
              cpu: "2"
              memory: 4Gi
          storageUri: http://dev-predict.wenyangchou.com/predict-fs/v2/file/download/predict-phantom/test-pmml/v20211225.1/model.pmml
    
    apiVersion: serving.kserve.io/v1beta1
    kind: InferenceService
    metadata:
      annotations:
        predict-phantom.wenyangchou.com/group: ""
        predict-phantom.wenyangchou.com/message: ""
        predict-phantom.wenyangchou.com/modelName: test-pmml
        predict-phantom.wenyangchou.com/modelVersion: v20211225.1
      labels:
        predict-phantom.wenyangchou.com/modelName: test-pmml
        predict-phantom.wenyangchou.com/modelVersion: v20211225.1
      name: test-pmml
      namespace: phantom
    spec:
      predictor:
        canaryTrafficPercent: 1
        maxReplicas: 1
        minReplicas: 1
        nodeSelector:
          device: cpu
        pmml:
          resources:
            limits:
              cpu: "2"
              memory: 2Gi
            requests:
              cpu: "2"
              memory: 2Gi
          storageUri: http://dev-predict.wenyangchou.com/predict-fs/v2/file/download/predict-phantom/test-pmml/v20211225.1/model.pmml

    两个版本除了资源不一样,其他都一样。启动之后如下

    test-pmml         http://test-pmml.phantom.dev-predict-phantom.wenyangchou.com         True    99     1        test-pmml-predictor-default-00001   test-pmml-predictor-default-00002         3d

    流量进入

    此时有个http请求: http://test-pmml.phantom.wenyangchou.com/v1/models/test-pmml:predict

    • 请求进入istio的service istio-system/istio-ingressgateway
    • 此时流量第一步匹配gateway knative-serving/knative-ingress-gateway
    MacBook-Pro:~ zhouwenyang$ kc get gateway -A
    NAMESPACE         NAME                      AGE
    knative-serving   knative-ingress-gateway   41d
    knative-serving   knative-local-gateway     41d
    • virtualservice phantom/test-pmml 进行第一步路由,该virtualservice用于路由到具体的算法服务
    kc get virtualservice test-pmml -n phantom -oyaml
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      annotations:
        predict-phantom.wenyangchou.com/group: ""
        predict-phantom.wenyangchou.com/message: ""
        predict-phantom.wenyangchou.com/modelName: test-pmml
        predict-phantom.wenyangchou.com/modelVersion: v20211225.1
      labels:
        predict-phantom.wenyangchou.com/modelName: test-pmml
        predict-phantom.wenyangchou.com/modelVersion: v20211225.1
      name: test-pmml
      namespace: phantom
    spec:
      gateways:
      - knative-serving/knative-local-gateway
      - knative-serving/knative-ingress-gateway
      hosts:
      - test-pmml.phantom.svc.cluster.local
      - test-pmml.phantom.dev-predict-phantom.wenyangchou.com
      http:
      - headers:
          request:
            set:
              Host: test-pmml-predictor-default.phantom.svc.cluster.local
        match:
        - authority:
            regex: ^test-pmml\.phantom(\.svc(\.cluster\.local)?)?(?::\d{1,5})?$
          gateways:
          - knative-serving/knative-local-gateway
        - authority:
            regex: ^test-pmml\.phantom\.dev-predict-phantom\.wenyangchou\.com(?::\d{1,5})?$
          gateways:
          - knative-serving/knative-ingress-gateway
        route:
        - destination:
            host: knative-local-gateway.istio-system.svc.cluster.local
            port:
              number: 80
          weight: 100

    此时可以看到,虽然目前是灰度,但是这里weight还是100,所以灰度不是在这里控制的。这里观察destination

    MacBook-Pro:~ zhouwenyang$ kc get svc -A
    
    NAMESPACE              NAME                                              TYPE           CLUSTER-IP      EXTERNAL-IP                                            PORT(S)                                      AGE
    istio-system           istio-ingressgateway                              NodePort       10.10.102.198   <none>                                                 15021:31507/TCP,80:30000/TCP,443:31381/TCP   41d
    istio-system           istiod                                            ClusterIP      10.10.107.204   <none>                                                 15010/TCP,15012/TCP,443/TCP,15014/TCP        41d
    istio-system           knative-local-gateway                             ClusterIP      10.10.194.194   <none>                                                 80/TCP                                       41d
    phantom                test-pmml                                         ExternalName   <none>          knative-local-gateway.istio-system.svc.cluster.local   <none>                                       3d
    phantom                test-pmml-predictor-default                       ExternalName   <none>          knative-local-gateway.istio-system.svc.cluster.local   80/TCP                                       3d
    phantom                test-pmml-predictor-default-00001                 ClusterIP      10.10.176.106   <none>                                                 80/TCP                                       3d
    phantom                test-pmml-predictor-default-00001-private         ClusterIP      10.10.151.3     <none>                                                 80/TCP,9090/TCP,9091/TCP,8022/TCP,8012/TCP   3d
    phantom                test-pmml-predictor-default-00002                 ClusterIP      10.10.115.151   <none>                                                 80/TCP                                       2d23h
    phantom                test-pmml-predictor-default-00002-private         ClusterIP      10.10.163.195   <none>                                                 80/TCP,9090/TCP,9091/TCP,8022/TCP,8012/TCP   2d23h

    desctination的规则是 {name}.{namespace}.{host},优先匹配{name}.{namespace},在匹配不到的情况下也会去匹配EXTERNAL-IP。因此这里实际匹配到的svc是 istio-system/knative-local-gateway

    根据上面的virtualservice内容信息,流量进入下层的时,请求域名变为 test-pmml-predictor-default.phantom.svc.cluster.local

    • 流量第二步开始匹配gateway knative-serving/knative-local-gateway
    • virtualservice进行第二步路由,路由到真正的svc

    查看virtualservice:test-pmml-predictor-default-ingress

    MacBook-Pro:~ zhouwenyang$ kc get virtualservice test-pmml-predictor-default-ingress -n phantom -oyaml
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      annotations:
        networking.internal.knative.dev/rollout: '{"configurations":[{"configurationName":"test-pmml-predictor-default","percent":1,"revisions":[{"revisionName":"test-pmml-predictor-default-00002","percent":1}],"stepParams":{}}]}'
        networking.knative.dev/ingress.class: istio.ingress.networking.knative.dev
        serving.knative.dev/creator: system:serviceaccount:kserve:default
        serving.knative.dev/lastModifier: system:serviceaccount:kserve:default
      creationTimestamp: "2021-12-25T02:19:58Z"
      generation: 3
      labels:
        networking.internal.knative.dev/ingress: test-pmml-predictor-default
        serving.knative.dev/route: test-pmml-predictor-default
        serving.knative.dev/routeNamespace: phantom
      name: test-pmml-predictor-default-ingress
      namespace: phantom
      ownerReferences:
      - apiVersion: networking.internal.knative.dev/v1alpha1
        blockOwnerDeletion: true
        controller: true
        kind: Ingress
        name: test-pmml-predictor-default
        uid: a6ffa63a-d0c9-40a1-8e6e-19a9de464264
      resourceVersion: "99727359"
      uid: 303d12f7-a1d7-439b-aeb8-bd0a4b6478d6
    spec:
      gateways:
      - knative-serving/knative-ingress-gateway
      - knative-serving/knative-local-gateway
      hosts:
      - prev-test-pmml-predictor-default.phantom
      - prev-test-pmml-predictor-default.phantom.dev-predict-phantom.wenyangchou.com
      - prev-test-pmml-predictor-default.phantom.svc
      - prev-test-pmml-predictor-default.phantom.svc.cluster.local
      - test-pmml-predictor-default.phantom
      - test-pmml-predictor-default.phantom.dev-predict-phantom.wenyangchou.com
      - test-pmml-predictor-default.phantom.svc
      - test-pmml-predictor-default.phantom.svc.cluster.local
      http:
      - headers:
          request:
            set:
              K-Network-Hash: 259ea7ed1c618d64a3c0c2f764261329c99609a53e020219c71d07c8d0c74edd
        match:
        - authority:
            prefix: test-pmml-predictor-default.phantom
          gateways:
          - knative-serving/knative-local-gateway
          headers:
            K-Network-Hash:
              exact: override
        retries: {}
        route:
        - destination:
            host: test-pmml-predictor-default-00002.phantom.svc.cluster.local
            port:
              number: 80
          headers:
            request:
              set:
                Knative-Serving-Namespace: phantom
                Knative-Serving-Revision: test-pmml-predictor-default-00002
          weight: 1
        - destination:
            host: test-pmml-predictor-default-00001.phantom.svc.cluster.local
            port:
              number: 80
          headers:
            request:
              set:
                Knative-Serving-Namespace: phantom
                Knative-Serving-Revision: test-pmml-predictor-default-00001
          weight: 99
      - match:
        - authority:
            prefix: test-pmml-predictor-default.phantom
          gateways:
          - knative-serving/knative-local-gateway
        retries: {}
        route:
        - destination:
            host: test-pmml-predictor-default-00002.phantom.svc.cluster.local
            port:
              number: 80
          headers:
            request:
              set:
                Knative-Serving-Namespace: phantom
                Knative-Serving-Revision: test-pmml-predictor-default-00002
          weight: 1
        - destination:
            host: test-pmml-predictor-default-00001.phantom.svc.cluster.local
            port:
              number: 80
          headers:
            request:
              set:
                Knative-Serving-Namespace: phantom
                Knative-Serving-Revision: test-pmml-predictor-default-00001
          weight: 99

    这边可以看到,test-pmml-predictor-default.phantom的域名生效,转发给具体的svc,并且做了流量权重

    流程图如下:

      

  • 相关阅读:
    Leetcode Python笔记
    Jenkins 自动化构建基于svn的vue项目 ,以及uniapp的H5项目
    Jenkins 持续化部署
    java中的各种锁详细介绍
    Maven私有仓库搭建 Nexu3
    Spring Cloud构建微服务架构(一)服务注册与发现
    SpringCloud学习笔记(开篇)
    介绍一款 redis 可视化工具
    java 在线网络考试系统源码 springboot mybaits vue.js 前后分离跨域
    java OA办公系统源码 Springboot Activiti工作流 vue.js 前后分离 集成代码生成器
  • 原文地址:https://www.cnblogs.com/zhouwenyang/p/15739790.html
Copyright © 2020-2023  润新知