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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM