kubernetes - Kubernetes hpa 无法获取内存指标(明确说明时)
问题描述
我正在尝试在集群中实现 Pod 的自动缩放。我尝试过使用“虚拟”部署和 hpa,但没有问题。现在,我正在尝试将它集成到我们的“真实”微服务中,并且它会不断返回
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True SucceededGetScale the HPA controller was able to get the target's current scale
ScalingActive False FailedGetResourceMetric the HPA was unable to compute the replica count: missing request for memory
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedGetResourceMetric 18m (x5 over 19m) horizontal-pod-autoscaler unable to get metrics for resource memory: no metrics returned from resource metrics API
Warning FailedComputeMetricsReplicas 18m (x5 over 19m) horizontal-pod-autoscaler failed to get memory utilization: unable to get metrics for resource memory: no metrics returned from resource metrics API
Warning FailedComputeMetricsReplicas 16m (x7 over 18m) horizontal-pod-autoscaler failed to get memory utilization: missing request for memory
Warning FailedGetResourceMetric 4m38s (x56 over 18m) horizontal-pod-autoscaler missing request for memory
这是我的 hpa:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: #{Name}
namespace: #{Namespace}
spec:
scaleTargetRef:
apiVersion: apps/v1beta1
kind: Deployment
name: #{Name}
minReplicas: 2
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: #{Name}
namespace: #{Namespace}
spec:
replicas: 2
selector:
matchLabels:
app: #{Name}
template:
metadata:
annotations:
linkerd.io/inject: enabled
labels:
app: #{Name}
spec:
containers:
- name: #{Name}
image: #{image}
resources:
limits:
cpu: 500m
memory: "300Mi"
requests:
cpu: 100m
memory: "200Mi"
ports:
- containerPort: 80
name: #{ContainerPort}
当我这样做时,我可以看到内存和 cpu kubectl top pods
。当我这样做时,我也可以看到请求和限制kubectl describe pod
。
Limits:
cpu: 500m
memory: 300Mi
Requests:
cpu: 100m
memory: 200Mi
我能想到的唯一区别是我的虚拟服务没有linkerd sidecar。
解决方案
为了让 HPA 使用资源指标, Pod 的每个容器都需要对给定资源(CPU 或内存)提出请求。
您的 Pod 中的 Linkerd 边车容器似乎没有定义内存请求(它可能有 CPU 请求)。这就是 HPA 抱怨的原因missing request for memory
。
--proxy-cpu-request
但是,您可以使用和--proxy-memory-request
注入标志为 Linkerd 容器配置内存和 CPU 请求。
另一种可能性是使用这些注释来配置 CPU 和内存请求:
config.linkerd.io/proxy-cpu-request
config.linkerd.io/proxy-memory-request
用这两种方式中的任何一种定义内存请求都应该使 HPA 工作。
参考:
- Linkerd 问题最初在此问题中报告并在此拉取请求中修复
- 在Linkerd 2.3.0
--proxy-cpu-request
中,--proxy-memory-request
替换--proxy-cpu
为--proxy-memory
- Istio sidecar也存在类似问题,但似乎也已修复
推荐阅读
- javascript - Node.js 和 mongodb:TypeError:无法读取未定义的属性“findAll”
- docker - 为什么我不能在本地构建然后运行我的容器
- python - 当唯一的区别是大写时,为什么 os.rename 不重命名文件?
- javascript - 在纯 JavaScript 中删除具有相同类的所有元素
- sql - 无效操作:由于内部错误,不支持这种类型的关联子查询模式;
- javascript - 使用 v-model 时调整 v-text-field 的值
- angular - 如何使用带有 ngrx 8.0.0 beta 的 StoreModule.forFeature 注册单个减速器
- python - 如何根据条件重构数据框以将列值转换为行值
- c++ - Ceres Solver C++:分段错误:11
- operating-system - 应该如何使用页面缓冲将修改后的页面写出到辅助内存?