问题描述
将纯Kubernetes应用迁移到Istio托管时遇到问题。我正在使用Google Cloud Platform(GCP),Istio 1.4,Google Kubernetes Engine(GKE),Spring Boot和JAVA 11。
我让容器在纯GKE环境中运行没有问题。现在,我开始迁移Kubernetes集群以使用Istio。从那时起,当我尝试访问公开的服务时,我会收到以下消息。
上游连接错误或在标头之前断开连接/重置。重置原因:连接失败
此错误消息看起来很普通。我发现了很多不同的问题,并带有相同的错误消息,但是没有人与我的问题有关。
使用Istio版本:
client version: 1.4.10
control plane version: 1.4.10-gke.5
data plane version: 1.4.10-gke.5 (2 proxies)
以下是我的yaml文件:
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
account: tree-guest
name: tree-guest-service-account
---
apiVersion: v1
kind: Service
metadata:
labels:
app: tree-guest
service: tree-guest
name: tree-guest
spec:
ports:
- name: http
port: 8080
targetPort: 8080
selector:
app: tree-guest
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: tree-guest
version: v1
name: tree-guest-v1
spec:
replicas: 1
selector:
matchLabels:
app: tree-guest
version: v1
template:
metadata:
labels:
app: tree-guestaz
version: v1
spec:
containers:
- image: registry.hub.docker.com/victorsens/tree-quest:circle_ci_build_00923285-3c44-4955-8de1-ed578e23c5cf
imagePullPolicy: IfNotPresent
name: tree-guest
ports:
- containerPort: 8080
serviceAccount: tree-guest-service-account
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: tree-guest-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: tree-guest-virtual-service
spec:
hosts:
- "*"
gateways:
- tree-guest-gateway
http:
- match:
- uri:
prefix: /v1
route:
- destination:
host: tree-guest
port:
number: 8080
要应用yaml文件,我使用了以下参数:
kubectl apply -f <(istioctl kube-inject -f ./tree-guest.yaml)
在部署应用程序之后,在Istio代理参数的结果下面:
istio-ingressgateway-6674cc989b-vwzqg.istio-system SYNCED SYNCED SYNCED SYNCED
istio-pilot-ff4489db8-2hx5f 1.4.10-gke.5 tree-guest-v1-774bf84ddd-jkhsh.default SYNCED SYNCED SYNCED SYNCED istio-pilot-ff4489db8-2hx5f 1.4.10-gke.5
如果有人对出了什么问题有个建议,请告诉我。我在这个问题上停留了几天。
谢谢。
解决方法
正如@Victor所提到的,这里的问题是错误的yaml文件。
我解决了。就我而言,yaml文件是错误的。我检查了一下,现在问题解决了。谢谢大家,– Victor
如果您正在寻找Yaml样品,我建议您看看istio github samples。
由于503 upstream connect error or disconnect/reset before headers. reset reason: connection failure
经常出现,我很少设置故障排除答案,还有几个月来我遇到的另一个503错误问题,答案是istio文档中的有用信息以及我将要检查的内容。
示例出现503错误:
- Istio 503:s between (Public) Gateway and Service
- IstIO egress gateway gives HTTP 503 error
- Istio Ingress Gateway with TLS termination returning 503 service unavailable
- how to terminate ssl at ingress-gateway in istio?
- Accessing service using istio ingress gives 503 error when mTLS is enabled
istio文档中的503错误的常见原因:
- https://istio.io/docs/ops/best-practices/traffic-management/#avoid-503-errors-while-reconfiguring-service-routes
- https://istio.io/docs/ops/common-problems/network-issues/#503-errors-after-setting-destination-rule
- https://istio.io/latest/docs/concepts/traffic-management/#working-with-your-applications
我首先要检查的几件事:
- 检查服务端口名称,如果Istio知道协议,则可以正确路由流量。如istio
documentation中所述,它应该是
<protocol>[-<suffix>]
。 - 检查mTLS,如果存在任何由mTLS引起的问题,通常这些问题将导致错误503。
- 检查istio是否有效,我建议应用bookinfo application示例,并检查其是否按预期工作。
- 使用
kubectl get namespace -L istio-injection
检查您的命名空间是否为injected - 如果使用子集的VirtualService在定义子集的DestinationRule之前到达,则由Pilot生成的Envoy配置将引用不存在的上游池。这会导致HTTP 503错误,直到所有配置对象都可供飞行员使用为止。