Kubernetes集群提供了3种级别的客户端身份认证方式

HTTP Token认证:通过一个Token来识别合法用户。
HTTPS 证书认证:基于CA根证书签名的双向数字证书认证方式
HTTP Base认证:通过用户名+密码的方式认证,这个只有1.19之前的版本适用,之后的版本不在支持

普通用户

为了让普通用户能够通过认证并调用 API,需要执行几个步骤。 首先,该用户必须拥有 Kubernetes 集群签发的证书, 然后将该证书提供给 Kubernetes API。

创建私钥

下面的脚本展示了如何生成 PKI 私钥和 CSR。 设置 CSR 的 CN 和 O 属性很重要。CN 是用户名,O 是该用户归属的组。 你可以参考 RBAC 了解标准组的信息。

  1. openssl genrsa -out myuser.key 2048
  2. openssl req -new -key myuser.key -out myuser.csr

创建 CertificateSigningRequest

创建一个 CertificateSigningRequest,并通过 kubectl 将其提交到 Kubernetes 集群。 下面是生成 CertificateSigningRequest 的脚本。

  1. cat <<EOF | kubectl apply -f -
  2. apiVersion: certificates.k8s.io/v1
  3. kind: CertificateSigningRequest
  4. metadata:
  5. name: myuser
  6. spec:
  7. request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1ZqQ0NBVDRDQVFBd0VURVBNQTBHQTFVRUF3d0dZVzVuWld4aE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTByczhJTHRHdTYxakx2dHhWTTJSVlRWMDNHWlJTWWw0dWluVWo4RElaWjBOCnR2MUZtRVFSd3VoaUZsOFEzcWl0Qm0wMUFSMkNJVXBGd2ZzSjZ4MXF3ckJzVkhZbGlBNVhwRVpZM3ExcGswSDQKM3Z3aGJlK1o2MVNrVHF5SVBYUUwrTWM5T1Nsbm0xb0R2N0NtSkZNMUlMRVI3QTVGZnZKOEdFRjJ6dHBoaUlFMwpub1dtdHNZb3JuT2wzc2lHQ2ZGZzR4Zmd4eW8ybmlneFNVekl1bXNnVm9PM2ttT0x1RVF6cXpkakJ3TFJXbWlECklmMXBMWnoyalVnald4UkhCM1gyWnVVV1d1T09PZnpXM01LaE8ybHEvZi9DdS8wYk83c0x0MCt3U2ZMSU91TFcKcW90blZtRmxMMytqTy82WDNDKzBERHk5aUtwbXJjVDBnWGZLemE1dHJRSURBUUFCb0FBd0RRWUpLb1pJaHZjTgpBUUVMQlFBRGdnRUJBR05WdmVIOGR4ZzNvK21VeVRkbmFjVmQ1N24zSkExdnZEU1JWREkyQTZ1eXN3ZFp1L1BVCkkwZXpZWFV0RVNnSk1IRmQycVVNMjNuNVJsSXJ3R0xuUXFISUh5VStWWHhsdnZsRnpNOVpEWllSTmU3QlJvYXgKQVlEdUI5STZXT3FYbkFvczFqRmxNUG5NbFpqdU5kSGxpT1BjTU1oNndLaTZzZFhpVStHYTJ2RUVLY01jSVUyRgpvU2djUWdMYTk0aEpacGk3ZnNMdm1OQUxoT045UHdNMGM1dVJVejV4T0dGMUtCbWRSeEgvbUNOS2JKYjFRQm1HCkkwYitEUEdaTktXTU0xMzhIQXdoV0tkNjVoVHdYOWl4V3ZHMkh4TG1WQzg0L1BHT0tWQW9FNkpsYWFHdTlQVmkKdjlOSjVaZlZrcXdCd0hKbzZXdk9xVlA3SVFjZmg3d0drWm89Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=
  8. signerName: kubernetes.io/kube-apiserver-client
  9. expirationSeconds: 86400 # one day
  10. usages:
  11. - client auth
  12. EOF

需要注意的几点:

  • usage 字段必须是 ‘client auth’
  • expirationSeconds 可以设置为更长(例如 864000 是十天)或者更短(例如 3600 是一个小时)
  • request 字段是 CSR 文件内容的 base64 编码值。 要得到该值,可以执行命令 cat myuser.csr | base64 | tr -d “\n”。

    批准证书签名请求

    使用 kubectl 创建 CSR 并批准。
    获取 CSR 列表:
    1. kubectl get csr
    批准 CSR:
    1. kubectl certificate approve myuser

    取得证书

    从 CSR 取得证书:
    1. kubectl get csr/myuser -o yaml
    证书的内容使用 base64 编码,存放在字段 status.certificate。
    从 CertificateSigningRequest 导出颁发的证书。
    1. kubectl get csr myuser -o jsonpath='{.status.certificate}'| base64 -d > myuser.crt

    创建角色和角色绑定

    创建了证书之后,为了让这个用户能访问 Kubernetes 集群资源,现在就要创建 Role 和 RoleBinding 了。
    下面是为这个新用户创建 Role 的示例命令:
    1. kubectl create role developer --verb=create --verb=get --verb=list --verb=update --verb=delete --resource=pods
    下面是为这个新用户创建 RoleBinding 的示例命令:
    1. kubectl create rolebinding developer-binding-myuser --role=developer --user=myuser

    添加到 kubeconfig

    最后一步是将这个用户添加到 kubeconfig 文件。 我们假设私钥和证书文件存放在 “/home/vagrant/work/” 目录中。
    首先,我们需要添加新的凭据:
    1. kubectl config set-credentials myuser --client-key=myuser.key --client-certificate=myuser.crt --embed-certs=true
    然后,你需要添加上下文: ```shell kubectl config set-context myuser —cluster=<集群名称> —user=myuser 集群名称 可以通过kubectl config view 获取 [root@qwe ~]# kubectl config view apiVersion: v1 clusters:
  • cluster: certificate-authority-data: DATA+OMITTED server: https://127.0.0.1:6443 name: cluster1 contexts:
  • context: cluster: cluster1 user: admin name: context-cluster1
  • context: cluster: kubernetes user: myuser name: myuser current-context: context-cluster1 kind: Config preferences: {} users:
  • name: admin user: client-certificate-data: REDACTED client-key-data: REDACTED
  • name: myuser user: client-certificate-data: REDACTED client-key-data: REDACTED
    1. 来测试一下,把上下文切换为 myuser
    2. ```shell
    3. kubectl config use-context myuser

    查看当前context

    1. [root@qwe ~]# kubectl config current-context
    2. context-cluster1

    切换context

    1. [root@qwe ~]# kubectl config use-context myuser
    2. Switched to context "myuser".