istio踩坑实记

istio

作者:肥嘟嘟左卫门熊

前言

虽然标题是没有的坑,但是我会把碰到的有和没有的坑都写一下,后人好乘凉阿!

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的静态资源时会报错。

istio

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的安装是个问题,我这里提供一个思路

  1. 将镜像传到可以访问的镜像仓库
  2. 通过设定istioctl安装的hub进行安装
  3. 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
posted @ 2021-11-03 21:57  天才老王1993  阅读(928)  评论(0编辑  收藏  举报