我想为命名空间保留一些工作节点。我看到堆叠流和中等的钞票
如何将命名空间分配给某些节点?
https://medium.com/@alejandro.ramirez.ch/streserving-a-kubernetes-node-for-specific-nodes-e75dc8297076
我知道我们可以使用污点和节点选择器来实现这一点。我的问题是,如果人们了解了nodeselector或taint的详细信息,我们如何防止他们将pod部署到这些专用的工作节点中。
谢谢
要完成您所需要的,基本上您必须使用taint。假设您有一个Kubernetes集群,其中有一个Master和两个Worker节点:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
knode01 Ready <none> 8d v1.16.2
knode02 Ready <none> 8d v1.16.2
kubemaster Ready master 8d v1.16.2
例如,我将knode01设置为Prod,knode02设置为Dev.
$ kubectl taint nodes knode01 key=prod:NoSchedule
$ kubectl taint nodes knode02 key=dev:NoSchedule
要在这些节点中运行pod,我们必须在yaml文件上指定一个规范中的容忍会话:
apiVersion: v1
kind: Pod
metadata:
name: pod1
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "key"
operator: "Equal"
value: "dev"
effect: "NoSchedule"
这个pod(pod1(将始终在knode02中运行,因为它被设置为dev。如果我们想在prod上运行它,我们的容忍度应该是这样的:
tolerations:
- key: "key"
operator: "Equal"
value: "prod"
effect: "NoSchedule"
由于我们只有2个节点,并且两者都被指定为只运行prod或dev,如果我们试图在不指定容差的情况下运行pod,那么pod将进入挂起状态:
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod0 1/1 Running 0 21m 192.168.25.156 knode01 <none> <none>
pod1 1/1 Running 0 20m 192.168.32.83 knode02 <none> <none>
pod2 1/1 Running 0 18m 192.168.25.157 knode01 <none> <none>
pod3 1/1 Running 0 17m 192.168.32.84 knode02 <none> <none>
shell-demo 0/1 Pending 0 16m <none> <none> <none> <none>
去除污点:
$ kubectl taint nodes knode02 key:NoSchedule-
就是这样做的
- 添加新标签,例如,ns=reserved,标签到特定的工作节点
- 将污点和容忍添加到此工作节点上的目标特定pod
- 您需要在该命名空间中定义RBAC角色和角色绑定,以控制其他用户可以执行的操作