最近发现公司的发布总是自动重构失败,一直没搞清楚,因为有时候重构(重新部署)是好的,只是发布有问题也就一直没管了,后面经常出现服务崩溃问题,发现是pod内存达到指定的阙值自动重构了,然后自动重构又失败了直接导致服务停了,后面找阿里云的工单扯了半天,虽然没解决问题 不过发现了问题是因为有个节点项目部署不上去,就是重构会跳到别的节点上去,然后那个节点是对这个项目有问题的,所以经常重构失败,以前的解决方法是手动伸缩多几个 然后pod起来后再伸缩调回自己需要的 这样就能重构成功了,后面觉得太麻烦了 就着手解决了
上面的是k8s的文档 几乎所有都能在上面找到
一般驱逐pod都是用的污点,但是我们的pod已经在运行了,这里我就用的亲和性来调度了
我用的是.spec.affinity.nodeAffinity来设置的
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- antarctica-east1
- antarctica-west1
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
- 节点必须包含一个键名为
topology.kubernetes.io/zone
的标签, 并且该标签的取值必须为antarctica-east1
或antarctica-west1
。 - 节点最好具有一个键名为
another-node-label-key
且取值为another-node-label-value
的标签。
你可以使用 operator
字段来为 Kubernetes 设置在解释规则时要使用的逻辑操作符。 你可以使用 In
、NotIn
、Exists
、DoesNotExist
、Gt
和 Lt
之一作为操作符。
按照上面的示例给对应的节点打上不同的标签 然后给对应的pod设置yaml就好了