一、创建私钥
普通用户
为了让普通用户能够通过认证并调用 API,需要执行几个步骤。 首先,该用户必须拥有 Kubernetes 集群签发的证书, 然后将该证书作为 API 调用的 Certificate 头或通过 kubectl 提供。
创建私钥
下面的脚本展示了如何生成 PKI 私钥和 CSR。 设置 CSR 的 CN 和 O 属性很重要。CN 是用户名,O 是该用户归属的组。 你可以参考 RBAC 了解标准组的信息。
openssl genrsa -out myuser.key 2048
openssl req -new -key myuser.key -subj "/CN=dms" -out myuser.csr
创建 CertificateSigningRequest
创建一个 CertificateSigningRequest,并通过 kubectl 将其提交到 Kubernetes 集群。 下面是生成 CertificateSigningRequest 的脚本。
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: dms
spec:
groups:
- system:authenticated
request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1V6Q0NBVHNDQVFBd0RqRU1NQW9HQTFVRUF3d0RaRzF6TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQwpBUThBTUlJQkNnS0NBUUVBdzRQTW1mWk9PYjdiZ2cvcVVCSWp0bzYrcmlBbTFMaGlwMjl2MjhJWEh1VXdOZE5jCm1yMk1MQW9xU3AySWpzOWQvQnFlcmNlc3g3OTJ2RGRqeXhSdDlwY0lZTHY2Vmw1cUx5R0ZJU1o5SjlwTmRpeGoKR2lHOUk3UjJFa2JRVEVpWkxnOUlMaGNOc3c3RmN0Z044SUx4Vk8yRldVNlFaejBxVjVLU3NkTkVodWJmR2pHeQpQblNONS9DNWZReVJNTkVmcXd4QTloQWloU2VlMkVMZjRmMW9WTklQd0FRQkxYbFAwN1o1WVBDRzE1NTdIZE93CkZVMnZDYXdxY2tHZ0pJZFNkR2YyMlczZzNZOGRMc1B2NEpNWWQwQUx0bjAyNFdJVSt0QVA3TzVCN1VNRndOYWcKSDVaTWNUcHY4U3ZVMXNqbk1LVHREVTd0RUdKZG03V0tabUczZFFJREFRQUJvQUF3RFFZSktvWklodmNOQVFFTApCUUFEZ2dFQkFCUUY0WUZmdlo3dURZMTJkbEVZM1NYZWJBQXpvYnZ6L3BkRnZBSkN4d0RjRVU1UWNGUHRiaEEyCkUyUXpsc2V6S01QK05ZNHJWWE5FUnlrRXBnQ0tWYitDanVsUjNKK0JpaUtyaTNRSHNiTXhnaGlpdTZyNlMrYlkKWWI1L2NBcGd3RWNtOU92WWc4UVl0TitTU2JycUFWQVg0ckJtYkEyZDdQYktOWWtaUStPaWd6N0tlTnFvckw3dAo0dngveVVXSlRKVkhrbXFVVjRpMC8vZElMLy9IcnVFL05EUzNVaWxFQUp4NjF4cEc0WWZYNDhlTGtTMnJ6V05YCmNBaTVLeHlIZWlCL2JqWm91RWhGVCtEYzl2WXlVZWpaVXZLMzYyd2hKNjd5dXVoM2xXSXNwUGhESTBGZUhQS3MKZ2JGQ0ZqdkhLMUhPTHNpSEl4dG04OGNRWXhQa3psND0KLS0tLS1FTkQgQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tCg==
signerName: kubernetes.io/kube-apiserver-client
usages:
- client auth
EOF
需要注意的几点:
usage
字段必须是 ‘client auth
’request
字段是 CSR 文件内容的 base64 编码值。 要得到该值,可以执行命令cat myuser.csr | base64 | tr -d "\n"
。
批准证书签名请求
使用 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 的示例脚本:
kubectl create role developer --verb=create --verb=get --verb=list --verb=update --verb=delete --resource=pods
下面是为这个新用户创建 RoleBinding 的示例命令:
kubectl create rolebinding developer-binding-myuser --role=developer --user=dms
添加到 kubeconfig
最后一步是将这个用户添加到 kubeconfig 文件。 我们假设私钥和证书文件存放在 “/home/vagrant/work/” 目录中。
首先,我们需要添加新的凭据:
kubectl config --kubeconfig=/root/kubernetes/k8sconfig/csr/kubeconfig set-credentials dms --client-key=myuser.key --client-certificate=myuser.crt --embed-certs=true
然后,你需要添加上下文:
kubectl config --kubeconfig=/root/kubernetes/k8sconfig/csr/kubeconfig set-context dms --cluster=dms --user=dms
再添加集群信息
export KUBECONFIG_SAVED=192.168.11.128
kubectl config --kubeconfig=/root/kubernetes/k8sconfig/csr/kubeconfig \
set-cluster dms \
--server=https://$KUBECONFIG_SAVED:6443 \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true
来测试一下,把上下文切换为 myuser
:
kubectl config use-context myuser