升级到GKE中的更大节点池

时间:2020-05-24 17:32:35

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

我在具有3个节点的GKE群集中有一个节点池(默认池),机器类型为n1-standard-1。他们托管了6个带有Redis集群的Pod(3个主节点和3个从属)和3个带有Node.js示例应用程序的Pod。

我想升级到具有3个节点的更大计算机类型(n1-standard-2)。

documentation中,谷歌给出了一个示例,以升级到其他计算机类型(在新的节点池中)。

我已经在开发过程中对其进行了测试,并且在执行以下命令时一段时间无法访问我的节点池:

for node in $(kubectl get nodes -l cloud.google.com/gke-nodepool=default-pool -o=name); do
  kubectl cordon "$node";
done

在终端中,我收到一条消息,通知我与服务器的连接已丢失(我无法执行kubectl命令)。几分钟后,我可以重新连接,并获得所需的输出,如文档中所示。

第二次,我尝试省略了警戒命令,然后跳到以下命令:

for node in $(kubectl get nodes -l cloud.google.com/gke-nodepool=default-pool -o=name); do
  kubectl drain --force --ignore-daemonsets --delete-local-data --grace-period=10 "$node";
done

这是因为,如果我正确地解释了kubernetes documentation,那么在使用汲取命令时,节点将自动断线。但是我得到了与cordon命令相同的结果:我失去了与群集的连接几分钟,并且无法到达同一节点上托管的nodejs示例应用程序。几分钟后,它恢复了自身。

我找到了一种升级到具有更大计算机类型的新节点池的解决方法:我编辑了部署/ statefulset yaml文件并更改了nodeSelector。 GKE中的节点池标记有:

cloud.google.com/gke-nodepool=NODE_POOL_NAME

所以我将正确的nodeSelector添加到了deployment.yaml文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment
  labels:
    app: example
spec:
  replicas: 3
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
      nodeSelector:
            cloud.google.com/gke-nodepool:  new-default-pool
      containers:
      - name: example
        image: IMAGE
        ports:
        - containerPort: 3000

这没有停机时间,但是我不确定这是在生产环境中正确的方法。

警戒线/排水命令出了什么问题,或者我没有正确使用它们?

1 个答案:

答案 0 :(得分:3)

给节点加密码将导致该节点从负载均衡器后端列表中删除,因此也将耗费资源。正确的方法是在部署上设置反关联性规则,这样就不会将Pod部署在同一节点或同一区域上。这将导致Pod在整个节点池中均匀分布。

然后,如果启用了旧节点池,则必须在其上禁用自动缩放,每次缓慢消耗1-2个节点,并等待它们出现在新节点池中,并确保始终保持其中一个容器的大小。动态部署,以便可以处理流量。