我在Ubuntu上发送了一个运行Kubernetes的4节点集群(1个主3个工作者)。我打开--authorization-mode = ABAC并设置一个带有如下条目的策略文件
{“user”:“bob”,“readonly”:true,“namespace”:“projectgino”}
我希望用户bob只能查看projectgino中的资源。我在使用kubectl命令行作为用户Bob时遇到问题。当我运行以下命令时
kubectl get pods --token = xxx --namespace = projectgino --server = https://xxx.xxx.xxx.xx:6443
我收到以下错误
错误:无法从服务器读取版本:服务器不允许访问所请求的资源
我跟踪了kubectl命令行代码,问题似乎是由pkg / client / helper.go中的kubectl调用函数NegotiateVersion引起的。这会调用服务器上的/ api来获取Kubernetes的版本。此调用失败,因为其余路径不包含名称空间projectgino。我将跟踪代码添加到pkg / auth / authorizer / abac / abac.go,并且在命名空间检查时失败。
我还没有提升最新的1.1版Kubernetes,但是看看代码我没看到这个领域发生了什么变化。
有人知道如何配置Kubernetes以解决问题吗?
答案 0 :(得分:1)
这是ABAC authorizer中缺少的功能。修复程序正在进行中:#16148。
至于解决方法,来自the authorization doc:
对于其他端点,例如 / version,资源是空字符串。
因此,您可以通过定义政策来解决问题:
{"用户":" bob"," readonly":true,"资源":"" }
(请注意资源的空字符串)以授予对未版本化端点的访问权限。如果这不起作用,我认为没有一个干净的解决方法可以让你使用kubectl和--authorization-mode = ABAC。