我目前看到一个奇怪的问题,我有一个Pod一直是Kubernetes的Evicted
。
My Cluster/App Information:
- 节点大小:
7.5GB RAM
/2vCPU
- 应用语言:
nodejs
- 用例:木偶网站提取(我有代码加载一个网站,然后提取一个元素,每小时重复几次)
- 在
Azure Kubernetes Service (AKS)
上运行
What I tried:
-
检查Puppeteer是否正确关闭,并且我正在删除任何chrome实例。在添加force killer后,它似乎是这样做的
-
检查
kubectl get events
显示的行:
8m17s Normal NodeHasSufficientMemory node/node-1 Node node-1 status is now: NodeHasSufficientMemory
2m28s Warning EvictionThresholdMet node/node-1 Attempting to reclaim memory
71m Warning FailedScheduling pod/my-deployment 0/4 nodes are available: 1 node(s) had taint {node.kubernetes.io/memory-pressure: }, that the pod didn't tolerate, 3 node(s) didn't match node selector
- 检查
kubectl top pods
,显示它只使用了约30%的节点内存 在我的kubernetes
.yaml
中添加了资源限制:apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-d
spec:
replicas: 1
template:
spec:
containers:
- name: main
image: my-image
imagePullPolicy: Always
resources:
limits:
memory: "2Gi"
当前思维方式:
一个节点有X个可用内存,但是由于预留空间,X个内存中只有Y个是可分配的。然而,当在node.js
中运行os.totalmem()
时,我仍然能够看到允许Node分配X内存。
我在这里想的是Node.js由于它的垃圾收集而分配到X,实际上应该在Y而不是X。然而,在我的限制下,我实际上希望它看到限制而不是K8S节点内存限制。
还有什么我应该尝试解决这个问题吗?有人吃过这个吗?
你的NodeJS应用程序不知道它在容器中运行。它只看到Linux内核报告的内存量(它总是报告节点的总内存)。你应该让你的应用程序意识到cgroup的限制,参见https://medium.com/the-node-js-collection/node-js-memory-management-in-container-environments-7eb8409a74e8
关于驱逐:当你设置内存限制时,这是否解决了驱逐的问题?
不要太相信kubectl top pods
。它总是有一些延迟显示数据。