繁体   English   中英

HPA 缩放在 Spring 引导启动期间触发。 HPA 中的当前 CPU 指标很高,但节点级别的 CPU 利用率很低

[英]HPA scaling is triggered during Spring boot startup. Current CPU metric in HPA is high though CPU utilization at node level is low

我们在启用了自动缩放 (HPA) 的 GKE 上有一个 Spring Boot 应用程序。 在启动期间,即使没有流量,HPA 也会启动并开始扩展 pod。 “kubectl get hpa”的结果显示当前 CPU 平均利用率很高,而节点和 POD 的 CPU 利用率非常低。 扩展期间的行为是相同的,并且创建多个 Pod 最终导致节点扩展。

应用部署Yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-api
  labels:
    app: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      serviceAccount: myapp-ksa
      containers:
      - name: myapp
        image: gcr.io/project/myapp:126
        env:
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: my-db-credentials
              key: username
        - name: DB_PASS
          valueFrom:
            secretKeyRef:
              name: my-db-credentials
              key: password
        - name: DB_NAME
          valueFrom:
            secretKeyRef:
              name: my-db-credentials
              key: database
        - name: INSTANCE_CONNECTION
          valueFrom:
            configMapKeyRef:
              name: connectionname
              key: connectionname
        resources:
          requests:
            cpu: "200m"
            memory: "256Mi"
        ports:
        - containerPort: 8080
        livenessProbe:
          httpGet:
            path: /actuator/health
            port: 8080
          initialDelaySeconds: 90
          periodSeconds: 5
        readinessProbe:
          httpGet:
            path: /actuator/health
            port: 8080
          initialDelaySeconds: 60
          periodSeconds: 10
      - name: cloudsql-proxy
        image: gcr.io/cloudsql-docker/gce-proxy:1.17
        env:
          - name: INSTANCE_CONNECTION
            valueFrom:
              configMapKeyRef:
                name: connectionname
                key: connectionname
        command: ["/cloud_sql_proxy",
                  "-ip_address_types=PRIVATE",
                  "-instances=$(INSTANCE_CONNECTION)=tcp:5432"]
        securityContext:
          runAsNonRoot: true
          runAsUser: 2
          allowPrivilegeEscalation: false
        resources:
          requests:
            memory: "128Mi"
            cpu:    "100m"

Yaml 用于 HPA:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-api
  labels:
    app: myapp
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp-api
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80
  - type: Resource
    resource:
      name: memory
      target: 
        type: Utilization
        averageUtilization: 80

各种命令的结果:

$ kubectl get pods

kubectl 获取 pod

$ kubectl get hpa

kubectl 获取 hpa

$ kubectl top nodes

kubectl 顶级节点

$ kubectl top pods --all-namespaces

kubectl top pods --all-namespaces

由于问题已在评论部分得到解决,我决定提供一个社区 Wiki 答案只是为了更好地了解其他社区成员。

问题中的kubectl get hpa命令显示当前memory的高利用率导致 Pod 扩展。

kubectl get hpa命令读取TARGETS列可能会造成混淆:
注意: 33% 的值适用于 memory 或 cpu...?

$ kubectl get hpa app-1
NAME    REFERENCE          TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
app-1   Deployment/app-1   33%/80%, 4%/80%   2         5         5          5m37s

我建议使用kubectl describe hpa <HPA_NAME>命令和grep毫无疑问地确定当前指标:

$ kubectl describe hpa app-1 | grep -A 2 "Metrics:"
Metrics:                                                  ( current / target )
  resource memory on pods  (as a percentage of request):  33% (3506176) / 80%
  resource cpu on pods  (as a percentage of request):     4% (0) / 80%

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM