我在具有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
这没有停机时间,但是我不确定这是在生产环境中正确的方法。
警戒线/排水命令出了什么问题,或者我没有正确使用它们?
答案 0 :(得分:3)
给节点加密码将导致该节点从负载均衡器后端列表中删除,因此也将耗费资源。正确的方法是在部署上设置反关联性规则,这样就不会将Pod部署在同一节点或同一区域上。这将导致Pod在整个节点池中均匀分布。
然后,如果启用了旧节点池,则必须在其上禁用自动缩放,每次缓慢消耗1-2个节点,并等待它们出现在新节点池中,并确保始终保持其中一个容器的大小。动态部署,以便可以处理流量。