Bookinfo示例簡介
Bookinfo是istio官網示例,應用程序分爲四個單獨的微服務:
productpage
。該productpage
微服務調用details
和reviews
微服務來填充頁面。details
。該details
微服務包含圖書信息。reviews
。該reviews
微服務包含了書評。它們調用ratings
微服務。ratings
。該ratings
微服務包含預定伴隨書評排名信息。
reviews
微服務有3個版本:
- 版本v1不會調用該
ratings
服務。- 版本v2調用該
ratings
服務,並將每個等級顯示爲1到5個黑星★。- 版本v3調用該
ratings
服務,並將每個等級顯示爲1到5個紅色星號★。BookInfo架構圖:
Bookinfo在Istio中架構
如果想要在Istio中運行Bookinfo,Bookinfo本身不需要任何改動,只需要爲Bookinfo的微服務注入Istio的Sidecar。最終架構圖如下:
所有的微服務都與Envoy邊車打包在一起,該Envoy邊車攔截對服務的出/入請求,並與Istio控制面交互,提供路由、採集、實施各種策略等。
啓動Bookinfo服務,參考官網
- 進入istio目錄
[root@k8s-master istio-1.4.2]# pwd
/root/istio/istio-1.4.2
- 設置namespace自動注入sidecar
kubectl label namespace default istio-injection=enabled
- 部署bookinfo服務
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
你也可以手動爲這個yaml注入sidecar再部署,參考Istio使用【sidecar注入】
kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
- 確定啓動完成
[root@k8s-master istio-1.4.2]# kubectl get pod
NAME READY STATUS RESTARTS AGE
details-v1-74f858558f-7gx6r 2/2 Running 0 31h
productpage-v1-8554d58bff-fwcj4 2/2 Running 0 31h
ratings-v1-7855f5bcb9-r7z5l 2/2 Running 0 31h
reviews-v1-59fd8b965b-jppqr 2/2 Running 0 31h
reviews-v2-d6cfdb7d6-rx648 2/2 Running 0 31h
reviews-v3-75699b5cfb-qpdjm 2/2 Running 0 31h
[root@k8s-master istio-1.4.2]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.102.10.128 <none> 9080/TCP 31h
productpage ClusterIP 10.110.251.239 <none> 9080/TCP 31h
ratings ClusterIP 10.99.146.247 <none> 9080/TCP 31h
reviews ClusterIP 10.102.77.22 <none> 9080/TCP 31h
- 確定程序運行正常
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>
- 定義應用的入口網關
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
- 確認網關已創建
[root@k8s-master istio-1.4.2]# kubectl get gateway
NAME AGE
bookinfo-gateway 30h
下面可以通過Isito的入口網關來訪問了,在訪問前,需要確定Isito網關IP和端口。
獲取Istio入口網關IP和端口:參考官網
kubectl get svc istio-ingressgateway -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.110.94.234 <pending> 15020:32344/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:31933/TCP,15030:30470/TCP,15031:31361/TCP,15032:31151/TCP,15443:31081/TCP 2d2h
如果
EXTERNAL-IP
設置了該值,則您的環境具有可用於入口網關的外部負載平衡器。如果EXTERNAL-IP
值是<none>
(或永久<pending>
),則您的環境不爲入口網關提供外部負載平衡器。在這種情況下,您可以使用服務的節點端口來訪問網關。確定端口:
這裏80對應的端口是Http服務的端口,映射的主機端口31380;
這裏443對應的端口是Https服務的端口,映射的主機端口31390;
確定IP:
可以通過下面命令找個hostIP。
[root@k8s-master istio-1.4.2]# kubectl get po -l istio=ingressgateway -n istio-system -o yaml | grep hostIP: -C3 --- state: running: startedAt: "2019-12-24T06:46:29Z" hostIP: 192.168.1.212 phase: Running podIP: 10.244.3.136 qosClass: Burstable ---
也可以通過下面的命令找到Ingress部署的節點。
[root@k8s-master istio-1.4.2]# kubectl get po -l istio=ingressgateway -n istio-system -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES istio-ingressgateway-6b7bfd7459-wljhh 1/1 Running 0 2d2h 10.244.3.136 k8s-02 <none> <none>
訪問Bookinfo應用
瀏覽器訪問剛剛或者的IP+端口+/productpage,例如我的是http://192.168.1.212:31380/productpage
不停的刷新頁面,可以看到返回的Reviewer是不同的版本。
簡單分析下
針對samples/bookinfo/networking/bookinfo-gateway.yaml,我們可以看看默認配置做了啥。
[root@k8s-master istio-1.4.2]# cat samples/bookinfo/networking/bookinfo-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
- 首先創建一個Gateway,這是Istio的一個自定義資源類型(CRD),它創建了這個bookinfo應用的網關bookinfo-gateway,使用了istio默認的controller——ingressgateway,如上文,istio的ingress網關定義了很多類型端口,這裏bookinfo-gateway使用了80端口,域名使用的通配符"*"。
- 定義VirtualService,這裏需要綁定剛剛創建的bookinfo-gateway,定義了匹配的URI和後臺服務。