如何在 kubelet 上配置 NodeRestriction 插件?

问题描述

让我们从一些上下文开始:

我正在学习 CKS 并阅读 CIS_Kubernetes_Benchmark_v1.6.0.pdf 并且有一个令人困惑的部分:

1.2.17 Ensure that the admission control plugin NodeRestriction is set (Automated) 

...
Verify that the --enable-admission-plugins argument is set to a value that includes 
NodeRestriction. 
  
Remediation: 
Follow the Kubernetes documentation and configure NodeRestriction plug-in on kubelets. 
Then,edit the API server pod specification file /etc/kubernetes/manifests/kube-
apiserver.yaml on the master node and set the --enable-admission-plugins parameter 
to a value that includes NodeRestriction.

关于检查 /etc/kubernetes/manifests/kube-apiserver.yaml 是否有条目 - --enable-admission-plugins=NodeRestriction,... 的部分是有道理的,烦人的部分是
"Follow the Kubernetes documentation and configure NodeRestriction plug-in on kubelets."
谷歌非常难,Kubernetes 官方文档也不清楚如何做到这一点。

既然上下文已经存在,问题是:

在kube-apiserver上设置---enable-admission-plugins=NodeRestriction后,如何验证kubelet上的NodeRestriction插件是否配置正确?

解决方法

要正确启用 NodeRestrictions Admission Controller Plugin,您实际上需要在 3 个不同的地方更新 kubernetes 配置:

  1. kube-apiserver: - --enable-admission-plugins=NodeRestriction,...
  2. kube-apiserver: - --authorization-mode=Node,RBAC(您必须指定节点)
  3. kubelet(每个节点的):/var/lib/kubelet/config.yaml 应该有 authorization.mode: Webhook(其他 kubernetes 发行版可能会用另一种配置方法替换 /var/lib/kubelet/config.yaml,但我确定会有一个匹配值)

当 kubelet 的 authorization.mode 设置为 Webhook 时,而不是默认的 AlwaysAllow,它会将授权决策卸载到 kubernetes api-server。 Node Authorization模式是一种特殊用途的授权模式,专门对kubelet发出的API请求进行授权。

(下面的 Giantswarm 文章非常值得一读,并且很好地解释了为什么要实施此设置,我将尝试对其进行总结,说这是一种通用强化,有助于防止因工作负载受损或不良行为者而导致权限升级.)

来源:
1.) Kubernetes Security Essentials (LFS260)
2.) Securing the Configuration of Kubernetes Cluster Components
3.) Using Node Authorization