鉴权

由于 API-Server 需要一定权限才能访问,所以实际上用户使用 kubectl 工具时,也需要权限才能执行命令。

kubectl auth can-i 命令用来确定一个用户是否能够访问 API。

如果要确定当前用户是否有权限访问 deployments,可以使用:

kubectl auth can-i create deployments
kubectl auth can-i {命令}

如果要检查其它用户是否有权限,可以使用 --as

kubectl auth can-i create deployments --as ddddd
kubectl auth can-i create deployments --as ddddd --namespace kube-system

为了更加方便地获得权限,我们可以使用 SelfSubjectAccessReview 这个 API 来获得权限信息资源,它将 API 服务器鉴权公开给外部服务,其 API 说明文档地址:

https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/#selfsubjectaccessreview-v1-authorization-k8s-io

另外还有三个相关的 API:

  • SubjectAccessReview - 对任意用户的访问进行评估,而不仅仅是当前用户。 当鉴权决策被委派给 API 服务器时很有用。例如,kubelet 和扩展 API 服务器使用 它来确定用户对自己的 API 的访问权限。
  • LocalSubjectAccessReview - 与 SubjectAccessReview 类似,但仅限于特定的 名字空间。
  • SelfSubjectRulesReview - 返回用户可在名字空间内执行的操作集的审阅。 用户可以快速汇总自己的访问权限,或者用于 UI 中的隐藏/显示动作。

这里只需要了解,不需要深入。


配置

$HOME/.kube/config 文件中存储了 Kubernetes 的配置信息,可以直接打开文件查看,也可以通过 kubectl config view 查看(只显示部分信息)。

前面我们访问 API 时,使用了 token,现在我们可以通过这个 config,来创建证书文件,通过证书访问。。

client 密钥,就在这个 config 文件的 client-certificate-data 字段中存储。

grep client-cert $HOME/.kube/config |cut -d" " -f 6

key,在 client-key-data 字段中存储:

grep client-key-data $HOME/.kube/config |cut -d " " -f 6

API-Server 的公钥(auth),就在 certificate-authority-data 字段中存储:

grep certificate-authority-data $HOME/.kube/config |cut -d " " -f 6

意思就是三个重要的 密钥数据,这里为了方便,分别使用 client、key、auth 三个变量存储查询的数据。

export client=(grep client-cert $HOME/.kube/config |cut -d" " -f 6)
export key=(grep client-key-data $HOME/.kube/config |cut -d " " -f 6)
export auth=(grep certificate-authority-data $HOME/.kube/config |cut -d " " -f 6)

创建证书文件:

echo $client | base64 -d - > ./client.pems
echo $key | base64 -d - > ./client-key.pem
echo $auth | base64 -d - > ./ca.pem

然后访问的时候就可以通过证书安全地访问 API-Server:

curl --cert ./client.pem --key ./client-key.pem --cacert ./ca.pem https://k8smaster:6443/api/v1/pod