允许在Kubernetes主节点上调度Pod吗?

44

我使用通用安装脚本在裸机上为CoreOS设置了Kubernetes。它正在运行当前稳定版本1298.6.0,带有Kubernetes版本1.5.4。

我们想要一个高可用的主节点配置,但是目前没有足够的硬件资源可以专门用于作为Kubernetes主节点,所以我希望能够允许用户Pod在Kubernetes主节点上进行调度。我在/etc/systemd/system/kubelet.service中设置了--register-schedulable=true,但它仍然显示为SchedulingDisabled。

我尝试添加将节点作为worker的设置,包括将worker TLS证书添加到/etc/kubernetes/ssl中,将这些设置添加到kubelet.service中,添加一个指向这些证书的/etc/kubernetes/worker-kubeconfig.yaml,并将该信息添加到/etc/kubernetes/manifests/kube-proxy.yaml中。我使用现有节点作为添加内容的模板。这样注册了另一个节点并将其显示在主机名下,然后原始的主节点和新注册的节点都显示为NotReady,SchedulingDisabled。

这个问题表明,在主节点上调度Pod应该是可能的,但是在这个主题上我几乎找不到其他任何资料。

10个回答

59

如果您正在使用 Kubernetes 1.7 及以上版本:

kubectl taint node mymasternode node-role.kubernetes.io/master:NoSchedule-

1
我认为这个命令应该在结尾处加上一个减号,以实际从主机中删除这个污点。对吗? - Victor G
1
应该是被接受的答案。@VictorG - 是的,它应该是 kubectl taint node dashboard2.pvi.com node-role.kubernetes.io/master:NoSchedule- - Aryak Sengupta
4
从版本 1.20 开始,命令应为: kubectl taint node mymasternode node-role.kubernetes.io/control-plane:NoSchedule- 更多信息请参见:https://kubernetes.io/docs/reference/labels-annotations-taints/#node-role-kubernetes-io-control-plane - Pascal
尝试编辑答案时,“建议的编辑队列已满”。@Pascal是正确的,应该添加到这个答案中。版本<1.20与>1.20。控制台输出添加:taint“node-role.kubernetes.io/master:NoSchedule”未找到 - akahunahi

13

使用下面的命令来解除所有主节点的污点标记

kubectl taint nodes --all node-role.kubernetes.io/master-

11

首先,获取主人的名称

kubectl get nodes

NAME     STATUS   ROLES    AGE   VERSION
yasin   Ready    master   11d   v1.13.4

我们可以看到有一个名为yasin且角色为master的节点。如果我们想将其用作worker,我们应该运行

kubectl taint nodes yasin node-role.kubernetes.io/master-

9

node-role.kubernetes.io/master

node-role.kubernetes.io/control-plane

官方 Kubernetes 文档: node-role-kubernetes-io-master

因此,在版本v1.20及以上的解决方案是:

kubectl taint node <master-node> node-role.kubernetes.io/control-plane:NoSchedule-
kubectl taint node <master-node> node-role.kubernetes.io/master:NoSchedule-

1
点赞,但是要指出的是,在我的v1.24.0安装中,我有mastercontrol-plane两个污点,两者都有NoSchedule效果,需要将其移除。 - Andy Brown
谢谢,是的,我忘了提到两个污点都应该被清除。 - TheDHM

7
对于在AWS上使用kops的任何人。我想启用将Pods调度到主节点上。 $ kubectl get nodes -owide 给出以下输出:
NAME                                          STATUS
...
...
ip-1**-**-**-***.********.compute.internal    Ready                      node
ip-1**-**-**-***.********.master.internal     Ready,SchedulingDisabled   master
                                                    ^^^^^^^^^^^^^^^^^^
ip-1**-**-**-***.********.compute.internal    Ready                      node
...
...

并且 $ kubectl describe nodes ip-1**-**-**-***.********.master.internal:

...
...
Taints:             <none>
Unschedulable:      true
...                 ^^^^
...

使用以下命令 $ kubectl patch node MASTER_NAME -p "{\"spec\":{\"unschedulable\":false}}" 来打补丁主节点,这对我很有效,现在Pod的调度已经启用。
参考文献:https://github.com/kubernetes/kops/issues/639#issuecomment-287015882

1
这在 OP 的裸机上可以工作,例如,“the-hard-way” 安装也是如此。此补丁还会持续存在于 kubelet 升级过程中,因此额外加分!谢谢。 - jhaavist
做得漂亮! - saumilsdk

4
我不知道为什么主节点显示为NotReady,它不应该这样。尝试执行kubectl describe node mymasternode来查找原因。 SchedulingDisabled是因为主节点被dedicated=master:NoSchedule污染了。
针对所有主节点执行此命令以消除污点:
kubectl taint nodes mymasternode dedicated-

为了理解为什么这样做有效,请阅读污点和容忍的相关内容。

2

允许在主节点上调度Pod

kubectl taint node --all node-role.kubernetes.io/master:NoSchedule-

验证主节点是否被污染

kubectl describe node | egrep -i taint

污点: <无>

在主节点上安排和运行测试Pod

kubectl run -it  busybox-$RANDOM --image=busybox --restart=Never -- date

这篇答案是其他 Stack Overflow 上的回答的综合,包括 Victor G、Aryak Sengupta 和其他人的内容。

0

0

自从 Openshift 4.x,CoreOs 直接集成在 Kubernetes 配置中(您可以通过这种方式使所有主节点可调度)。

# edit the field spec.mastersSchedulable to set a value true
$ oc patch schedulers.config.openshift.io cluster --type json \
     -p '[{"op": "add", "path": "/spec/mastersSchedulable", "value": true}]'

或者使用

oc edit schedulers.config.openshift.io cluster 

并编辑该字段

spec:
    mastersSchedulable: true

0

列出所有节点中的污点并解除污点。

root@lab-a:~# kubectl get nodes -o json | jq ".items[]|{name:.metadata.name, taints:.spec.taints}"
{
  "name": "lab-a",
  "taints": null
}
{
  "name": "lab-b",
  "taints": [
    {
      "effect": "NoSchedule",
      "key": "node-role.kubernetes.io/master"
    }
  ]
}

实验室A没有任何污点。 因此我们去除实验室B的污点:

root@lab-a:~# k taint node lab-b node-role.kubernetes.io/master:NoSchedule-
node/lab-b untainted

在Ubuntu中安装jq: apt-get install jq


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接