在Kubernetes上管理Node.js和Puppeteer的驱逐



我目前看到一个奇怪的问题,我有一个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。它总是有一些延迟显示数据。

相关内容

  • 没有找到相关文章

最新更新