部署Istio后服务出现ISTIO-403 Forbidden错误的原因是什么
Istio部署后浏览器跨服务访问返回403 Forbidden的可能原因
- 授权策略(AuthorizationPolicy)配置规则仅放行集群内部流量:如果你的AuthorizationPolicy的
from字段仅匹配集群内服务的身份标识(比如source.principal绑定了集群内服务的ServiceAccount),浏览器发起的外部请求没有对应内部身份凭证,会被直接拦截返回403,而集群内部服务调用因为自带符合要求的身份标识所以访问正常。 - 身份认证规则拦截外部请求:如果你配置了RequestAuthentication规则要求请求必须携带合法JWT令牌,浏览器请求未携带符合要求的令牌时会被直接返回403,集群内部服务调用默认不需要经过JWT校验所以可正常访问。
- CORS配置错误:如果浏览器发起的是跨域请求,Istio的VirtualService/Gateway配置的CORS规则未允许对应请求源、请求方法或者请求头,会直接拒绝跨域预检请求返回403。你可以执行
kubectl describe virtualservice <目标服务虚拟服务名称>查看corsPolicy字段的配置是否符合预期。 - 入口网关流量匹配规则异常:如果VirtualService的
hosts字段仅配置了集群内部的服务域名(比如xxx.default.svc.cluster.local),浏览器请求用的是外部域名无法匹配到规则,会被Istio网关默认拒绝返回403。 - mTLS配置不匹配:如果PeerAuthentication配置了严格的mTLS模式,但是入口网关到目标服务的流量未开启mTLS,那么网关发起的请求无法通过目标服务Sidecar的证书校验会被返回403,而集群内部服务之间因为Sidecar自动注入了mTLS证书所以可正常访问。
快速排查参考:可先执行
kubectl get authorizationpolicies -A查看是否有限制外部流量的授权规则,再执行kubectl logs -n istio-system <入口网关Pod名称> | grep 403查看网关的拦截日志定位具体原因。
内容的提问来源于stack exchange,提问作者Sanoj
相关产品推荐
相关产品推荐

