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。 Horizontal 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。
我们的服务器 运行 使用 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。 Horizontal 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。