一、概述
這個示例部署了一個用於演示多種 Istio 特性的應用,該應用由四個單獨的微服務構成。 這個應用模仿在線書店的一個分類,顯示一本書的信息。 頁面上會顯示一本書的描述,書籍的細節(ISBN、頁數等),以及關於這本書的一些評論。
Bookinfo 應用分為四個單獨的微服務:
productpage
. 這個微服務會調用details
和reviews
兩個微服務,用來生成頁面。details
. 這個微服務中包含了書籍的信息。reviews
. 這個微服務中包含了書籍相關的評論。它還會調用ratings
微服務。ratings
. 這個微服務中包含了由書籍評價組成的評級信息。
reviews
微服務有 3 個版本:
- v1 版本不會調用
ratings
服務。 - v2 版本會調用
ratings
服務,並使用 1 到 5 個黑色星形圖標來顯示評分信息。 - v3 版本會調用
ratings
服務,並使用 1 到 5 個紅色星形圖標來顯示評分信息。
下圖展示了這個應用的端到端架構。
Bookinfo 應用中的幾個微服務是由不同的語言編寫的。 這些服務對 Istio 並無依賴,但是構成了一個有代表性的服務網格的例子:它由多個服務、多個語言構成,並且 reviews
服務具有多個版本。
二、部署應用
環境說明
操作系統:centos 7.6
主機名:k8s-master
ip地址:192.168.31.236
配置:2核2g
操作系統:centos 7.6
主機名:k8s-node01
ip地址:192.168.31.16
配置:2核4g
關於Istio 的安裝,請參考鏈接:
https://www.cnblogs.com/xiao987334176/p/14236554.html
架構圖
要在 Istio 中運行這一應用,無需對應用自身做出任何改變。 您只要簡單的在 Istio 環境中對服務進行配置和運行,具體一點說就是把 Envoy sidecar 注入到每個服務之中。 最終的部署結果將如下圖所示:
所有的微服務都和 Envoy sidecar 集成在一起,被集成服務所有的出入流量都被 sidecar 所劫持,這樣就為外部控制准備了所需的 Hook,然后就可以利用 Istio 控制平面為應用提供服務路由、遙測數據收集以及策略實施等功能。
啟動應用服務
注意,按照官方文檔,在2步中,啟動了自動注入 Sidecar。這一步千萬不要執行。
為什么呢?因為在后續步驟中,執行kubectl apply -f bookinfo.yaml之后,再次查看pod,使用命令:kubectl get pods
你會發現,一個pod都沒有運行,是不是很絕望啊,這pod到底跑哪里去了呢???
1. 正確的做法是,使用手動注入Sidecar
kubectl apply -f <(istioctl kube-inject -f /usr/local/istio-1.8.1/samples/bookinfo/platform/kube/bookinfo.yaml)
2. 查看svc
[root@k8s-master ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 10.1.1.81 <none> 9080/TCP 18m kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 28m productpage ClusterIP 10.1.114.106 <none> 9080/TCP 18m ratings ClusterIP 10.1.231.95 <none> 9080/TCP 18m reviews ClusterIP 10.1.198.180 <none> 9080/TCP 18m
3. 查看pod
[root@k8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE details-v1-7c954bd65b-6wx2t 2/2 Running 0 18m productpage-v1-6c47684d7-sxhkw 2/2 Running 0 18m ratings-v1-7545898bd4-pjmm4 2/2 Running 0 18m reviews-v1-5b676dc848-7tcjv 2/2 Running 0 18m reviews-v2-5797d46b9-q4vrq 2/2 Running 0 18m reviews-v3-86d796848b-gkbdt 2/2 Running 0 18m
注意:耐心等待幾分鍾,狀態就會轉換為Running
4. 要確認 Bookinfo 應用是否正在運行,請在某個 Pod 中用 curl
命令對應用發送請求,例如 ratings
:
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>"
輸出:
<title>Simple Bookstore App</title>
確定 Ingress 的 IP 和端口
現在 Bookinfo 服務啟動並運行中,您需要使應用程序可以從外部訪問 Kubernetes 集群,例如使用瀏覽器。可以用 Istio Gateway 來實現這個目標。
1. 為應用程序定義 Ingress 網關:
kubectl apply -f /usr/local/istio-1.8.1/samples/bookinfo/networking/bookinfo-gateway.yaml
2. 確認網關創建完成
[root@k8s-master ~]# kubectl get gateway
NAME AGE
bookinfo-gateway 61s
3. 根據文檔設置訪問網關的 INGRESS_HOST
和 INGRESS_PORT
變量。確認並設置。
在Istio 的安裝文檔中,我已經通過NodePort 方式來暴露istio-ingressgateway 服務,現在根據如下命令來獲取 ingress ports:
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}')
獲取 ingress IP 地址:
export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o 'jsonpath={.items[0].status.hostIP}')
設置 GATEWAY_URL:
[root@k8s-master ~]# export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT [root@k8s-master ~]# echo $GATEWAY_URL 192.168.31.16:32223
確認可以從集群外部訪問應用
可以用 curl
命令來確認是否能夠從集群外部訪問 Bookinfo 應用程序:
curl -s http://${GATEWAY_URL}/productpage | grep -o "<title>.*</title>"
輸出:
<title>Simple Bookstore App</title>
還可以用瀏覽器打開網址 http://$GATEWAY_URL/productpage
,來瀏覽應用的 Web 頁面。如果刷新幾次應用的頁面,就會看到 productpage
頁面中會隨機展示 reviews
服務的不同版本的效果(紅色、黑色的星形或者沒有顯示)。reviews
服務出現這種情況是因為我們還沒有使用 Istio 來控制版本的路由。
訪問url
http://192.168.31.16:32223/productpage
效果如下:
如果刷新幾次應用的頁面,就會看到頁面中會隨機展示 reviews 服務的不同版本的效果(紅色、黑色的星形或者沒有顯示)。reviews 服務出現這種情況是因為我們還沒有使用 Istio 來控制版本的路由。
理解原理
應用默認目標規則
在使用 Istio 控制 Bookinfo 版本路由之前,您需要在目標規則中定義好可用的版本,命名為 subsets 。
運行以下命令為 Bookinfo 服務創建的默認的目標規則:
如果沒有啟用雙向 TLS,請執行以下命令:
kubectl apply -f /usr/local/istio-1.8.1/samples/bookinfo/networking/destination-rule-all.yaml
等待幾秒鍾,以使目標規則生效。
您可以使用以下命令查看目標規則:
kubectl get destinationrules -o yaml
本文參考鏈接:
https://istio.io/latest/zh/docs/examples/bookinfo/
https://www.cnblogs.com/rickie/p/istio_kubernetes.html