如何在Kubernetes中通过Node-Restriction机制精确限制Kubelet仅能修改其节点上的资源?
- 内容介绍
- 文章标签
- 相关推荐
本文共计634个文字,预计阅读时间需要3分钟。
Node-Restriction是Kubernetes内置的安全机制,用于限制kubelet只能读写自身节点对象以及所属Pod相关的资源,防止kubelet误操作或被攻击后越权访问集群其他敏感资源。
Node-Restriction 的作用范围
启用后,kubelet 只能:
- 更新自身对应的
Node对象(如状态、条件、容量、分配资源等) - 创建、更新、删除自己节点上运行的
Pod对象(仅限status字段和部分spec字段,如nodeName) - 读取自身节点上的
Secret、ConfigMap、ServiceAccountToken等绑定资源(需配合 RBAC 和 volume projection) - 不能修改其他节点的
Node、其他节点上的Pod、任意Deployment、Service、Namespace等资源
启用 Node-Restriction 准入控制器
该控制器必须在 API Server 启动时通过 --enable-admission-plugins 显式启用,且需排在 NodeRestriction 插件名靠前位置(推荐放在 NamespaceLifecycle 之后、LimitRanger 之前):
注意:不是 kubelet 配置项,而是控制平面组件 kube-apiserver 的配置
- 编辑 kube-apiserver 启动参数(如
/etc/kubernetes/manifests/kube-apiserver.yaml) - 确保包含:
--enable-admission-plugins=...,NodeRestriction,... - 确认未启用
--disable-admission-plugins=NodeRestriction - 重启 kube-apiserver(静态 Pod 会自动滚动更新)
配套要求:Node 客户端证书需含正确标识
Node-Restriction 依赖 kubelet 使用的客户端证书中包含特定字段,否则请求会被拒绝:
- CN(Common Name)必须为
system:node:<nodename>(如system:node:node-1) - O(Organization)必须为
system:nodes - 证书需由集群 CA 签发(不接受自签名或外部 CA)
使用 kubeadm 创建的集群默认满足;若手动签发证书,请严格按此格式生成。
验证是否生效
可尝试用 kubelet 凭据(如 /var/lib/kubelet/pki/kubelet-client-current.pem)发起非法请求测试:
- 执行:
curl -k --cert /var/lib/kubelet/pki/kubelet-client-current.pem --key /var/lib/kubelet/pki/kubelet-client-current-key.pem https://<api-server-ip>:6443/api/v1/nodes/other-node-1</api-server-ip> - 若返回
Forbidden(HTTP 403),说明限制已起效 - 而访问自身节点(
/api/v1/nodes/node-1)应返回 200
本文共计634个文字,预计阅读时间需要3分钟。
Node-Restriction是Kubernetes内置的安全机制,用于限制kubelet只能读写自身节点对象以及所属Pod相关的资源,防止kubelet误操作或被攻击后越权访问集群其他敏感资源。
Node-Restriction 的作用范围
启用后,kubelet 只能:
- 更新自身对应的
Node对象(如状态、条件、容量、分配资源等) - 创建、更新、删除自己节点上运行的
Pod对象(仅限status字段和部分spec字段,如nodeName) - 读取自身节点上的
Secret、ConfigMap、ServiceAccountToken等绑定资源(需配合 RBAC 和 volume projection) - 不能修改其他节点的
Node、其他节点上的Pod、任意Deployment、Service、Namespace等资源
启用 Node-Restriction 准入控制器
该控制器必须在 API Server 启动时通过 --enable-admission-plugins 显式启用,且需排在 NodeRestriction 插件名靠前位置(推荐放在 NamespaceLifecycle 之后、LimitRanger 之前):
注意:不是 kubelet 配置项,而是控制平面组件 kube-apiserver 的配置
- 编辑 kube-apiserver 启动参数(如
/etc/kubernetes/manifests/kube-apiserver.yaml) - 确保包含:
--enable-admission-plugins=...,NodeRestriction,... - 确认未启用
--disable-admission-plugins=NodeRestriction - 重启 kube-apiserver(静态 Pod 会自动滚动更新)
配套要求:Node 客户端证书需含正确标识
Node-Restriction 依赖 kubelet 使用的客户端证书中包含特定字段,否则请求会被拒绝:
- CN(Common Name)必须为
system:node:<nodename>(如system:node:node-1) - O(Organization)必须为
system:nodes - 证书需由集群 CA 签发(不接受自签名或外部 CA)
使用 kubeadm 创建的集群默认满足;若手动签发证书,请严格按此格式生成。
验证是否生效
可尝试用 kubelet 凭据(如 /var/lib/kubelet/pki/kubelet-client-current.pem)发起非法请求测试:
- 执行:
curl -k --cert /var/lib/kubelet/pki/kubelet-client-current.pem --key /var/lib/kubelet/pki/kubelet-client-current-key.pem https://<api-server-ip>:6443/api/v1/nodes/other-node-1</api-server-ip> - 若返回
Forbidden(HTTP 403),说明限制已起效 - 而访问自身节点(
/api/v1/nodes/node-1)应返回 200

