Kubernetes HPA 指标错误?
Kubernetes HPA wrong metrics?
我已经在 Google Cloud 上创建了一个 GKE 测试集群。它有 3 个节点和 2 vCPUs / 8 GB RAM。我已经在上面部署了两个 java 应用程序
这是 yaml 文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapi
spec:
selector:
matchLabels:
app: myapi
strategy:
type: Recreate
template:
metadata:
labels:
app: myapi
spec:
containers:
- image: eu.gcr.io/myproject/my-api:latest
name: myapi
imagePullPolicy: Always
ports:
- containerPort: 8080
name: myapi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myfrontend
spec:
selector:
matchLabels:
app: myfrontend
strategy:
type: Recreate
template:
metadata:
labels:
app: myfrontend
spec:
containers:
- image: eu.gcr.io/myproject/my-frontend:latest
name: myfrontend
imagePullPolicy: Always
ports:
- containerPort: 8080
name: myfrontend
---
然后我想添加一个具有以下详细信息的 HPA:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: myfrontend
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myfrontend
minReplicas: 2
maxReplicas: 5
targetCPUUtilizationPercentage: 50
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: myapi
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapi
minReplicas: 2
maxReplicas: 4
targetCPUUtilizationPercentage: 80
---
如果我检查 kubectl top pods 它会显示一些非常奇怪的指标:
NAME CPU(cores) MEMORY(bytes)
myapi-6fcdb94fd9-m5sh7 194m 1074Mi
myapi-6fcdb94fd9-sptbb 193m 1066Mi
myapi-6fcdb94fd9-x6kmf 200m 1108Mi
myapi-6fcdb94fd9-zzwmq 203m 1074Mi
myfrontend-788d48f456-7hxvd 0m 111Mi
myfrontend-788d48f456-hlfrn 0m 113Mi
HPA 信息:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
myapi Deployment/myapi 196%/80% 2 4 4 32m
myfrontend Deployment/myfrontend 0%/50% 2 5 2 32m
但是如果我检查其中一个节点的正常运行时间,它会显示一个较低的值:
[myapi@myapi-6fcdb94fd9-sptbb /opt/]$ uptime
09:49:58 up 47 min, 0 users, load average: 0.48, 0.64, 1.23
知道为什么它显示完全不同的东西。为什么 hpa 显示当前 CPU 利用率的 200%?正因为如此,它在空闲时也使用了最大的副本。有什么想法吗?
HPA 的 targetCPUUtilizationPercentage
是目标容器 CPU requests 的百分比 Pods。如果您未在 Pod 规范中指定任何 CPU 请求,则 HPA 无法进行计算。
在您的情况下,HPA 似乎假定 100m
作为 CPU 请求(或者您可能有一个 LimitRange 将默认 CPU 请求设置为 100m
).您 Pods 的当前使用量约为 200m
,这就是 HPA 显示利用率约为 200% 的原因。
要正确设置 HPA,您需要为 Pods 指定 CPU 请求。类似于:
containers:
- image: eu.gcr.io/myproject/my-api:latest
name: myapi
imagePullPolicy: Always
ports:
- containerPort: 8080
name: myapi
resources:
requests:
cpu: 500m
或您的 Pods 需要的任何值。如果将 targetCPUUtilizationPercentage
设置为 80,则 HPA 将在 400m
使用时触发升级操作,因为 500m
的 80% 是 400m
.
除此之外,您使用的是过时版本的 HorizontalPodAutoscaler:
对于 v2beta2 版本,规范看起来有点不同。类似于:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: myapi
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapi
minReplicas: 2
maxReplicas: 4
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
参见 examples。
但是,上述 CPU 使用机制仍然适用。
我已经在 Google Cloud 上创建了一个 GKE 测试集群。它有 3 个节点和 2 vCPUs / 8 GB RAM。我已经在上面部署了两个 java 应用程序
这是 yaml 文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapi
spec:
selector:
matchLabels:
app: myapi
strategy:
type: Recreate
template:
metadata:
labels:
app: myapi
spec:
containers:
- image: eu.gcr.io/myproject/my-api:latest
name: myapi
imagePullPolicy: Always
ports:
- containerPort: 8080
name: myapi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myfrontend
spec:
selector:
matchLabels:
app: myfrontend
strategy:
type: Recreate
template:
metadata:
labels:
app: myfrontend
spec:
containers:
- image: eu.gcr.io/myproject/my-frontend:latest
name: myfrontend
imagePullPolicy: Always
ports:
- containerPort: 8080
name: myfrontend
---
然后我想添加一个具有以下详细信息的 HPA:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: myfrontend
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myfrontend
minReplicas: 2
maxReplicas: 5
targetCPUUtilizationPercentage: 50
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: myapi
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapi
minReplicas: 2
maxReplicas: 4
targetCPUUtilizationPercentage: 80
---
如果我检查 kubectl top pods 它会显示一些非常奇怪的指标:
NAME CPU(cores) MEMORY(bytes)
myapi-6fcdb94fd9-m5sh7 194m 1074Mi
myapi-6fcdb94fd9-sptbb 193m 1066Mi
myapi-6fcdb94fd9-x6kmf 200m 1108Mi
myapi-6fcdb94fd9-zzwmq 203m 1074Mi
myfrontend-788d48f456-7hxvd 0m 111Mi
myfrontend-788d48f456-hlfrn 0m 113Mi
HPA 信息:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
myapi Deployment/myapi 196%/80% 2 4 4 32m
myfrontend Deployment/myfrontend 0%/50% 2 5 2 32m
但是如果我检查其中一个节点的正常运行时间,它会显示一个较低的值:
[myapi@myapi-6fcdb94fd9-sptbb /opt/]$ uptime
09:49:58 up 47 min, 0 users, load average: 0.48, 0.64, 1.23
知道为什么它显示完全不同的东西。为什么 hpa 显示当前 CPU 利用率的 200%?正因为如此,它在空闲时也使用了最大的副本。有什么想法吗?
HPA 的 targetCPUUtilizationPercentage
是目标容器 CPU requests 的百分比 Pods。如果您未在 Pod 规范中指定任何 CPU 请求,则 HPA 无法进行计算。
在您的情况下,HPA 似乎假定 100m
作为 CPU 请求(或者您可能有一个 LimitRange 将默认 CPU 请求设置为 100m
).您 Pods 的当前使用量约为 200m
,这就是 HPA 显示利用率约为 200% 的原因。
要正确设置 HPA,您需要为 Pods 指定 CPU 请求。类似于:
containers:
- image: eu.gcr.io/myproject/my-api:latest
name: myapi
imagePullPolicy: Always
ports:
- containerPort: 8080
name: myapi
resources:
requests:
cpu: 500m
或您的 Pods 需要的任何值。如果将 targetCPUUtilizationPercentage
设置为 80,则 HPA 将在 400m
使用时触发升级操作,因为 500m
的 80% 是 400m
.
除此之外,您使用的是过时版本的 HorizontalPodAutoscaler:
对于 v2beta2 版本,规范看起来有点不同。类似于:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: myapi
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapi
minReplicas: 2
maxReplicas: 4
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
参见 examples。
但是,上述 CPU 使用机制仍然适用。