这里我试图通过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个副本。问题是什么?
答案 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可以解决当前的负载。