我使用的是docker桌面附带的预打包Kubernetes集群。我在一台windows机器上,使用WSL2在Ubuntu-18.04虚拟机上运行Kubernetes。在我的Kubernetes集群上运行:
istioctl install --set profile=demo --set values.global.jwtPolicy=third-party-jwt
但我得到的信息是:
Detected that your cluster does not support third party JWT authentication. Falling back to less secure first party JWT. See https://istio.io/v1.9/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for details.
在那之后,它会冻结,直到超时:
Processing resources for Istiod. Waiting for Deployment/istio-system/istiod
有没有办法在我的集群中启用第三方JWT?
在您收到的错误消息中,有一个链接指向有关该特定问题的文档:
- Istio.io:最新:文档:操作:最佳实践:安全:配置第三方服务帐户令牌
引用官方文件:
配置第三方服务帐户令牌
要使用Istio控制平面进行身份验证,Istio代理将使用服务帐户令牌。Kubernetes支持两种形式的代币:
第三方令牌,具有一定范围的受众和过期时间。第一方代币,没有过期,安装在所有pod中。由于第一方代币的属性不太安全,Istio将默认使用第三方代币。然而,并不是所有的Kubernetes平台都启用了此功能。
如果您使用istioctl进行安装,将自动检测到支持。这也可以手动完成,并通过传递
--set values.global.jwtPolicy=third-party-jwt
或--set values.global.jwtPolicy=first-party-jwt
进行配置。要确定集群是否支持第三方令牌,请查找TokenRequest API。如果没有响应,则不支持该功能:
$ kubectl get --raw /api/v1 | jq '.resources[] | select(.name | index("serviceaccounts/token"))'
{ "name": "serviceaccounts/token", "singularName": "", "namespaced": true, "group": "authentication.k8s.io", "version": "v1", "kind": "TokenRequest", "verbs": [ "create" ] }
虽然现在大多数云提供商都支持这一功能,但许多本地开发工具和自定义安装可能不早于Kubernetes 1.20。要启用此功能,请参阅Kubernetes文档。
我不确定使用Docker Desktop创建的Kubernetes(1.19.7
(是否支持此功能,但Kubernete文档显示了如何启用它:
服务帐户代币数量预测
功能状态:Kubernetes v1.20[稳定]
注意:
要启用和使用令牌请求投影,必须为kube-apiserver指定以下每个命令行参数:
--service-account-issuer --service-account-key-file --service-account-signing-key-file --api-audiences
您可以用Kubernetes在Docker Desktop中以一种有点技巧的方式编辑kubeapi-server
清单。你可以按照这个答案(我是这个答案的作者(阅读更多关于它的信息:
- Stackoverlow.com:问题:Windows上Docker Desktop的Kubernetes配置目录的位置
解决方法
当您在主机上使用Docker时,您也可以考虑将minikube
与其--driver=docker
一起使用。它支持Istio文档中描述的第三方JWT令牌(它通过$ kubectl get --raw ...
命令生成响应(。
旁注!
我已经在
minikube
版本1.19.0
和Kubernetes版本1.20.2
上进行了测试。