Kubernetes节点授权机制深度解析
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
概述
在Kubernetes集群中,节点授权(Node Authorization)是一种特殊用途的授权模式,专门用于授权kubelet发起的API请求。这种机制确保了kubelet只能访问和操作与其节点相关的资源,是Kubernetes安全架构的重要组成部分。
节点授权的工作原理
节点授权机制通过验证kubelet的身份和权限,控制其对API服务器的访问。kubelet必须使用特定的身份凭证才能获得授权:
- 必须属于
system:nodes
组 - 用户名必须为
system:node:<nodeName>
格式 <nodeName>
必须与kubelet注册的节点名称完全匹配
节点名称通常由kubelet的hostname
决定,也可以通过--hostname-override
参数指定。当使用--cloud-provider
选项时,云提供商可能会决定具体的节点名称。
节点授权允许的操作
读操作权限
kubelet被授权读取以下资源:
- 服务(services)
- 端点(endpoints)
- 节点(nodes)
- Pod(pods)
- 与绑定到该节点的Pod相关的secret、configmap、持久卷声明(PVC)和持久卷(PV)
当启用AuthorizeNodeWithSelectors
特性时,kubelet只能读取自己的节点对象和绑定到该节点的Pod。
写操作权限
kubelet可以对以下资源执行写操作:
- 节点和节点状态(需启用NodeRestriction准入插件限制只能修改自己的节点)
- Pod和Pod状态(需启用NodeRestriction准入插件限制只能修改绑定到自己的Pod)
- 事件(events)
认证相关操作
kubelet还拥有以下特殊权限:
- 对CertificateSigningRequests API的读写权限(用于TLS引导)
- 创建TokenReviews和SubjectAccessReviews的能力(用于委托认证/授权检查)
配置节点授权
要启用节点授权,需要在API服务器启动时进行相应配置:
- 使用
--authorization-config
标志指定包含Node授权器的配置文件:
apiVersion: apiserver.config.k8s.io/v1
kind: AuthorizationConfiguration
authorizers:
- type: Node
- 或者使用
--authorization-mode
标志包含Node授权模式:
kube-apiserver --authorization-mode=...,Node
为了进一步限制kubelet的写操作权限,建议同时启用NodeRestriction准入插件:
kube-apiserver --enable-admission-plugins=...,NodeRestriction,...
迁移注意事项
非system:nodes组的kubelet
不属于system:nodes
组的kubelet不会被节点授权模式授权,需要通过其他机制继续授权。NodeRestriction准入插件也不会限制这些kubelet的请求。
无差异化用户名的kubelet
某些部署中,kubelet虽然属于system:nodes
组,但没有system:node:...
格式的用户名。这些kubelet同样不会被节点授权模式授权,需要通过现有机制继续授权。NodeRestriction准入插件会忽略这些kubelet的请求。
最佳实践
- 确保节点名称一致性:确保kubelet注册的节点名称与凭证中的节点名称完全匹配
- 启用NodeRestriction插件:限制kubelet只能修改自己的节点和Pod
- 定期审计节点权限:检查是否有kubelet使用了不符合规范的凭证
- 逐步迁移:如果现有集群中有不符合规范的kubelet,应制定迁移计划逐步调整
节点授权机制是Kubernetes安全架构的关键部分,通过精细控制kubelet的权限,可以有效降低集群的安全风险。理解并正确配置这一机制,对于构建安全的Kubernetes集群至关重要。
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考