[英]GCE Load Balancer Health Check Fails (Connection Refused)
我的 (GCE) Load Balancer 健康检查因connection refused
错误而失败,最终将我的 GCE Ingress 标记为UNHEALTHY
。 现在我想知道如何解决这个问题。
对于我的设置,我使用的是GKE Autopilot集群。 而且我已经多次拆除并重新启动我的设置,总是导致相同的结果。
假设我的部署配置了一个由多个容器组成的 pod 模板(并非所有容器都公开端口)。
旁注:为简单起见,我跳过了一些配置,例如配置映射。
apiVersion: apps/v1
kind: Deployment
metadata:
name: some-app-deployment
spec:
selector:
matchLabels:
app: some-app
replicas: 2
template:
metadata:
labels:
app: some-app
spec:
restartPolicy: Always
containers:
- name: web-server
image: {{some-app-image}}
command: ['app', 'web-server']
ports:
- name: web-server
containerPort: 5000
protocol: TCP
- name: admin-server
image: {{some-app-image}}
command: ['app', 'admin-server']
ports:
- name: admin-server
containerPort: 5001
protocol: TCP
- name: worker
image: {{some-app-image}}
command: ['app', 'worker']
- name: cron
image: {{some-app-image}}
command: ['app', 'cron']
- name: helper
image: {{some-app-image}}
command: [ '/bin/bash', '-c', '--' ]
args: [ 'while true; do sleep 30; done;' ]
以下是 BackendConfig CRD,它应该定义了健康检查。 我选择将路径定义为/favicon.ico
因为 Load Balancer Health Check 恰好需要200 OK
响应并且 Web 服务器基本路径/
发出重定向302
,因此它会失败 Health Check。 使用kubectl port-forward
我确认/favicon.ico
实际上发出了200 OK
并且确实如此。 顺便提一句。 只是为了排除这个问题,我也尝试了其他路径但没有成功。
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: http-hc-config
spec:
healthCheck:
type: HTTP
port: 5000
requestPath: "/favicon.ico"
checkIntervalSec: 20
此外,还有一个自定义 header 添加到admin
端点。
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: x-header-config
spec:
customRequestHeaders:
headers:
- "X-Client-Region:{client_region}"
以下为服务说明。 它根据文档通过注释引用 BackendConfig。 文档中并没有具体说明如何引用健康检查,所以我将其映射到相关端口。
apiVersion: v1
kind: Service
metadata:
name: some-app-service
annotations:
cloud.google.com/backend-config: '{
"default":"http-hc-config",
"ports":{"4001":"x-header-config"}}'
spec:
type: NodePort
selector:
app: some-app
ports:
- name: web
targetPort: 5000
protocol: TCP
port: 4000
- name: admin
targetPort: 5001
protocol: TCP
port: 4001
我确认我的服务正在运行,因为我可以成功地kubectl port-forward
pod 并访问网络服务器内容。
现在设置的最后一部分是这个入口 object。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress
annotations:
kubernetes.io/ingress.class: gce
spec:
rules:
- host: admin.example.com
http:
paths:
- path: /*
pathType: ImplementationSpecific
backend:
service:
name: some-app-service
port:
number: 4001
- http:
paths:
- path: /*
pathType: ImplementationSpecific
backend:
service:
name: some-app-service
port:
number: 4000
编辑 #1 和 #2:执行gcloud compute health-checks describe {{HEALTH_DEF_ID}}
我收到以下 output port 4001
上的健康检查,它似乎与定义的 BackendConfig CRD 不同步:
checkIntervalSec: 15
creationTimestamp: '2022-02-07T11:30:50.059-08:00'
description: Default kubernetes L7 Loadbalancing health check for NEG.
healthyThreshold: 1
httpHealthCheck:
portSpecification: USE_SERVING_PORT
proxyHeader: NONE
requestPath: /
id: {{REDACTED}}
kind: compute#healthCheck
logConfig:
enable: true
name: k8s1-4622dadc-{{REDACTED}}
selfLink: https://www.googleapis.com/compute/v1/projects/{{REDACTED}}
timeoutSec: 15
type: HTTP
unhealthyThreshold: 2
以下是port 4000
的内容,它令人惊讶地包含正确的path
和port
配置:
checkIntervalSec: 20
creationTimestamp: '2022-02-07T12:12:59.248-08:00'
description: Default kubernetes L7 Loadbalancing health check for NEG.
healthyThreshold: 1
httpHealthCheck:
port: 5000
portSpecification: USE_FIXED_PORT
proxyHeader: NONE
requestPath: /favicon.ico
id: {{REDACTED}}
kind: compute#healthCheck
name: k8s1-4622dadc-{{REDACTED}}
selfLink: https://www.googleapis.com/compute/v1/projects/{{REDACTED}}
timeoutSec: 15
type: HTTP
unhealthyThreshold: 2
要么我的设置有问题,要么 BackendConfig 没有平等地应用于 Ingress 规则部分中的所有服务。
编辑#3:
port 4000
的健康检查日志条目显示:
healthCheckProbeResult: {
detailedHealthState: "TIMEOUT"
healthCheckProtocol: "HTTP"
healthState: "UNHEALTHY"
ipAddress: "10.40.129.203"
previousDetailedHealthState: "UNKNOWN"
previousHealthState: "UNHEALTHY"
probeCompletionTimestamp: "2022-02-07T20:06:10.955412154Z"
probeRequest: "/favicon.ico"
probeResultText: "HTTP response: , Error: Connection refused"
probeSourceIp: "35.191.12.114"
responseLatency: "0.000569s"
targetIp: "10.40.129.203"
targetPort: 5000
}
编辑 #4:我需要调整 BackendConfig 注释,因为与我之前的定义所显示的相比,我的案例实际上涉及更多。
问题在于我应用服务的 BackendConfig 注释的方式。 我的假设是"default"
配置将应用于两个端口,额外的 header 配置将另外应用于端口 4001。
但这种情况并非如此。
如果 BackendConfig 偏离默认值,您必须为每种偏离 HTTP 端口的情况定义一个。 BackendConfigs 不会合并,您不能为每个端口添加多个配置。
---
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: config-4000
spec:
healthCheck:
type: HTTP
port: 5000
requestPath: "/favicon.ico"
checkIntervalSec: 20
---
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: config-4001
spec:
healthCheck:
type: HTTP
port: 5000
requestPath: "/favicon.ico"
checkIntervalSec: 20
headers:
- "X-Client-Region:{client_region}"
---
apiVersion: v1
kind: Service
metadata:
name: some-app-service
annotations:
cloud.google.com/backend-config: '{"ports":{
"4000":"config-4000",
"4001":"config-4001"
}}'
spec:
type: NodePort
selector:
app: some-app
ports:
- name: web
targetPort: 5000
protocol: TCP
port: 4000
- name: admin
targetPort: 5001
protocol: TCP
port: 4001
编辑#1:
另一个问题(导致连接错误)出现在我的项目配置中:
127.0.0.1
而不是0.0.0.0
你能做一个kubectl describe ing ingress
吗?
我认为您应该看到有关无效通配符的错误。 你应该离开*
了。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress
annotations:
kubernetes.io/ingress.class: gce
spec:
rules:
- host: admin.example.com
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: some-app-service
port:
number: 4001
- http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: some-app-service
port:
number: 4000
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.