自托管RKE2集群中如何列出拥有API访问权限的用户及各类证书?
为什么kubectl get csr查不到历史记录
Kubernetes的CSR(CertificateSigningRequest)资源在被批准/拒绝后,默认不会长期留存,集群通常会自动清理已处理或过期的CSR。加上RKE2有自己的证书管理逻辑,部分用户证书可能通过内置机制签发,不会生成持久化的CSR记录,这就是你看不到上周签发证书的原因。
可行的查询方法
1. 翻查kube-apiserver日志找操作记录
kube-apiserver会记录所有证书签名相关的操作,直接过滤日志就能找到已批准、拒绝的CSR历史:
# 查看kube-apiserver容器日志 kubectl logs -n kube-system $(kubectl get pods -n kube-system -l component=kube-apiserver -o name) | grep -i "certificate\|csr"
如果是systemd管理的RKE2节点,也可以直接看系统日志:
journalctl -u rke2-server | grep -i "certificate\|csr"
2. 从Secret中提取已签发的用户证书
已签发的用户证书通常会以Secret形式存储在集群中,先找出所有带证书的Secret:
kubectl get secrets --all-namespaces -o json | jq '.items[] | select(.data["tls.crt"] != null) | {name: .metadata.name, namespace: .metadata.namespace}'
然后解析具体证书的持有者信息:
# 替换成你的Secret名称和命名空间 kubectl get secret <secret-name> -n <namespace> -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text -noout
从输出的Subject字段中,就能看到证书对应的用户信息。
3. 检查RKE2的CSR留存配置
查看kube-apiserver的配置文件(路径一般是/var/lib/rancher/rke2/server/manifests/kube-apiserver.yaml),看看有没有--csr-signer-cache-duration参数,这个参数控制CSR记录的留存时长,调整它可以让后续的CSR记录保留更久。
4. 查询已吊销的证书
Kubernetes本身没有内置的证书吊销列表(CRL)存储,但如果用了RKE2的证书吊销机制,或者搭配了cert-manager,可以这么查:
- 如果用了cert-manager:
kubectl get certificaterequests --all-namespaces
- 直接查etcd中的证书相关条目:
ETCDCTL_API=3 etcdctl --cacert=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --cert=/var/lib/rancher/rke2/server/tls/etcd/server-client.crt --key=/var/lib/rancher/rke2/server/tls/etcd/server-client.key --endpoints=https://127.0.0.1:2379 get /registry/certificates --prefix
补充说明
如果你是用cert-manager来管理用户证书的,除了上面的命令,还可以用kubectl get certificates --all-namespaces查看所有证书状态;对于那些已经没有CSR记录的长期有效证书,只能通过解析已存在的证书文件或Secret来获取用户信息。
内容的提问来源于stack exchange,提问作者repi

