• 利用 CSR API 创建用户
    • 创建步骤
    • 配置 kubeconfig
    • 配置用户权限
    • 参考资料

    利用 CSR API 创建用户

    k8s 支持 CSR API,通过创建 CertificateSigningRequest 资源就可以发起 CSR 请求,管理员审批通过之后 kube-controller-manager 就会为我们签发证书,确保 kube-controller-manager 配了根证书密钥对:

    1. --cluster-signing-cert-file=/var/lib/kubernetes/ca.pem
    2. --cluster-signing-key-file=/var/lib/kubernetes/ca-key.pem

    创建步骤

    我们用 cfssl 来创建 key 和 csr 文件,所以需要先安装 cfssl:

    1. curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o cfssl
    2. curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o cfssljson
    3. curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o cfssl-certinfo
    4. chmod +x cfssl cfssljson cfssl-certinfo
    5. sudo mv cfssl cfssljson cfssl-certinfo /usr/local/bin/

    指定要创建的用户名:

    1. USERNAME="roc"

    再创建 key 和 csr 文件:

    1. cat <<EOF | cfssl genkey - | cfssljson -bare ${USERNAME}
    2. {
    3. "CN": "${USERNAME}",
    4. "key": {
    5. "algo": "rsa",
    6. "size": 2048
    7. }
    8. }
    9. EOF

    生成以下文件:

    1. roc.csr
    2. roc-key.pem

    创建 CertificateSigningRequest(发起 CSR 请求):

    1. cat <<EOF | kubectl apply -f -
    2. apiVersion: certificates.k8s.io/v1beta1
    3. kind: CertificateSigningRequest
    4. metadata:
    5. name: ${USERNAME}
    6. spec:
    7. request: $(cat ${USERNAME}.csr | base64 | tr -d '\n')
    8. usages:
    9. - digital signature
    10. - key encipherment
    11. - client auth
    12. EOF

    管理员审批 CSR 请求:

    1. # 查看 csr
    2. # kubectl get csr
    3. # 审批 csr
    4. kubectl certificate approve ${USERNAME}

    获取证书:

    1. kubectl get csr ${USERNAME} -o jsonpath={.status.certificate} | base64 --decode > ${USERNAME}.pem

    得到证书文件:

    1. roc.pem

    至此,我们已经创建好了用户,用户的证书密钥对文件:

    1. roc.pem
    2. roc-key.pem

    配置 kubeconfig

    1. # 增加 user
    2. kubectl config set-credentials ${USERNAME} --embed-certs=true --client-certificate=${USERNAME}.pem --client-key=${USERNAME}-key.pem
    3. # 如果还没配 cluster,可以通过下面命令配一下
    4. kubectl config set-cluster <cluster> --server=<apiserver-url> --certificate-authority=<ca-cert-file>
    5. # 增加 context,绑定 cluster 和 user
    6. kubectl config set-context <context> --cluster=<cluster> --user=${USERNAME}
    7. # 使用刚增加的 context
    8. kubectl config use-context <context>

    配置用户权限

    我们可以用 RBAC 控制用户权限,参考 使用 RBAC 控制用户权限

    参考资料

    • Manage TLS Certificates in a Cluster: https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster/