云原生学习路线导航页(持续更新中)
- kubernetes学习系列快捷链接
- Kubernetes架构原则和对象设计(一)
- Kubernetes架构原则和对象设计(二)
- Kubernetes架构原则和对象设计(三)
- Kubernetes控制平面组件:etcd(一)
- Kubernetes控制平面组件:etcd(二)
- Kubernetes控制平面组件:etcd常用配置参数
- Kubernetes控制平面组件:etcd高可用集群搭建
- Kubernetes控制平面组件:etcd高可用解决方案
- Kubernetes控制平面组件:Kubernetes如何使用etcd
- Kubernetes控制平面组件:API Server详解(一)
- Kubernetes控制平面组件:APIServer 基于 X509 证书的认证机制
- Kubernetes控制平面组件:APIServer 基于 静态Token 的认证机制
- Kubernetes控制平面组件:APIServer 基于 引导Token 的认证机制
- Kubernetes控制平面组件:APIServer 基于 ServiceAccount 的认证机制
- Kubernetes控制平面组件:APIServer 基于 OpenID 的认证机制详解
- Kubernetes控制平面组件:APIServer 基于 Webhook Toeken令牌 的认证机制详解
- Kubernetes控制平面组件:APIServer 基于匿名请求的认证机制详解
- kubectl 和 kubeconfig 基本原理
- kubeadm 升级 k8s集群 1.17到1.20
- Kubernetes常见问题解答
- 查看云机器的一些常用配置
本文主要对kubernetes的控制面组件API Server 授权机制中的 Node 授权机制进行详细介绍,涵盖Node机制基础概念、设计理念、实现原理、授权流程、参数配置及实操案例等
- 希望大家多多 点赞 关注 评论 收藏,作者会更有动力编写技术文章
1.基本概念
Node 授权机制是 Kubernetes 中专门为节点(Node)设计的授权模式,用于控制 kubelet(节点代理)对 API Server 的访问权限。其核心目标是确保节点仅能操作与其自身相关的资源(如 Pod、Node 状态等),防止节点权限越界或滥用。
核心特点:
- 专用性:仅针对 kubelet 发起的请求,其他用户或组件不适用。
- 最小权限原则:严格限制 kubelet 的操作范围,仅允许访问与节点绑定的资源。
- 动态控制:通过准入控制插件(如
NodeRestriction
)进一步限制写操作。
2.设计理念
- 节点隔离性
每个节点仅能管理自身资源,避免跨节点操作(如修改其他节点的状态或 Pod)。 - 零信任模型
节点需通过严格的身份认证(如 TLS 证书)和授权策略,确保请求合法性。 - 动态权限适配
结合 RBAC 和准入控制插件,实现权限的动态调整与扩展。
3.实现原理
3.1.身份认证
- 证书认证:kubelet 使用由集群 CA 签发的客户端证书,证书中需包含以下信息:
- 用户名:
system:node:<nodeName>
(如system:node:node01
) - 组名:
system:nodes
。 - 证书验证流程:API Server 通过 CA 根证书验证 kubelet 证书的合法性,并提取用户与组信息。
3.2.授权策略
- 允许的操作:
- 读操作:访问当前节点绑定的 Pod、ConfigMap、Secret 等资源。
- 写操作:更新当前节点的状态(
status
)、Pod 状态(需NodeRestriction
插件支持)。 - 认证相关操作:TLS 引导(
certificatesigningrequests
)、Token 验证等。 - 禁止的操作:跨节点资源操作、非绑定资源的删除/创建。
2.3.准入控制
通过 NodeRestriction
插件进一步限制写操作:
- 仅允许 kubelet 修改其所属节点的
Node
对象。 - 仅允许修改当前节点绑定的 Pod 状态。
4.授权流程
- 请求发起
kubelet 向 API Server 发起请求(如更新节点状态)。 - 认证阶段
API Server 验证 kubelet 的 TLS 证书,提取用户system:node:<nodeName>
和组system:nodes
。 - 授权阶段
Node 授权器检查请求的 操作类型(Verb)、资源类型(Resource)、命名空间(Namespace)是否符合策略:
- 若请求为 读操作,检查资源是否属于当前节点。
- 若请求为 写操作,结合
NodeRestriction
插件验证资源归属。
- 准入控制
NodeRestriction
插件拦截非法写操作(如修改其他节点的状态)。 - 请求处理
通过所有检查后,API Server 执行操作并返回结果。
5.参数配置与实操案例
5.1.启用 Node 授权模式
在 API Server 启动参数中配置:
# kube-apiserver.yaml 片段
spec:
containers:
- command:
- kube-apiserver
- --authorization-mode=Node,RBAC # 启用 Node 和 RBAC 授权
- --admission-control=...,NodeRestriction,... # 启用准入控制插件
kubelet__100">5.2.生成 kubelet 证书
使用 cfssl
工具生成证书(需包含 system:nodes
组):
// csr.json
{
"CN": "system:node:node01",
"hosts": ["node01"],
"key": { "algo": "rsa", "size": 2048 },
"names": [
{ "O": "system:nodes" } // 组名必须为 system:nodes
]
}
5.3.RBAC 配置(可选)
若需扩展权限,可创建 ClusterRole 并绑定到 system:nodes
组:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: node-reader
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: node-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:nodes
6.常见问题与调试
- 权限拒绝(403 错误)
- 检查证书中的用户名和组是否正确。
- 确认 API Server 启用了
Node
授权模式和NodeRestriction
插件。
- 证书过期
使用kubeadm certs renew
更新 kubelet 证书。 - 跨节点操作拦截
确保NodeRestriction
插件已启用,并验证 Pod 是否绑定到当前节点。
7.扩展与最佳实践
- 与 RBAC 结合:通过 RBAC 细化权限(如允许节点读取特定 ConfigMap)。
- 安全加固:定期轮换证书、审计节点操作日志。
- 多租户场景:结合命名空间隔离,限制节点仅能访问所属租户资源。