Kubernetes-使用集群CA证书给用户颁发客户端证书访问Api-Server

时间:2024-06-03 07:21:12

一、官网地址

证书和证书签名请求 | 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 则验证了权限配置正常以及正确。