如何在Kubernetes中通过Node-Restriction机制精确限制Kubelet仅能修改其节点上的资源?

2026-04-29 01:532阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计634个文字,预计阅读时间需要3分钟。

如何在Kubernetes中通过Node-Restriction机制精确限制Kubelet仅能修改其节点上的资源?

Node-Restriction是Kubernetes内置的安全机制,用于限制kubelet只能读写自身节点对象以及所属Pod相关的资源,防止kubelet误操作或被攻击后越权访问集群其他敏感资源。

Node-Restriction 的作用范围

启用后,kubelet 只能:

  • 更新自身对应的 Node 对象(如状态、条件、容量、分配资源等)
  • 创建、更新、删除自己节点上运行的 Pod 对象(仅限 status 字段和部分 spec 字段,如 nodeName
  • 读取自身节点上的 SecretConfigMapServiceAccountToken 等绑定资源(需配合 RBAC 和 volume projection)
  • 不能修改其他节点的 Node、其他节点上的 Pod、任意 DeploymentServiceNamespace 等资源

启用 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分钟。

如何在Kubernetes中通过Node-Restriction机制精确限制Kubelet仅能修改其节点上的资源?

Node-Restriction是Kubernetes内置的安全机制,用于限制kubelet只能读写自身节点对象以及所属Pod相关的资源,防止kubelet误操作或被攻击后越权访问集群其他敏感资源。

Node-Restriction 的作用范围

启用后,kubelet 只能:

  • 更新自身对应的 Node 对象(如状态、条件、容量、分配资源等)
  • 创建、更新、删除自己节点上运行的 Pod 对象(仅限 status 字段和部分 spec 字段,如 nodeName
  • 读取自身节点上的 SecretConfigMapServiceAccountToken 等绑定资源(需配合 RBAC 和 volume projection)
  • 不能修改其他节点的 Node、其他节点上的 Pod、任意 DeploymentServiceNamespace 等资源

启用 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