我正试图从另一个pod访问所有的名称空间和pod。因此,我创建了clusterrole、clusterrolebinding和服务帐户。我能够访问唯一的客户命名空间资源。但是我需要访问所有的命名空间资源。有可能吗?
apiVersion: v1
kind: ServiceAccount
metadata:
name: spinupcontainers
namespace: customer
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: spinupcontainers
namespace: customer
rules:
- apiGroups: [""]
resources: ["pods", "pods/exec"]
verbs: ["get", "list", "delete", "patch", "create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: spinupcontainers
namespace: customer
subjects:
- kind: ServiceAccount
name: spinupcontainers
roleRef:
kind: ClusterRole
name: spinupcontainers
apiGroup: rbac.authorization.k8s.io
有人能帮忙解决这个问题吗?
提前感谢
在您的YAML示例中,您使用的似乎是RoleBinding
而不是ClusterRoleBinding
。RoleBinding
仅在命名空间内部授予这些权限。另请参阅有关此主题的Kubernetes文档:
RoleBinding在特定命名空间内授予权限,而ClusterRoleBinding授予该访问群集范围。
最重要的是,您必须使用适当的集群角色绑定将服务帐户连接到集群角色。因为绑定类型决定了服务帐户能力的范围。在这种情况下,您必须描述集群角色绑定,如下所示;
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: spinupcontainers
subjects:
- kind: ServiceAccount
name: spinupcontainers
namespace: customer
roleRef:
kind: ClusterRole
name: spinupcontainers
apiGroup: "rbac.authorization.k8s.io"
如果你想在pod中测试这一点,你可以描述pod的相应服务帐户,如下所示:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: busybox
name: busybox
spec:
containers:
- args:
- sleep
- "4800"
image: busybox:1.28
name: busybox
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Never
serviceAccountName: default
status: {}
最后,您需要ssh到pod,并可以使用服务帐户令牌执行正确的curl命令。不要忘记,您可以在pod中通过定义服务帐户找到令牌文件到pod yaml之前(在/var/run/secrets/kubernetes.io/serviceaccount中(。之后,您必须执行API调用才能使用kubernetes API服务器服务(如果您使用kubeadm创建集群。它已经在默认名称空间中定义为kubernetis(。在下面,你可以找到适当的apı调用来获得默认的命名空间机密
curl -k -H "Authorization: Bearer $TOKEN" https://<kubernetes-apı-fqdn>/api/v1/namespaces/default/secrets