kubernetes 用于原始请求的RBAC

kpbwa7wx  于 2023-03-07  发布在  Kubernetes
关注(0)|答案(1)|浏览(111)

尝试弄清楚如何设置RBAC以从自定义指标API读取。
我有一个向Kubernetes公开自定义指标的服务。

/apis/custom.metrics.k8s.io/v1beta1/namespaces/{ns}/services/{svc}/{metric}

端点工作正常,这不是问题所在。
我还有另一个服务,它的作用是检索这些指标并对其进行操作。这在权限不是问题的本地计算机上正常工作,但部署后就不是问题了,这就是问题所在。
为了消除怀疑...部署确实有一个ServiceAccount,还有一个ClusterRole和一个ClusterRoleBinding
那么......这就是我的ClusterRole目前的样子(我肯定里面已经有不必要的东西了)

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: the-thing
rules:
  - apiGroups:
      - apps
    resources:
      - deployments
    verbs:
      - get
      - list
      - patch
      - watch
  - apiGroups:
      - ""
    resources:
      - endpoints
      - namespaces
      - nodes
      - pods
      - services
    verbs: 
      - get
      - list
  - apiGroups:
      - custom.metrics.k8s.io
    resources:
      - "*"
    verbs:
      - "*"

我以为这会归结为custom.metrics.k8s.io组,但显然不是。
如果有人有任何建议,帮助是非常感谢!

k4emjkb1

k4emjkb11#

好吧...回答我自己的问题...
我正在测试服务帐户,看看我是否错过了什么,但它似乎确实有我想要的权限,我用can-i工具检查了一下。

$ kubectl auth can-i get custom_metric_name --as=system:serviceaccount:my-namespace:my-service-account
yes

这就指出了请求本身的一些问题,因为我已经确认容器使用的是正确的服务帐户。
更多背景信息:为此,我使用dotnet client,要检索指标,必须使用Kubernetes示例中的通用HttpClient

Kubernetes client = ...;

HttpClient httpClient = client.HttpClient;

这在本地是有效的,因为不需要凭据,但在集群内部,凭据必须在HttpRequestMessage中设置,然后才能处理,而这部分丢失了。
因为我直接使用HttpClient,所以在请求之前没有设置凭据,实际上,我直接调用GetAsync而不是构造请求消息,设置凭据之后,请求就可以工作了。

var httpRequest = new HttpRequestMessage( HttpMethod.Get, url );

if ( client.Credentials != null )
{
    await client.Credentials.ProcessHttpRequestAsync( httpRequest, cancellationToken );
}

希望这能帮助到一些人...

相关问题