Istio 部署Bookinfo 應用


一、概述

這個示例部署了一個用於演示多種 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 來控制版本的路由。

 

 

理解原理

Gateway 配置資源允許外部流量進入 Istio 服務網格,並使 Istio 的流量管理和策略功能可用於邊緣服務。
在前面的步驟中,我們在 Istio 服務網格中創建了一個服務,並展示了如何將服務的 HTTP 端點暴露給外部流量。
 
 

應用默認目標規則

在使用 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

 


免責聲明!

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



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