K8s集羣版本:1.16.8
通過Istio的官網查找對應支持的版本:1.7.3
- 首先下載Istio
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.7.3 TARGET_ARCH=x86_64 sh -
該命令會自動下載istio-1.7.3的tar文件,並解壓
2. 設置環境變量
export PATH=/root/istio/istio-1.7.3/bin:$PATH
3. 通過Istio客戶端安裝Istio
istioctl install --set profile=demo -y
安裝完成後,可以查看對應的Pod等K8s資源
4. 設置sidecar自動注入的標籤
kubectl label namespace default istio-injection=enabled
上面的意思是:給default的命名空間打上自動注入啓用的label
5. 部署Bookinfo應用
#下載Bookinfo的yaml文件
curl -O https://raw.githubusercontent.com/istio/istio/1.7.3/samples/bookinfo/platform/kube/bookinfo.yaml
#運行
kubectl apply -f bookinfo.yaml
Bookinfo是Istio官網的demo項目,模擬的是一個在線書店的網站,包含一個產品頁面,涉及4個微服務,其中的調用關係如下所示:
通過Istio自動注入sidecar接管流量之後變成如下所示:
所有的微服務都和 Envoy sidecar 集成在一起,被集成服務所有的出入流量都被 sidecar 所劫持,這樣就爲外部控制準備了所需的 Hook,然後就可以利用 Istio 控制平面下發對應的 XDS 協議從而使 Envoy Sidecar 爲應用提供服務路由、遙測數據收集以及策略實施等功能。
6. 模擬請求,執行如下命令
kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"
7. 如果想在集羣外訪問該網站服務,還需要通過Istio的gateway功能來設置外網訪問
#下載yaml文件
curl -O https://raw.githubusercontent.com/istio/istio/1.7.3/samples/bookinfo/networking/bookinfo-gateway.yaml
#運行
kubectl apply -f bookinfo-gateway.yaml
由於本地測試環境未使用外部負載均衡器,這裏用NodePort來實現局域網訪問
需要設置INGRESS_HOST
和 INGRESS_PORT變量,執行如下命令
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
export INGRESS_HOST=cos1
其實對應的就是istio-system的istio-ingressgateway服務
所以,局域網內部,只要在瀏覽器中訪問:http://INGRESS_HOST:INGRESS_PORT/productpage
這裏也就是http://cos1:31185/productpage或者https://cos1:30173/productpage