作者:肥嘟嘟左衛門熊
前言
雖然標題是沒有的坑,但是我會把碰到的有和沒有的坑都寫一下,后人好乘涼阿!
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