i具有.NET标准(4.7.2(简单应用程序。它具有列出集群中所有名称空间的方法。我使用csharp kubernetes客户端与API进行交互。根据官方文档,API服务器的默认凭据是在POD中创建的,并用于与API服务器进行通信,但是在调用POD的Kubernetes API时,会出现以下错误:
操作返回了无效的状态代码'Forbidden'
我的部署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
我认为您的群集内有RBAC Activatet。您需要为包含角色的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
在您的命名空间内创建一个新的ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: application-sa
namespace: <YOUR-NAMESPACE>
将您的角色创建的角色分配给服务学会:
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
通过在您的POD规格中添加ServiceAccount将新角色分配给您的POD:
apiVersion: v1
kind: Pod
metadata:
name: podname
namespace: <YOUR-NAMESPACE>
spec:
serviceAccountName: application-sa
您可以在官方文档中阅读有关RBAC的更多信息。也许您想使用kubectl-commands代替yaml定义。