Kubernetes - 强制重启特定内存使用

Kubernetes - force restarting on specific memory usage

我们的服务器 运行 使用 Kubernetes 进行自动缩放,我们使用 newRelic 进行可观察性 但我们面临一些问题

1- 我们需要重启 pods 当内存使用量达到 1G 时它会自动重启 当它达到 1.2G 但一切都进展缓慢。

2- 在没有对服务器的请求时终止 pods

我的配置

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}
  labels:
    app: {{ .Release.Name }}
spec:
  revisionHistoryLimit: 2
  replicas: {{ .Values.replicas }}
  selector:
    matchLabels:
      app: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Release.Name }}
          image: "{{ .Values.imageRepository }}:{{ .Values.tag }}"
          env:
            {{- include "api.env" . | nindent 12 }}
          resources:
            limits:
              memory: {{ .Values.memoryLimit }}
              cpu: {{ .Values.cpuLimit }}
            requests:
              memory: {{ .Values.memoryRequest }}
              cpu: {{ .Values.cpuRequest }}
      imagePullSecrets:
        - name: {{ .Values.imagePullSecret }}      
      {{- if .Values.tolerations }}
      tolerations:
{{ toYaml .Values.tolerations | indent 8 }}
      {{- end }}
      {{- if .Values.nodeSelector }}
      nodeSelector:
{{ toYaml .Values.nodeSelector | indent 8 }}
      {{- end }}

我的价值观文件

memoryLimit: "2Gi"
cpuLimit: "1.0"
memoryRequest: "1.0Gi"
cpuRequest: "0.75"

这就是我想要达到的目标

如果您想确保 pod/deployment 不会消耗超过 1.0Gi 的内存,那么设置 MemoryLimit 就可以了。

一旦您设置了该限制并且您的容器超过了它,它就会成为潜在的终止候选对象。如果它继续消耗超出其限制的内存,则容器将被终止。如果终止的容器可以重新启动,kubelet 会重新启动它,就像任何其他类型的运行时容器故障一样。

如需更多准备工作,请访问部分 exceeding a container's memory limit

如果您希望根据请求扩展您的部署,您将需要由外部适配器提供自定义指标,例如 prometheus。 Horizo​​ntal pod autoascaler 原生为您提供仅基于 CPU 和内存(基于来自指标服务器的指标)的扩展。

适配器文档为您提供walkthrough how to configure it with Kubernetes API and HPA. The list of other adapters can be found here

然后您可以根据 http_requests 指标扩展您的部署,如图 here or request-per-seconds as described here