将新节点池添加到GKE集群

时间:2020-01-06 07:15:11

标签: docker kubernetes google-cloud-platform google-kubernetes-engine

我正在运行配置4vCPU和16 GB内存的单节点GKE集群。现在,我正计划再添加一个节点池1 vCPU和3.75 GB的RAM。

现在在单个节点上,我正在运行带有弹性连接的有状态集之类的负载,如Elasticsearch,Redis,Rabbitmq。

我没有在Pod配置中添加任何亲和力和反亲和力。如果我要添加新节点,则可能会将某些广告连播安排到新节点。虽然我只打算在新Pod上运行无状态Pod。

有什么方法可以停止在新节点上调度ES,Redis或RabbitMQ,而无需增加亲和力或任何不想重新启动(Touch)pod或服务的事情。 ES,Redis,RabbitMQ只应停留在旧节点上。

2 个答案:

答案 0 :(得分:2)

nodeSelectorkubectl patch可能是解决方案。

使用新标签

您必须使用以下命令首先用以下标签statefullnode=true来标记运行全状态工作负载的节点:

kubectl label nodes <node-name> statefullnode=true

然后,您必须使用kubectl patch修补在此节点上运行的每个部署:

kubectl patch deployments nginx-deployment -p '{"spec": {"template": {"spec": {"nodeSelector": {"statefullnode": "true"}}}}}'

使用节点名称

如果您不想标记节点,则可以简单地使用节点名称作为nodeSelector的标签。 例如,如果您的节点名称为 my-gke-node ,则运行:

kubectl patch deployments nginx-deployment -p '{"spec": {"template": {"spec": {"nodeSelector": {"kubernetes.io/hostname": "my-gke-node"}}}}}'

运行kubectl get nodes以获取集群节点的名称。

答案 1 :(得分:1)

您需要的是污渍。 “它们允许节点排斥一组吊舱”(更多详细信息,请点击https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/

在您的示例中,从上面的链接(假设node1是新节点):

kubectl taint nodes node1 key=value:NoSchedule-这意味着除非Pod具有匹配的容差,否则任何Pod都无法将其调度到node1上。 (并且您现有的吊舱没有匹配的容差)。

在您要安排在新节点上的新容器之一中,将应用以下内容:

tolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoSchedule"

因此,旧的Pod将无法计划到该新节点,只有新的Pod(如果您对它们应用公差)将能够在新的节点上进行计划。