// 获取nodeName,isNode, 判断是否是kubelet的请求
nodeName, isNode := p.nodeIdentifier.NodeIdentity(a.GetUserInfo())
//...
switch a.GetResource().GroupResource() {
case Pod:
// 只能处理nodeName匹配的pod
switch a.GetSubresource() {
case "": mirror pod 的创建; pod的删除;
case "status": 状态更新
case "eviction":
}
case node:
// 只能处理NodeName的node对象, 创建/更新, 查询和删除操作
case pvc:
case svcaccount:
case lease:
case csiNode:
根据官方说明https://kubernetes.io/zh/docs/reference/access-authn-authz/node/,node鉴权专门用于认证kubelet。 kubelet 必须使用一个凭证以表示它在
system:nodes
组中,用户名为system:node:<nodeName>
实际环境
证书Organization为
system:nodes
, Common Name为system:node:kind-worker
代码分析
https://code.k8s.io/plugin/pkg/admission/noderestriction/admission.go
NodeIdentity
由https://code.k8s.io/pkg/auth/nodeidentifier/default.go实现, 从证书的Organization/CN获取到nodeName