是否可以创建一个节点池,调度程序默认会忽略该节点池,但节点选择器可以将其作为目标?
答案 0 :(得分:5)
如果您的节点池具有静态大小或者至少它没有自动缩放,那么这很容易实现。
首先,taint该池中的节点:
kubectl taint node \
`kubectl get node -l cloud.google.com/gke-nodepool=my-pool -o name` \
dedicated=my-pool:NoSchedule
然后在您的Pod(模板)中的affinity
下添加tolerations
和spec:
值,这些值需要能够在这些节点上运行:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: dedicated
operator: In
values: ["my-pool"]
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
然后将这些注释添加到需要能够在这些节点上运行的Pod(模板)中:
annotations:
scheduler.alpha.kubernetes.io/tolerations: >
[{"key":"dedicated", "value":"my-pool"}]
scheduler.alpha.kubernetes.io/affinity: >
{
"nodeAffinity": {
"requiredDuringSchedulingIgnoredDuringExecution": {
"nodeSelectorTerms": [
{
"matchExpressions": [
{
"key": "dedicated",
"operator": "In",
"values": ["my-pool"]
}
]
}
]
}
}
}
有关详细信息,请参阅design doc。
您需要将--register-with-taints
参数添加到kubelet
:
使用给定的taints列表注册节点(逗号分隔
<key>=<value>:<effect>
)。如果register-node为false,则为no-op。
在另一个answer中,我举了一些关于如何坚持该设置的例子。 GKE现在还具有对tainting node pools
的特定支持答案 1 :(得分:1)
现在GKE支持节点污点。节点污点将在创建期间应用于所有节点,并将保留。所以你不需要运行kubectl taint命令。有关详细信息,请查看it asks for XML Schema to validate against:。
答案 2 :(得分:0)
对于未启用Alpha支持的Kubernetes 1.6上的用户,您需要使用新的&#34; beta&#34;等级字段。相当于上面接受的答案是我在下面创建的。这基于文档中的以下文章:https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: dedicated
operator: In
values: ["my-pool"]
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
containers:
- name: with-node-affinity
image: gcr.io/google_containers/pause:2.0