跳转至

05 k8s根据不同命名空间指定不同节点

k8s根据不同命名空间指定不同节点

背景

在测试环境中测试不同项目时需要用到不同的环境, 有时候会需要将某一个命名空间的所有pod 都固定到一个节点或者一部分节点上, 如何处理呢?

在k8s 提供了nodeSelector 可以将pod 调度到对应的节点上, 但是需要手动在每一个服务中都加上nodeSelector. 有没有简单办法呢?

解决思路

在k8s 1.22 版本之后都支持 PodNodeSelector, 可以很好的解决这一问题

配置过程如下:

1、 配置kubernetes-apiserver

## 编辑/etc/kubernetes/manifests/kube-apiserver.yaml 
$ vim /etc/kubernetes/manifests/kube-apiserver.yaml
## 找到--enable-admission-plugins 参数, 将其修改为 --enable-admission-plugins=NodeRestriction,PodNodeSelector
## 保存退出

2、 对namespace 添加注解scheduler.alpha.kubernetes.io/node-selector: env=test

apiVersion: v1
kind: Namespace
metadata:
 name: test
 annotations:
   scheduler.alpha.kubernetes.io/node-selector: env=test
spec: {}
status: {}

3、 配置完成之后, 在test命名空间下的所有的pod 都会添加一个nodeSelector: env=test

注意: 这个nodeSelector 不是由deployment 等资源管理的, 而是通过k8s 直接配置的, 因此只会修改pod 的资源

4、在需要此命名空间的节点加上env=test 的标签, 就可以调度上去了

$ kubectl label node test env=test