kubernetes - Istio sidecar 上游 pod 重新连接问题
问题描述
我在我们的 EKS 集群上运行 istio 1.0.6(无 mTLS),并且遇到了我似乎无法弄清楚的两个 pod 之间的连接问题。
我有一个 gRPC 客户端 ( abc-client
) 和服务器 ( abc-server
) 都运行在 go 中。集群启用了自动边车注入,因此两者都在运行。
如果我只是启动这两个服务,一切都工作正常,但是每当服务器重新启动时,客户端都无法重新连接到它。从重新启动开始,我不断在客户端收到以下错误消息:
{"level":"error","error":"rpc error: code = Unavailable desc = upstream connect error or disconnect/reset before headers","time":"2019-03-19T12:07:52Z","message":"abc-server service unhealthy"}
如果没有 istio sidecar,重新连接会立即工作。当我查看 Sidecar 的日志时,abc-client
我看到了很多关于客户端尝试执行的健康检查的以下消息:
2019-03-19T12:09:41.527Z] "POST /grpc.health.v1.Health/CheckHTTP/2" 200 UF 5 0 1002 - "-" "grpc-go/1.15.0" "6a874d67-9c43-4b67-ad24-7337a26cac8d" "abc-server.abc-namespace:8086" "172.31.18.194:8086" outbound|8086||abc-server.abc-namespace.svc.cluster.local - 172.31.18.194:8086 172.31.22.131:44994
我从这些日志中得出的结论是,代理在连接到不再存在的上游服务器时遇到问题,因此出现了UF
标志(上游故障),但仍在200
向客户端返回状态代码。对我来说,这种行为似乎不会触发重新连接。
我没有设置任何VirtualService
s 或DestinationRule
s,它只是一个启用了 sidecars 的简单 istio 集群。
我错过了什么?在此先感谢您的帮助。
解决方案
问题是连接到无头服务。我service.yaml
看起来像这样:
apiVersion: v1
kind: Service
metadata:
name: grpc-test-server
spec:
type: ClusterIP
clusterIP: None
selector:
app: grpc-test-server
role: grpc-test-server
ports:
- name: grpc
port: 9999
targetPort: grpc
根据问题#10659和#7495,istio 尚不适用于无头服务。
所以,如果你不需要你的服务是无头的,你可以clusterIP: None
从 yaml 中删除,一切都应该按预期工作。
我仍然不知道如何使需要无头服务的状态集工作。
推荐阅读
- c - 结构的原始输出
- python - 将函数参数传递给另一个函数pandas python
- android - 移除顶部键盘面板
- linux - 如何访问从 docker 容器暴露的端口?
- sas - 在循环中拆分 sas 中的巨大数据集并将较小的数据集导出到 csv 文件
- java - Java AWT Window实现不运行paint()函数
- javascript - 如何在 PHP 中控制缓存
- vue.js - 将静态 PDF 文件添加到 nuxt js 项目
- python - 从 python 调用 C++ 代码和从 C++ 调用 python 代码
- javascript - 如何在 JS 中强制重绘以进行 CSS 过渡?