证书签名请求(CertificateSigningRequest)
# CertificateSigningRequest(CSR) 常用配置项
# CSR 示例
字段说明:
spec.request
是证书文件内容的 Base64 编码值- (可选)
spec.expirationSeconds
是所请求证书的有效期,单位:秒 spec.signerName
和spec.usages
都是固定搭配
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: myuser
spec:
request: <经过 Base64 编码的证书>
signerName: kubernetes.io/kube-apiserver-client
expirationSeconds: 86400 # 86400s = 1天
usages:
- client auth
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 创建CSR步骤
# 1、生成私钥文件
openssl genrsa -out myuser.key 2048
openssl req -new -key myuser.key -out myuser.csr -subj "/CN=myuser"
1
2
2
# 2、创建和批准证书签名请求
获得文件myuser.csr
的 Base64 编码值:
# -w0 去除换行符
cat myuser.csr | base64 -w0
1
2
2
创建一个名为myuser.yaml
的文件,复制和粘贴以下内容,并自行填写spec.request
字段:
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: myuser
spec:
request: <文件 myuser.csr 的 Base64 编码值>
signerName: kubernetes.io/kube-apiserver-client
expirationSeconds: 86400 # one day
usages:
- client auth
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
创建证书签名请求 CSR:
kubectl create -f myuser.yaml
# 验证
kubectl get csr
1
2
3
4
2
3
4
批准这个 CSR,并将证书内容导出至myuser.crt
文件中:
kubectl certificate approve myuser
# 验证,从 CSR 中导出证书
kubectl get csr myuser -o jsonpath='{.status.certificate}'| base64 -d > myuser.crt
1
2
3
4
2
3
4
# 3、创建角色和角色绑定
将角色绑定到一个名为mike
的用户身上。
kubectl create role myuser-role --verb=get,list,update,delete --resource=pods
kubectl create rolebinding myuser-role-binding --role=myuser-role --user=mike
1
2
3
2
3
# 4、将这个用户添加到 Kubeconfig 中,并切换用户
kubectl config set-credentials mike --client-key=myuser.key --client-certificate=mike.crt --embed-certs=true
# 创建新上下文,并切换至该上下文
kubectl config set-context mike --cluster=kubernetes --user=mike
kubectl config use-context mike
1
2
3
4
5
2
3
4
5
# 5、验证
# 询问当前用户是否有创建 Pod 的权限
➜ kubectl auth can-i get pods
yes
# 角色绑定是有命名空间范围的,所以在其他命名空间中,mike 用户不具备相关权限
➜ kubectl auth can-i get pods -n ns2
no
1
2
3
4
5
6
7
2
3
4
5
6
7
编辑 (opens new window)