Kubernetes水平pod自动缩放器根据副本计数

时间:2018-04-20 12:14:21

标签: kubernetes kubernetes-helm

这里我试图通过kubernetes自定义集群(通过kubeadm创建)中的helm图表部署dockerized Web服务。因此,当它进行自动调整时,它不会根据副本计数创建副本。

这是我的部署文件。

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: {{ template "demochart.fullname" . }}
  labels:
    app: {{ template "demochart.name" . }}
    chart: {{ template "demochart.chart" . }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ template "demochart.name" . }}
      release: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app: {{ template "demochart.name" . }}
        release: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 80
          volumeMounts:
            - name: cred-storage
              mountPath: /root/
          resources:
{{ toYaml .Values.resources | indent 12 }}
    {{- with .Values.nodeSelector }}
      nodeSelector:
{{ toYaml . | indent 8 }}
    {{- end }}
    {{- with .Values.affinity }}
      affinity:
{{ toYaml . | indent 8 }}
    {{- end }}
    {{- with .Values.tolerations }}
      tolerations:
{{ toYaml . | indent 8 }}
    {{- end }}
      volumes:
        - name: cred-storage
          hostPath:
            path: /home/aodev/
            type:

这是values.yaml

replicaCount: 3

image:
  repository: REPO_NAME
  tag: latest
  pullPolicy: IfNotPresent

service:
  type: NodePort
  port: 8007

ingress:
  enabled: false
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  path: /
  hosts:
    - chart-example.local
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

resources: 
  # We usually recommend not to specify default resources and to leave this as a conscious
  # choice for the user. This also increases chances charts run on environments with little
  # resources, such as Minikube. If you do want to specify resources, uncomment the following
  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
  limits:
    cpu: 1000m
    memory: 2000Mi
  requests:
    cpu: 1000m
    memory: 2000Mi

nodeSelector: {}

tolerations: []

affinity: {}

以下是我的运行pod,其中包括heapster和metrics服务器以及我的webservice。

kubectl get pods before autoscaling

以下是hpa文件

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
 annotations:
 name: entitydetection
 namespace: kube-system
spec:
  maxReplicas: 20
  minReplicas: 5
  scaleTargetRef:
    apiVersion: apps/v1beta2
    kind: Deployment
    name: entitydetection
  targetCPUUtilizationPercentage: 50

所以我在部署中将副本计数设为3,将minReplicas设为5,将maxReplicas设为20,将targetCPUUtilization设为50%hpa。因此,当cpu利用率超过50%时,它会随机创建副本,而不是根据副本计数。

因此,当CPU超过50%且年龄为36岁时,会创建2个副本。理想情况下应该创建3个副本。问题是什么?

kubectl get pods after autoscaling

1 个答案:

答案 0 :(得分:0)

以下是HPA设计documentation的引用:

  

自动缩放器实现为控制循环。它定期查询由Scale子资源的Status.PodSelector描述的pod,并收集它们的CPU利用率。

     

然后,它比较了豆荚的算术平均值。使用Spec.CPUUtilization中定义的目标的CPU利用率,并根据需要调整Scale的副本以匹配目标(保留条件:MinReplicas <= Replicas <= MaxReplicas)。

     

CPU利用率是pod最近的CPU使用率(过去1分钟内的平均值)除以pod请求的CPU。

     

目标豆荚数由以下公式计算:

TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)    
     

启动和停止窗格可能会对指标引入噪声(例如,启动可能会暂时增加CPU)。因此,在每次操作之后,自动缩放器应该等待一段时间以获得可靠的数据。只有在最近3分钟内没有重新缩放时才能进行放大。缩小将从最后一次重新缩放开始等待5分钟。

因此,HPA产生的最小数量的pod可以解决当前的负载。