一、官网地址
证书和证书签名请求 | Kubernetes
二、Demo
一、创建测试文件夹
cd ~
mkdir add_k8s_user_demo
cd add_k8s_user_demo
二、创建符合X509标准的证书
openssl genrsa -out myuser.key 2048
openssl req -new -key myuser.key -out myuser.csr -subj "/CN=myuser"
注意:
设置 CSR 的 CN 和 O 属性很重要。CN 是用户名,O 是该用户归属的组
这里CN 为 myuser , 不使用组来管理。
三、创建 CertificateSigningRequest
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: myuser
spec:
request: <替换为你的>
signerName: kubernetes.io/kube-apiserver-client
expirationSeconds: 86400 # one day
usages:
- client auth
EOF
需要注意的几点:
-
usage
字段必须是 'client auth
' -
expirationSeconds
可以设置为更长(例如864000
是十天)或者更短(例如3600
是一个小时) -
request
字段是 CSR 文件内容的 base64 编码值, 要得到该值,可以执行命令:cat myuser.csr | base64 | tr -d "\n"
状态为Pending.因为还没有被批准。
四、批准 CertificateSigningRequest
使用 kubectl 创建 CSR 并批准。
获取 CSR 列表:
kubectl get csr
批准 CSR:
kubectl certificate approve myuser
状态变为批准。
五、取得证书
从 CSR 取得证书:
kubectl get csr/myuser -o yaml
证书的内容使用 base64 编码,存放在字段 status.certificate
。
从 CertificateSigningRequest 导出颁发的证书:
kubectl get csr myuser -o jsonpath='{.status.certificate}'| base64 -d > myuser.crt
六、创建角色和角色绑定
创建了证书之后,为了让这个用户能访问 Kubernetes 集群资源,现在就要创建 Role 和 RoleBinding 了。
下面是为这个新用户创建 Role 的示例命令:
解释:创建一个角色叫开发者,只有更新和创建以及列出对于Pod资源的权限,没有制定命名空间则默认使用default.
kubectl create role developer --verb=create --verb=get --verb=list --verb=update --verb=delete --resource=pods
下面是为这个新用户创建 RoleBinding 的示例命令:
将上面的的开发者权限绑定到刚才颁发证书的user-myuser
kubectl create rolebinding developer-binding-myuser --role=developer --user=myuser
七、添加到 kubeconfig
最后一步是将这个用户添加到 kubeconfig 文件。
首先,你需要添加新的凭据:
kubectl config set-credentials myuser --client-key=myuser.key --client-certificate=myuser.crt --embed-certs=true
然后,你需要添加上下文:
kubectl config set-context myuser --cluster=kubernetes --user=myuser
注意这里的cluster的值,需要匹配:
kubectl config get-clusters
比如我是rke2的发行版,默认是default,其他发行版类推。
来测试一下,把上下文切换为 myuser
:
kubectl config use-context myuser
八、测试 以及验证
kubectl get nodes
kubectl get po
测试权限是否生效。
上面验证:
1、无法列出namespace,因为role定义了只允许列出pod.
2、下面get pod 则验证了权限配置正常以及正确。