istio踩坑实记
作者:肥嘟嘟左卫门熊
前言
虽然标题是没有的坑,但是我会把碰到的有和没有的坑都写一下,后人好乘凉阿!
1.状态码: 426 Upgrade Required
这是一个常见问题,作者当时很快也就查到了,但是还是记录一下
背景
Istio 使用 Envoy 作为数据面转发 HTTP 请求,而 Envoy 默认要求使用 HTTP/1.1 或 HTTP/2,当客户端使用 HTTP/1.0 时就会返回 426 Upgrade Required。
常见的 nginx 场景
如果用 nginx 进行 proxy_pass 反向代理,默认会用 HTTP/1.0,你可以显示指定 proxy_http_version 为 1.1:
upstream http_backend {
server 127.0.0.1:8080;
keepalive 16;
}
server {
...
location /http/ {
proxy_pass http://http_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
...
}
}
参考资料
Envoy won’t connect to my HTTP/1.0 service
2.状态码404: Not Found
404也是个常见问题,有很多可能,这个问题作者查了一天才解决,在这里只举出自己的例子供大家参考
背景
前端pod1静态资源访问正常,但请求通过pod1中的nginx配置转发到后端pod2后,返回404;
有问题的nginx配置
location /v1/ {
proxy_set_header Host $http_host;
proxy_pass http://ppap.test.svc.cluster.local.:8080/v1/;
}
修改后的nginx配置
location /v1/ {
proxy_set_header Host "ppap";
proxy_pass http://ppap.test.svc.cluster.local.:8080/v1/;
}
总结
作者将$http_host修改为对应service名后,问题解决了,但这个问题因人而异,只能提供一个思路
参考资料
Nginx Proxy Pass to Istio Ingress Gateway 404
3.前端js文件报错
背景
前端两个版本的deployment,由一个service代理;不通过istio网关时,访问前端页面js报错,且每次刷新错误的js不同
原因
两个版本的前端podA和podB不通过istio网关对版本进行路由时,静态资源请求会负载均衡的进入podA和podB。
但是podB中并没有podA的静态资源,podA中也没有podB的静态资源,所以当对podA访问podB的静态资源时会报错。
4. no healthy upstream
背景
upstream是Envoy中的术语,Envoy就是istio所使用的sidecar
-
Downstream/下游:下游主机连接到 Envoy,发送请求并接收响应。
-
Upstream/上游:上游主机接收来自 Envoy 的连接和请求,并返回响应。
原因
no healthy upstream的原因有很多,但是归根结底是Envoy找不到目标了~
我这里的原因是:
- 两个VirtualService都配了gateways,导致流量进来不知道去哪个svc,因此删掉一个gateways即可
例子
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: test-frontend
namespace: ppap
spec:
hosts:
- "*"
gateways:
- ppap-gateway
http:
- match:
- headers:
user_id:
exact: 952795279527
route:
- destination:
host: test-frontend
subset: v2
- route:
- destination:
host: test-frontend
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: test-backend
namespace: ppap
spec:
hosts:
- test-backend
http:
- match:
- headers:
user_id:
exact: 952795279527
route:
- destination:
host: test-backend
subset: v2
- route:
- destination:
host: test-backend
subset: v1
---
两个VirtualService区别之处就在
hosts:
- "*"
gateways:
- ppap-gateway
当两个VirtualService挂载同一个gateways便会报错
参考文献
5. 如何在隔离环境安装istio
通常现网机器不能直连外网,所以istio的安装是个问题,我这里提供一个思路
- 将镜像传到可以访问的镜像仓库
- 通过设定istioctl安装的hub进行安装
- istioctl本身通过文件直接传到对应的机器上即可
例子
istioctl install --set hub=my-hub.cn/istio --set namespace=istio-system --set components.pilot.k8s.hpaSpec.minReplicas=2 --set components.ingressGateways[0].name=istio-ingressgateway --set components.ingressGateways[0].k8s.hpaSpec.minReplicas=2 --set components.ingressGateways[0].k8s.service.type=NodePort -y