允许在Kubernetes master上安排pod?

时间:2017-03-31 19:05:36

标签: kubernetes coreos

我使用generic install scripts在裸机上在CoreOS上设置Kubernetes。它使用Kubernetes版本1.5.4运行当前稳定版本1298.6.0。

我们希望拥有一个高度可用的主设置,但我们目前没有足够的硬件专门用三台服务器作为Kubernetes主设备,所以我希望能够允许要在Kubernetes master上安排的用户pod。我在/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。我使用现有节点作为添加内容的模板。这在master的主机名下注册了另一个节点,然后它和原始主节点都显示为NotReady,SchedulingDisabled。

This question表示主节点上的调度窗口应该是可能的,但我几乎找不到任何关于该主题的内容。

9 个答案:

答案 0 :(得分:25)

如果您使用的是Kubernetes 1.7及以上版本:

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

答案 1 :(得分:4)

首先,获取母版的名称

kubectl get nodes

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

我们可以看到有一个节点名为yasin,角色为master。如果要使用它作为工作程序,则应运行

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

答案 2 :(得分:3)

我不知道为什么主节点显示为NotReady;它不应该。尝试执行kubectl describe node mymasternode以查找。

SchedulingDisabled是因为主节点被污染并带有dedicated=master:NoSchedule

对所有主人执行此命令以消除污点:

kubectl taint nodes mymasternode dedicated-

要理解为何有效,请阅读taints and tolerations

答案 3 :(得分:1)

适用于在AWS上使用kops的任何人。我想在主服务器上启用Pod的调度。

$ 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

答案 4 :(得分:1)

允许在主服务器上调度pods

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

确认主人没有污染

kubectl describe node | egrep -i taint

Taints: <none>

计划并在主服务器中运行测试容器

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

此答案是Victor G,Aryak Sengupta等人的其他SO答案的组合。

答案 5 :(得分:0)

使用以下命令取消所有母版的污染

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

答案 6 :(得分: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"
    }
  ]
}

lab-a没有任何污染。 所以我们取消Lab-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

答案 7 :(得分:0)

由于Openshift 4.x CoreO是直接集成在Kubernetes配置上的(您可以通过这种方式使所有Master成为可调度的

# 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

答案 8 :(得分:0)