KServe sklearn-iris示例请求遇302认证问题,求解决方案
KServe sklearn-iris模型302认证问题解决方案
一、完成Dex认证并成功连接
CLI方式获取Token并请求
- 先获取Dex服务地址:
集群内访问用ClusterIP,外部访问需确认NodePort或Ingress配置。kubectl get svc dex -n auth - 发送认证请求获取access_token:
注:client_id和secret是Kubeflow默认值,若有修改需对应调整,可通过curl -k -X POST https://<dex-service-address>/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=password" \ -d "username=<你的Kubeflow用户名>" \ -d "password=<你的Kubeflow密码>" \ -d "client_id=kubeflow-oidc-authservice" \ -d "client_secret=kubeflow-oidc-authservice-secret"kubectl get secrets -n auth查看。 - 用拿到的access_token发送预测请求:
curl -k -H "Authorization: Bearer <获取到的access_token>" \ https://<KServe-Ingress地址>/v1/models/sklearn-iris:predict \ -d @input.json
浏览器Cookie方式
- 访问Kubeflow登录页面完成登录,打开浏览器开发者工具(F12),在Cookie中找到
authservice_session字段并复制其值。 - 带上Cookie发送请求:
之前浏览器返回404,大概率是Istio网关未正确路由Dex登录路径,可检查Kubeflow的Istio虚拟服务配置。curl -k -H "Cookie: authservice_session=<复制的Cookie值>" \ https://<KServe-Ingress地址>/v1/models/sklearn-iris:predict \ -d @input.json
二、绕过Dex认证(仅用于测试环境)
方法1:给目标InferenceService配置允许匿名访问的AuthorizationPolicy
在kserve-test命名空间创建配置文件allow-all-authz.yaml:
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allow-sklearn-iris namespace: kserve-test spec: rules: - {} selector: matchLabels: serving.kubeflow.org/inferenceservice: sklearn-iris
应用配置:
kubectl apply -f allow-all-authz.yaml
方法2:修改Authservice配置豁免KServe预测路径
- 编辑Authservice的配置映射:
kubectl edit configmap authservice -n auth - 在
config.yaml的skip_auth_urls字段中添加KServe的预测路径:skip_auth_urls: - "/v1/models/*:predict" - "/v1/models/*:explain" - 重启Authservice生效:
kubectl rollout restart deployment authservice -n auth
方法3:配置Istio虚拟服务直接路由到Predictor服务
创建虚拟服务配置kserve-bypass-auth.yaml:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: sklearn-iris-bypass namespace: kserve-test spec: hosts: - "<你的Ingress域名/IP>" gateways: - kubeflow-gateway http: - match: - uri: prefix: "/v1/models/sklearn-iris" route: - destination: host: sklearn-iris-predictor-default.kserve-test.svc.cluster.local port: number: 8080
应用配置后直接发送请求即可绕过认证。
三、排查示例部署错误
- 检查InferenceService状态:
确认STATUS为kubectl get inferenceservices sklearn-iris -n kserve-testReady,若不是查看事件信息:kubectl describe inferenceservices sklearn-iris -n kserve-test - 查看Predictor Pod日志,排查启动或运行错误:
kubectl logs -l serving.kubeflow.org/inferenceservice=sklearn-iris,component=predictor -n kserve-test - 检查Knative服务状态:
确认READY状态为kubectl get ksvc sklearn-iris-predictor-default -n kserve-testTrue,否则查看Knative服务事件。 - 集群内直接测试服务连通性:
启动临时curl Pod测试内部访问:
如果内部访问成功,说明问题出在Ingress层的认证或路由;若失败则是模型服务本身部署有问题。kubectl run -it --rm curl-test --image=curlimages/curl --restart=Never -- \ curl http://sklearn-iris-predictor-default.kserve-test.svc.cluster.local/v1/models/sklearn-iris:predict \ -d @input.json
内容的提问来源于stack exchange,提问作者TaeUk Noh
相关产品推荐
相关产品推荐

