Kubernetes で有効化できる Admission Plugin である「NodeRestriction」の動作確認をした.簡単にまとめておく!
「NodeRestriction」は kubelet に対して Node / Pod の操作範囲を制限できる.具体例を挙げると kubelet によるラベル操作を自ノードに制限し,他ノードを拒否できる.また特定のプレフィックスを付けたラベルは kubelet によって操作できないようにも制限できる.詳しくは以下のドキュメントに載っている.
検証環境
今回は kubeadm を使って構築した Kubernetes v1.23.1 クラスタを使う.以下のように controlplane
と node01
ノードで構成している.
$ kubectl get nodes NAME STATUS ROLES AGE VERSION controlplane Ready control-plane,master 10d v1.23.1 node01 Ready <none> 10d v1.23.1
そして kube-apiserver
の --enable-admission-plugins
オプションを確認すると「NodeRestriction」も有効化してある.
apiVersion: v1 kind: Pod metadata: name: kube-apiserver namespace: kube-system spec: containers: - command: - kube-apiserver - --authorization-mode=Node,RBAC - --enable-admission-plugins=NodeRestriction (中略)
さらに今回試す構成図とラベル操作の関係を図にまとめた!
my-label=my-value
node-restriction.kubernetes.io/my-label=my-value
検証 1 : ラベル操作
まず,controlplane
ノードの kubelet の操作を前提にするために /etc/kubernetes/kubelet.conf
を読み込んでおく.
controlplane $ export KUBECONFIG=/etc/kubernetes/kubelet.conf
さっそくラベル my-label=my-value
を controlplane
と node01
ノードに設定する.「NodeRestriction」を有効化しているため controlplane
ノードは成功する.しかし node01
ノードは失敗する.
controlplane $ kubectl label node controlplane my-label=my-value node/controlplane labeled controlplane $ kubectl label node node01 my-label=my-value Error from server (Forbidden): nodes "node01" is forbidden: node "controlplane" is not allowed to modify node "node01"
検証 2 : ラベル操作 (node-restriction.kubernetes.io/
)
「NodeRestriction」を有効化していると node-restriction.kubernetes.io/
プレフィックスを付けたラベルの更新は「自ノードだとしても」拒否される.ドキュメントには「ワークロードを隔離するために予約されている」と書かれている.以下のように controlplane
ノードでも失敗する.
controlplane $ kubectl label node controlplane node-restriction.kubernetes.io/my-label=my-value Error from server (Forbidden): nodes "controlplane" is forbidden: is not allowed to modify labels: node-restriction.kubernetes.io/my-label
検証 3 : NodeRestriction を無効化する
最後は「NodeRestriction」を無効化する./etc/kubernetes/manifests/kube-apiserver.yaml
で kube-apiserver の --enable-admission-plugins
オプションを削除する.すると以下のように controlplane
と node01
ノードで全てのラベル操作ができてしまう.
controlplane $ export KUBECONFIG=/etc/kubernetes/kubelet.conf controlplane $ kubectl label node controlplane my-label=my-value node/controlplane labeled controlplane $ kubectl label node node01 my-label=my-value node/node01 labeled controlplane $ kubectl label node controlplane node-restriction.kubernetes.io/my-label=my-value node/controlplane labeled
参考 : kube-bench
参考として「NodeRestriction」は CIS Kubernetes Benchmark でも検知できる.kube-apiserver で「NodeRestriction」を有効化していないと kube-bench
で FAIL になる.
controlplane $ kube-bench (中略) [FAIL] 1.2.16 Ensure that the admission control plugin NodeRestriction is set (Automated) (中略) 1.2.16 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. --enable-admission-plugins=...,NodeRestriction,...