普通用户

https://kubernetes.io/zh/docs/reference/access-authn-authz/certificate-signing-requests/
为了让普通用户能够通过认证并调用 API,需要执行几个步骤。 首先,该用户必须拥有 Kubernetes 集群签名的证书, 然后将该证书作为 API 调用的证书头或通过 kubectl 提供出来。

创建私钥

下面的脚本展示了如何生成 PKI 私钥和 CSR。 设置 CSR 的 CN 和 O 字段很重要。CN 是用户名,O 是该用户归属的组。 你可以参考 RBAC 获取标准组的信息。

openssl genrsa -out john.key 2048
openssl req -new -key john.key -out john.csr

创建申请证书的 Kubernetes 对象

创建一个 CertificateSigningRequest,并通过 kubectl 将其提交到 Kubernetes 集群。 下面是生成 CertificateSigningRequest 的脚本。

cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
  name: duoduo
spec:
  groups:
  - system:authenticated
  request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQzhEQ0NBZGdDQVFBd2ZURUxNQWtHQTFVRUJoTUNaR1F4RHpBTkJnTlZCQWdNQm1SMWIyUjFiekVQTUEwRwpBMVVFQnd3R1pIVnZaSFZ2TVE4d0RRWURWUVFLREFaa2RXOWtkVzh4RHpBTkJnTlZCQXNNQm1SMWIyUjFiekVQCk1BMEdBMVVFQXd3R1pIVnZaSFZ2TVJrd0Z3WUpLb1pJaHZjTkFRa0JGZ3BrZFc5a2RXOHVZMjl0TUlJQklqQU4KQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdy81WjBhZVVwYVczMlZEUnRscnRJcm1rYlBscgpqVGFuZ0hpTXFkc2U5clRnS0MyOXo2VjMvcHppZ2tpUkxTU0YzYlc1Q3U2c1cxZlNUakRJSFI0MXUyYm5MMHNHCnV4V1lQNGlMSzFXUXpicGN6VDEvU0tJeFh4VHZtODFkd21MOU1PVjhwUkwva012RDh5YjIyV0pqelU3M0xYYmgKb21DWjNCaUVYYmMyblhwSnEwNWpxR1NvMHU4dUJ3Ykk0VjF6dllFRXEwdVl1aUZWQ01GeXpGalFRNXZ4M0tBcwpvbkV3eU1UMDk4RmNld0RPMmZLTTNQUmdHQTRjVjZnRDBSUWt5WlBQTFk1Yy8xa2JVbTJTRDZVT1RYNkZtV3NtCmlVSmM3MGJaaWFkdUdNU0ZuTENsa25TcmhmaXJmdGdqMHlxWjNBQXptcnVUNzBXTXZBMURLUUJ5YVFJREFRQUIKb0M0d0ZRWUpLb1pJaHZjTkFRa0NNUWdNQmpFeU16RXlNekFWQmdrcWhraUc5dzBCQ1FjeENBd0dNVEl6TVRJegpNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUE3Vy92L2pzc0hKZkV4WXhBTTJZRUhpd0g4aFIra0VZZDFNaE1wCjBwbW96L29TSm5YcVpLOXJSZEx3dCtNdkVyVFdKWVdTZnhCR2xPb09hTFZHS3B6QUp3RjJoR3htbWF4MzNlRloKb2dWTzVSaDVKUm4zOXlYdTZ6WjhMK1JEclpqd0lidWNhM0NNQXhvdlNxNXcwRXhtRDE5K1NvUmwySFlFbWkxVwpEaWFQYnIvVEV5QWVOcEkxaHg3eEZRZlhPN1I2dXJHdWFkNWVmZXl0N3FyU1l2dEgybkc0Wm9OSkNnTFhrVUxlCkU1ZTI3UTVZejlpbXlVTnRZbkovUEdDY2svSHpqVEpFQWZOQzdIc083dkpCUG5LWUdtTnVBL0pUSndmbVBJaFoKQkZkMEZQVHByc0RZNVdoMXJvOWREZmZkNkNTNjFLTGs3Z0lhalJTZkZZejZ4bUY3Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=
  
  usages:
  - client auth
EOF

需要注意的几点:

usage 字段必须是 ‘client auth’ request 字段是 CSR 文件内容的 base64 编码值。要得到该值,可以执行命令 cat john.csr | base64 | tr -d “\n” 。

批准证书请求

使用 kubectl 创建 CSR 并批准。

kubectl get csr

获取 CSR 列表

kubectl certificate approve john

取得证书
批准 CRS

kubectl get csr/john -o yaml

证书的内容使用 base64 编码,存放在字段 status.certificate。

创建角色和角色绑定

你已经拿到证书了。为了让这个用户能访问 Kubernetes 集群资源,现在就要创建 Role 和 Role Binding 了。

这是为这个新用户创建角色的示例脚本

kubectl create role developer --verb=create --verb=get --verb=list --verb=update --verb=delete --resource=pods

这是为这个新用户创建角色绑定的示例脚本

kubectl create rolebinding developer-binding-john --role=developer --user=john

添加到 KubeConfig

最后一步是将这个用户添加到 KubeConfig。 我们假设私钥和证书文件存放在 “/home/vagrant/work/” 目录中。

首先,我们需要添加新的凭据

kubectl config set-credentials john --client-key=/home/vagrant/work/john.key --client-certificate=/home/vagrant/work/john.crt --embed-certs=true

然后,我们需要添加上下文

kubectl config set-context john --cluster=kubernetes --user=john

来测试一下,把 kubecontext 切换为 john

kubectl config use-context john
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐