从 Pod 调用 Kubernetes API 时接收错误

edd*_*yuk -1 kubernetes

我有容器化的 .NET Standard (4.7.2) 简单应用程序。它有一个方法来列出集群中的所有名称空间。我使用csharp kubernetes 客户端与 API 进行交互。根据官方文档, API服务器的默认凭证是在pod中创建的,并用于与API服务器通信,但是从pod调用kubernetes API时,出现以下错误:

操作返回无效状态代码“禁止”

我的部署 yaml 非常小: apiVersion: v1 kind: Pod metadata: name: cmd-dotnetstdk8stest spec: nodeSelector: kubernetes.io/os: windows containers: - name: cmd-dotnetstdk8stest image: eddyuk/dotnetstdk8stest:1.0.8-cmd ports: - containerPort: 80

ale*_*r96 5

我认为您的集群中有 RBAC 激活。您需要为包含角色的 Pod 分配一个 ServiceAccount,该角色允许该 ServerAccount 获取所有命名空间的列表。当 Pod-Template 中未指定 ServiceAccount 时,命名空间默认 ServiceAccount 将分配给在此命名空间中运行的 pod。

首先,您应该创建角色

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: <YOUR NAMESPACE>
  name: namespace-reader
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["namespaces"] # Resource is namespaces
  verbs: ["get", "list"] # Allowing this roll to get and list namespaces
Run Code Online (Sandbox Code Playgroud)

在您的命名空间中创建一个新的 ServiceAccount

apiVersion: v1
kind: ServiceAccount
metadata:
  name: application-sa
  namespace: <YOUR-NAMESPACE>
Run Code Online (Sandbox Code Playgroud)

将您创建的角色分配给服务帐户:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: allow-namespace-listing
  namespace: <YOUR-NAMESPACE>
subjects:
- kind: ServiceAccount
  name: application-sa # Your newly created Service-Account
  namespace: <YOUR-NAMESPACE>
roleRef:
  kind: Role
  name: namespace-reader # Your newly created Role
  apiGroup: rbac.authorization.k8s.io
Run Code Online (Sandbox Code Playgroud)

通过将 ServiceAccount 添加到 Pod Spec 来将新角色分配给您的 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: podname
  namespace: <YOUR-NAMESPACE>
spec:
  serviceAccountName: application-sa
Run Code Online (Sandbox Code Playgroud)

您可以在官方文档中阅读有关 RBAC 的更多信息。也许您想使用 kubectl-Commands 而不是 YAML定义。