繁体   English   中英

允许在 Kubernetes master 上调度 Pod?

[英]Allow scheduling of pods on Kubernetes master?

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

我们希望有一个高度可用的 master 设置,但我们目前没有足够的硬件来专用三台服务器来仅作为 Kubernetes master 服务,所以我希望能够允许用户 pod 被安排在Kubernetes 大师。 我在 /etc/systemd/system/kubelet.service 中设置了 --register-schedulable=true 但它仍然显示为 SchedulingDisabled。

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

这个问题表明应该可以在主节点上调度 pod,但我几乎找不到关于这个主题的任何其他内容。

如果您使用的是 Kubernetes 1.7 及更高版本:

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

使用以下命令清除所有主控

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

一、获取master的名字

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-

对于在 AWS 上使用 kops 的任何人。 我想在 master 上启用 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

我不知道为什么主节点显示为NotReady 它不应该。 尝试执行kubectl describe node mymasternode来找出答案。

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

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

kubectl taint nodes mymasternode dedicated-

要了解为什么这有效,请阅读taints 和 tolerations

允许在 master 上调度 pod

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

验证主人没有被污染

kubectl describe node | egrep -i taint

Taints: <none>

在 master 中安排和运行测试 pod

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

这个答案是其他 SO 答案的组合,来自 Victor G、Aryak Sengupta 和其他人。

节点角色.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-

另一种列出节点中所有污点并清除受污染节点的方法。

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

由于 Openshift 4.x CoreOs 直接集成在 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

答案是

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

根据: https ://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#control-plane-node-isolation

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM