大佬教程收集整理的这篇文章主要介绍了在 GKE 中的 HPA 中扩展时出错:apiserver 无法写入 JSON 响应:http2:流已关闭,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
按照 Google 为在 Google Kubernetes ENGIne 中部署 HPA 制定的指南:https://cloud.google.com/kubernetes-ENGIne/docs/tutorials/autoscaling-metrics
并添加正确的权限,因为我在本指南中使用了 Workload IDentity:https://github.com/GoogleCloudPlatform/k8s-stackdriver/tree/master/custom-metrics-stackdriver-adapter
并且还添加了此处评论的防火墙规则:https://github.com/kubernetes-sigs/prometheus-adapter/issues/134
我遇到了 HPA 返回此错误的问题:
kubectl describe hpa -n test-namespace
name: my-hpa
namespace: test-namespace
Labels: <none>
Annotations: <none>
Creationtimestamp: Tue,13 Apr 2021 12:47:56 +0200
Reference: StatefulSet/my-set
Metrics: ( current / target )
"my-metric" on pods: <unkNown> / 1
Min replicas: 1
Max replicas: 60
StatefulSet pods: 1 current / 0 desired
Conditions:
Type Status Reason message
---- ------ ------ -------
AbletoScale True SucceededGetScale the HPA controller was able to get the target's current scale
ScalingActive false FailedGetPodsMetric the HPA was unable to compute the replica count: unable to get metric my-metric: no metrics returned from custom metrics API
Events:
Type Reason Age From message
---- ------ ---- ---- -------
Warning FailedGetPodsMetric 8m26s (x40 over 18m) horizontal-pod-autoscaler unable to get metric my-metric: no metrics returned from custom metrics API
Warning FailedComputeMetricsReplicas 3m26s (x53 over 18m) horizontal-pod-autoscaler Failed to compute desired number of replicas based on Listed metrics for StatefulSet/test-namespace/my-set: invalID metrics (1 invalID out of 1),first error is: Failed to get pods metric value: unable to get metric my-metric: no metrics returned from custom metrics API
但是 API@R_696_9260@ces 是真的,
kubectl get API@R_696_9260@ces
name @R_696_9260@CE AVAILABLE AGE
...
v1beta1.custom.metrics.k8s.io custom-metrics/custom-metrics-stackdriver-adapter True 24h
v1beta1.external.metrics.k8s.io custom-metrics/custom-metrics-stackdriver-adapter True 24h
v1beta2.custom.metrics.k8s.io custom-metrics/custom-metrics-stackdriver-adapter True 24h
...
当我尝试检索指标数据时,它返回正常,
kubectl get --raw "/APIs/custom.metrics.k8s.io/v1beta2/namespaces/test-namespace/pods/*/my-metric" | jq .
{
"kind": "MetricValueList","APIVersion": "custom.metrics.k8s.io/v1beta2","Metadata": {
"selflink": "/APIs/custom.metrics.k8s.io/v1beta2/namespaces/test-namespace/pods/%2A/my-metric"
},"items": [
{
"describedobject": {
"kind": "Pod","namespace": "test-namespace","name": "my-metrics-API-XXXX","APIVersion": "/__internal"
},"metric": {
"name": "my-metric","SELEctor": null
},"timestamp": "2021-04-13T11:15:30Z","value": "5"
}
]
}
但是堆栈驱动程序给了我这个错误:
2021-04-13T11:01:30.432634Z APIserver was unable to write a JsON response: http2: stream closed
2021-04-13T11:01:30.432679Z APIserver received an error that is not an Metav1.Status: &errors.errorString{s:"http2: stream closed"}
我必须像这样配置谷歌提供的适配器:
APIVersion: v1
kind: namespace
Metadata:
name: custom-metrics
---
APIVersion: v1
kind: @R_696_9260@ceAccount
Metadata:
name: custom-metrics-stackdriver-adapter
namespace: custom-metrics
---
APIVersion: rBAC.authorization.k8s.io/v1
kind: ClusterRoleBinding
Metadata:
name: custom-metrics:system:auth-delegator
roleRef:
APIGroup: rBAC.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: @R_696_9260@ceAccount
name: custom-metrics-stackdriver-adapter
namespace: custom-metrics
---
APIVersion: rBAC.authorization.k8s.io/v1
kind: RoleBinding
Metadata:
name: custom-metrics-auth-reader
namespace: kube-system
roleRef:
APIGroup: rBAC.authorization.k8s.io
kind: Role
name: extension-APIserver-authentication-reader
subjects:
- kind: @R_696_9260@ceAccount
name: custom-metrics-stackdriver-adapter
namespace: custom-metrics
---
APIVersion: rBAC.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
Metadata:
name: custom-metrics-resource-reader
roleRef:
APIGroup: rBAC.authorization.k8s.io
kind: ClusterRole
name: vIEw
subjects:
- kind: @R_696_9260@ceAccount
name: custom-metrics-stackdriver-adapter
namespace: custom-metrics
---
APIVersion: apps/v1
kind: Deployment
Metadata:
name: custom-metrics-stackdriver-adapter
namespace: custom-metrics
labels:
run: custom-metrics-stackdriver-adapter
k8s-app: custom-metrics-stackdriver-adapter
spec:
replicas: 1
SELEctor:
matchLabels:
run: custom-metrics-stackdriver-adapter
k8s-app: custom-metrics-stackdriver-adapter
template:
Metadata:
labels:
run: custom-metrics-stackdriver-adapter
k8s-app: custom-metrics-stackdriver-adapter
kubernetes.io/cluster-@R_696_9260@ce: "true"
spec:
@R_696_9260@ceAccountname: custom-metrics-stackdriver-adapter
containers:
- image: gcr.io/gke-release/custom-metrics-stackdriver-adapter:v0.12.0-gke.0
imagePullPolicy: Always
name: pod-custom-metrics-stackdriver-adapter
command:
- /adapter
- --use-new-resource-model=true
- --cert-dir=/tmp
- --secure-port=4443
resources:
limits:
cpu: 250m
memory: 200Mi
requests:
cpu: 250m
memory: 200Mi
securityContext:
runAsnonRoot: true
runAsUser: 1000
---
APIVersion: v1
kind: @R_696_9260@ce
Metadata:
labels:
run: custom-metrics-stackdriver-adapter
k8s-app: custom-metrics-stackdriver-adapter
kubernetes.io/cluster-@R_696_9260@ce: 'true'
kubernetes.io/name: Adapter
name: custom-metrics-stackdriver-adapter
namespace: custom-metrics
spec:
ports:
- port: 443
protocol: TCP
targetPort: 4443
SELEctor:
run: custom-metrics-stackdriver-adapter
k8s-app: custom-metrics-stackdriver-adapter
type: ClusterIP
---
APIVersion: APIregistration.k8s.io/v1
kind: API@R_696_9260@ce
Metadata:
name: v1beta1.custom.metrics.k8s.io
spec:
insecureSkipTLsverify: true
group: custom.metrics.k8s.io
groupPriorityminimum: 100
versionPriority: 100
@R_696_9260@ce:
name: custom-metrics-stackdriver-adapter
namespace: custom-metrics
version: v1beta1
---
APIVersion: APIregistration.k8s.io/v1
kind: API@R_696_9260@ce
Metadata:
name: v1beta2.custom.metrics.k8s.io
spec:
insecureSkipTLsverify: true
group: custom.metrics.k8s.io
groupPriorityminimum: 100
versionPriority: 200
@R_696_9260@ce:
name: custom-metrics-stackdriver-adapter
namespace: custom-metrics
version: v1beta2
---
APIVersion: APIregistration.k8s.io/v1
kind: API@R_696_9260@ce
Metadata:
name: v1beta1.external.metrics.k8s.io
spec:
insecureSkipTLsverify: true
group: external.metrics.k8s.io
groupPriorityminimum: 100
versionPriority: 100
@R_696_9260@ce:
name: custom-metrics-stackdriver-adapter
namespace: custom-metrics
version: v1beta1
---
APIVersion: rBAC.authorization.k8s.io/v1
kind: ClusterRole
Metadata:
name: external-metrics-reader
rules:
- APIGroups:
- "external.metrics.k8s.io"
resources:
- "*"
verbs:
- List
- get
- watch
---
APIVersion: rBAC.authorization.k8s.io/v1
kind: ClusterRoleBinding
Metadata:
name: external-metrics-reader
roleRef:
APIGroup: rBAC.authorization.k8s.io
kind: ClusterRole
name: external-metrics-reader
subjects:
- kind: @R_696_9260@ceAccount
name: horizontal-pod-autoscaler
namespace: kube-system
因为它禁用了 443 端口,我不得不更改为 4443 并加上 --cert-dir=/tmp 选项,因为没有该选项,stackdriver 会返回错误:
"unable to run custom metrics adapter: error creaTing self-signed certificates: mkdir APIserver.local.config: permission denIEd"
我想我解释了我为配置它所做的所有步骤,但没有成功。有什么想法吗?
为我解决!
经过多次测试,在HPA yaml中更改,
从 Pod
到 External
的度量,以及带有 custom.google.apis/my-metric
的度量名称,它有效!
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
namespace: test-namespace
spec:
maxReplicas: 60
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: StatefulSet
name: my-set
metrics:
- type: External
external:
metric:
name: custom.googleapis.com|my-metric
target:
averageValue: 1
type: AverageValue
以上是大佬教程为你收集整理的在 GKE 中的 HPA 中扩展时出错:apiserver 无法写入 JSON 响应:http2:流已关闭全部内容,希望文章能够帮你解决在 GKE 中的 HPA 中扩展时出错:apiserver 无法写入 JSON 响应:http2:流已关闭所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。