GKE群集自动缩放器无法基于nodeaffinity扩展Nodepool

时间:2020-03-20 15:16:16

标签: google-cloud-platform google-kubernetes-engine google-deployment-manager

先决条件:

  1. 最新稳定值为1.14 *或1.15 *的GKE

  2. 标记的节点池,由Deployment Manager创建

  3. 在RWO模式下需要持久性卷的应用程序

  4. 每个应用程序部署都不同,应与其他应用程序同时运行,并应在每1个节点1个pod中运行。

  5. 每个吊舱没有副本,应该支持滚动更新(按舵机)。

设计:

集群和节点池的部署管理器模板,

节点池带有标签,每个节点具有相同的标签(初始创建后)

每个部署到新名称空间的新应用,什么都有唯一的服务地址

每个新版本都可以基于节点标签(可以在安装或更新应用期间由kubectl更改节点标签)来进行“新安装”或“更新现有版本”

问题:

如果从浏览器控制台界面创建了群集,那将正常工作。如果集群是通过GCP部署创建的,则错误(即使在未连接驱动器的情况下,也在k8s文档的nginx模板上进行了节点亲和性测试)

Warning  FailedScheduling   17s (x2 over 17s)  default-scheduler   0/2 nodes are available: 2 node(s) didn't match node selector.
  Normal   NotTriggerScaleUp  14s                cluster-autoscaler  pod didn't trigger scale-up (it wouldn't fit if a new node is added): 2 node(s) didn't match node selector    

出什么问题了?部署管理器会创建不良标签?

affinity used:
    #   affinity:
    #     nodeAffinity:
    #       requiredDuringSchedulingIgnoredDuringExecution:
    #         nodeSelectorTerms:
    #         - matchExpressions:
    #           - key: node/nodeisbusy
    #             operator: NotIn
    #             values:
    #             - busy

2 个答案:

答案 0 :(得分:1)

GCP提供了两种方法来控制仅限于一个节点池或一组节点的部署。

  1. Taints & Tolerations
  2. Node Affinity

下面将解释#1方法-nodeselectortolerations的组合以实现对部署以及自动缩放的限制。

这里是一个例子:

让我们说一个集群cluster-x可用。 我们说它包含两个节点池

  1. project-a-node-pool-配置为自动缩放1到2个节点。
  2. project-b-node-pool-配置为自动缩放1到3个节点。

节点池标签

project-a-node-pool中的每个节点都将包含标签。默认情况下已配置。

cloud.google.com/gke-nodepool:project-a-node-pool

project-b-node-pool中的每个节点都将包含标签。默认情况下已配置。

cloud.google.com/gke-nodepool:project-b-node-pool

节点池污染

Taints添加到每个节点池。作为示例命令:

gcloud容器节点池创建项目节点池--cluster cluster-x
--node-taints project = a:NoExecute

gcloud容器节点池创建project-b-node-pool --cluster cluster-x
--node-taints project = b:NoExecute

Snapshot of Taints configured for project-a-node-pool

部署容忍度

将与tolerations匹配的taint添加到部署YAML文件中。

tolerations:
- key: "project"
  operator: "Equal"
  value: "a" (or "b")
  effect: "NoExecute"

测试部署

尝试进行新的部署,并根据异味/公差对检查每个部署是否都在进行。值为tolerationa的部署应转到project-a-node-pool。值为tolerationb的部署应转到project-b-node-pool。 一旦在任何一个节点池中达到足够的内存/ cpu请求,较新的部署都应触发该节点池中的自动扩展。

答案 1 :(得分:0)

感谢您链接到Google支持错误跟踪器,最好直接询问他们。

关于节点的标签-确保它们具有标签。如果标签是由Deployment Manager创建的,则该标签不适用于调度程序。