我正在库伯内特斯集群上工作,在那里我将服务从GCloud入口引导到我的服务。其中一个服务endpoint未能通过HTTP的健康检查,但将其传递为TCP。
当我将GCloud中的健康检查选项更改为TCP时,健康检查通过,我的endpoint正常工作,但几分钟后,GCloud上的健康检查将该端口重置回HTTP,健康检查再次失败,给我一个502响应在我的endpoint上。
我不知道这是Google Cloud中的错误还是我在库伯内特斯做错了什么。我在这里粘贴了我的YAML配置:
命名空间
apiVersion: v1
kind: Namespace
metadata:
name: parity
labels:
name: parity
存储类
apiVersion: storage.k8s.io/v1
metadata:
name: classic-ssd
namespace: parity
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd
zones: us-central1-a
reclaimPolicy: Retain
秘密
apiVersion: v1
kind: Secret
metadata:
name: tls-secret
namespace: ingress-nginx
data:
tls.crt: ./config/redacted.crt
tls.key: ./config/redacted.key
状态集合
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: parity
namespace: parity
labels:
app: parity
spec:
replicas: 3
selector:
matchLabels:
app: parity
serviceName: parity
template:
metadata:
name: parity
labels:
app: parity
spec:
containers:
- name: parity
image: "etccoop/parity:latest"
imagePullPolicy: Always
args:
- "--chain=classic"
- "--jsonrpc-port=8545"
- "--jsonrpc-interface=0.0.0.0"
- "--jsonrpc-apis=web3,eth,net"
- "--jsonrpc-hosts=all"
ports:
- containerPort: 8545
protocol: TCP
name: rpc-port
- containerPort: 443
protocol: TCP
name: https
readinessProbe:
tcpSocket:
port: 8545
initialDelaySeconds: 650
livenessProbe:
tcpSocket:
port: 8545
initialDelaySeconds: 650
volumeMounts:
- name: parity-config
mountPath: /parity-config
readOnly: true
- name: parity-data
mountPath: /parity-data
volumes:
- name: parity-config
secret:
secretName: parity-config
volumeClaimTemplates:
- metadata:
name: parity-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "classic-ssd"
resources:
requests:
storage: 50Gi
服务
apiVersion: v1
kind: Service
metadata:
labels:
app: parity
name: parity
namespace: parity
annotations:
cloud.google.com/app-protocols: '{"my-https-port":"HTTPS","my-http-port":"HTTP"}'
spec:
selector:
app: parity
ports:
- name: default
protocol: TCP
port: 80
targetPort: 80
- name: rpc-endpoint
port: 8545
protocol: TCP
targetPort: 8545
- name: https
port: 443
protocol: TCP
targetPort: 443
type: LoadBalancer
进入
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-parity
namespace: parity
annotations:
#nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.global-static-ip-name: cluster-1
spec:
tls:
secretName: tls-classic
hosts:
- www.redacted.com
rules:
- host: www.redacted.com
http:
paths:
- path: /
backend:
serviceName: web
servicePort: 8080
- path: /rpc
backend:
serviceName: parity
servicePort: 8545
问题
我已经修改了主机名等,但这是我的基本配置。我还从以下文档中运行了hello应用程序容器以进行调试:https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app
这是hello app服务的端口8080上入口的endpoint所指向的。这很好,不是问题所在,但这里只是为了澄清。
因此,这里的问题是,在使用GKE和我的ingress LoadBalancer在Google云上创建集群(ingress文件中的集群-1全局静态ip名称),然后在上面的文件中创建Kubernetes配置后,当我转到Google计算引擎时,Google云上的endpoint的健康检查失败-
当我编辑健康检查以不使用HTTP协议而使用TCP协议时,健康检查通过/rpc
endpoint,我可以很好地卷曲它,它会返回给我正确的响应。
问题是,几分钟后,相同的健康检查返回到HTTP协议,即使我将其编辑为TCP,然后健康检查失败,当我再次卷曲它时,我得到502响应。
在Kubernetes中创建入口之前,我不确定是否有办法将Google云健康检查配置附加到我的Kubernetes入口。也不知道为什么要重置,也不知道这是谷歌云上的bug还是我在Kubernetes做错了什么。如果您注意到我的statefolset部署,我已经指定livenessProbe和readinessProbe使用TCP检查端口8545。
650秒的延迟是由于这里的票证问题,通过将延迟增加到600秒以上来解决(以避免提到的比赛条件):https://github.com/kubernetes/ingress-gce/issues/34
我真的不确定为什么在我将其指定为TCP后,Google Cloud健康检查会重置回HTTP。任何帮助都将不胜感激。
我找到了一个解决方案,其中我在endpoint上的有状态集上添加了一个 /healthz健康检查的新容器,并将入口的健康检查配置为检查kubernetes分配的8080端口上的endpoint作为HTTP类型的健康检查,这使它工作。
现在还不清楚为什么在使用TCP时会发生重置。
在设置ELB健康检查的对话框中,它会声明: 如果实例未通过健康检查,它将自动从负载均衡器中删除。自定义健康检查以满足您的特定需要。 当健康检查失败时,将从ELB后面删除实例。我的问题是围绕“健康门槛”设置。当你悬停在帮助上时,它会说: 在声明EC2实例健康之前连续运行状况检查成功的次数。 如果实例声明为健康的,它是否被拉回负载平衡组?
SOFABoot 为 Spring Boot 的健康检查能力增加了 Readiness Check 的能力。如果你需要使用 SOFA 中间件,那么建议使用 SOFABoot 的健康检查能力的扩展,来更优雅的上线应用实例 引入健康检查扩展 要引入 SOFABoot 的健康检查能力的扩展,只需要引入以下的 Starter 即可: <dependency> <groupId>com.alipay
我正在学习如何使用入口在谷歌Kubernetes引擎上公开我的应用程序。我学习了几本教程,大致了解了需要什么。然而,我不知道为什么我的服务被标记为不健康,尽管它们可以从我直接定义的NodePort服务访问。 这是我的部署文件:(我删除了一些数据,但大部分保持不变) 在阅读时,我需要一个ReadinessProbe和LivinessProbe,以便GKE在我定义的路径上运行健康检查,并且通过使用我自
健康检查配置概述。 filter.http.HealthCheck filter.http.HealthCheck proto { "pass_through_mode": "{...}", "endpoint": "...", "cache_time": "{...}" } pass_through_mode (BoolValue, REQUIRED) 指定过滤器是否在传递模式下运
健康检查架构概述。如果为集群配置了健康检查,则会发出相应的统计信息。详见请参考统计相关文档。 HealthCheck HealthCheck.Payload HealthCheck.HttpHealthCheck HealthCheck.TcpHealthCheck HealthCheck.RedisHealthCheck HealthCheck HealthCheck proto { "ti
健康检查架构概述。 如果为集群配置了健康检查,则会发出相应的统计信息。并且记录在这里。 { "type": "...", "timeout_ms": "...", "interval_ms": "...", "unhealthy_threshold": "...", "healthy_threshold": "...", "path": "...", "send": [