尝试从 Pod 访问 Kubernetes API 时出现 403 Forbidden 错误

anu*_*lan 8 google-cloud-platform kubernetes kubernetes-apiserver

根据此文档,我尝试使用以下命令从 pod 访问 Kuberenetes API

curl --cacert ca.crt -H "Authorization: Bearer $(<token)" https://kubernetes/apis/extensions/v1beta1/namespaces/default/deployments/ballerina-prime/scale

遵循以下模板

curl --cacert ca.crt -H "Authorization: Bearer $(<token)" https://kubernetes/apis/extensions/v1beta1/namespaces/{namespace}/deployments/{name}/scale

它抛出以下错误

{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Failure",
  "message": "deployments.extensions \"ballerina-prime\" is forbidden: User \"system:serviceaccount:default:default\" cannot get resource \"deployments/scale\" in API group \"extensions\" in the namespace \"default\"",
  "reason": "Forbidden",
  "details": {
    "name": "ballerina-prime",
    "group": "extensions",
    "kind": "deployments"
  },
  "code": 403
}
Run Code Online (Sandbox Code Playgroud)

有人可以指出我在哪里犯了错误,或者建议我访问 Kubernetes API 的任何其他方式吗?

更新01

我根据建议的文档创建了一个角色。以下是我使用的清单。

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: deployments-and-deployements-scale
rules:
- apiGroups: [""]
  resources: ["deployments", "deployments/scale"]
  verbs: ["get", "list"]
Run Code Online (Sandbox Code Playgroud)

我使用这个命令应用它。kubectl apply -f deployments-and-deployements-scale.yaml。我仍然无法访问所需的端点。我哪里出错了?

Nic*_*_Kh 7

正如 @Thomas 在他的答案下面的评论中提到的,您需要通过RoleBinding资源将特定角色分配给目标服务帐户,才能解决此授权问题。

参考您的清单:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: deployments-and-deployements-scale
rules:
- apiGroups: ["extensions", "apps"]
  resources: ["deployments", "deployments/scale"]
  verbs: ["get", "list"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: deployments-and-deployements-scale-rb
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
roleRef:
  kind: Role
  name: deployments-and-deployements-scale
  apiGroup: ""
Run Code Online (Sandbox Code Playgroud)

apiGroups:您可以考虑在角色定义中显式设置、匹配特定API组或广泛["*"]搜索所有 API 版本。


Tho*_*mas 6

首先,您已正确连接到 kubernetes API!

但是您使用的默认服务帐户(“用户”)没有执行您想要执行的操作所需的权限。(读取命名空间“default”中的部署“ballerina-prima”)

您需要执行的操作:使用不同的服务帐户或向默认服务帐户授予所需的权限。

您可以在文档中找到详细信息:https://kubernetes.io/docs/reference/access-authn-authz/rbac/

  • 除了将角色分配给主体(用户)之外,您还需要 RoleBinding。 (2认同)