首页 > 解决方案 > 如何在 k8s 上为服务帐户创建客户端证书和客户端密钥

问题描述

我正在试验服务帐户和用户帐户。

我可以为用户帐户创建 CA / 密钥,以便能够通过 Server-API 验证用户,但我无法为服务帐户做同样的事情。

我创建了一个 kubeconfig 文件:

apiVersion: v1
clusters:
- cluster:
    certificate-authority: ca.crt
    server: https://ip:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    namespace: namespace-test
    user: test
  name: test-kubernetes
current-context: "test-kubernetes"
kind: Config
preferences: {}
users:
- name: test
  user:
    client-certificate: test.crt
    client-key: test.key

当我使用这个 kubeconfig 文件并基于 RBAC 规则时,我可以访问 Server-Api:

$ kubectl --kubeconfig /tmp/rbac-test/test.kubeconfig get pods
No resources found in namespace-test namespace.

我创建名称空间、服务帐户等的文件示例。

apiVersion: v1
kind: Namespace
metadata:
  name: namespace-test
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    user: test
  name: test
  namespace: namespace-test
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  labels:
    user: test
  name: role-test
  namespace: namespace-test
rules:
- apiGroups: [""]
  resources: ["*"]
  verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    user: test
  name: rolebinding-test
  namespace: namespace-test
subjects:
  - kind: User
    name: test
roleRef:
  kind: Role
  name: role-test
  apiGroup: rbac.authorization.k8s.io

当我将用户修改为服务帐户用户时,我失去了对命名空间的控制:

subjects:
  - kind: ServiceAccount

然后我试着拿到豆荚,但我被禁止了:

$ kubectl --kubeconfig /tmp/rbac-test/test.kubeconfig get pods
Error from server (Forbidden): pods is forbidden: User "test" cannot list resource "pods" in API group "" in the namespace "namespace-test"

但是当我检查服务帐户是否可以获取 pod 时,它是有效的:

$ kubectl auth can-i get pods --as system:serviceaccount:namespace-test:test -n namespace-test
yes

有没有办法为服务帐户用户检索或创建 CA?我希望能够通过 Server-Api 连接到集群外部,同时使用服务帐户而不是普通用户。

我想使用服务帐户而不是用户的原因是能够通过具有令牌验证的不同用户使用仪表板。

标签: kubernetesservice-accounts

解决方案


推荐阅读