Istio服务间调用:用K8S ServiceAccount认证是否需开启mTLS?
关于K8S ServiceAccount与Istio服务认证的两个问题解答
问题1:在服务间调用场景下,未开启Istio mTLS时,能否使用K8S ServiceAccount对服务客户端进行身份认证?
当然可以,但这得依赖Kubernetes原生机制,而非Istio的能力。当Istio mTLS未开启时,服务间调用走的是普通K8S Service路由,你可以通过以下方式基于ServiceAccount做身份认证:
- 客户端Pod会自动挂载所属ServiceAccount的令牌卷,应用代码可读取路径
/var/run/secrets/kubernetes.io/serviceaccount/token获取令牌 - 将令牌放在请求的
Authorization头中(格式为Bearer <token>)发送给服务端 - 服务端拿到令牌后,调用K8S API的
TokenReview接口验证令牌合法性,并获取对应的ServiceAccount信息,以此完成身份校验
需要注意的是,这种方式需要应用层自行实现,Istio在该场景下不会介入认证逻辑,完全依托K8S原生ServiceAccount机制。
问题2:在Istio中使用K8S ServiceAccount进行服务认证时,是否必须开启mTLS才能使用该功能?
不是必须的,但开启mTLS是Istio原生集成ServiceAccount认证的最优实践,具体区别如下:
- 若关闭mTLS,Istio无法直接帮你基于ServiceAccount完成服务间认证——你仍需像上述场景一样,在应用层手动处理令牌的携带与校验
- 开启Istio mTLS后,Istio会自动将Pod的ServiceAccount信息嵌入双向TLS证书中,服务间调用时,Sidecar代理会自动完成身份校验,无需应用代码做任何修改,这也是Istio官方推荐的用法
- 当然,你也可以在关闭mTLS的情况下,通过自定义Istio的
RequestAuthentication策略,让Sidecar校验请求中的ServiceAccount令牌,但这种方式需要手动配置,且令牌明文传输存在安全风险,一般不建议采用
内容的提问来源于stack exchange,提问作者Youfa Mao
相关产品推荐
相关产品推荐

