天天看點

Istio使用【Bookinfo示例】

 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架構圖:
Istio使用【Bookinfo示例】

 Bookinfo在Istio中架構

如果想要在Istio中運作Bookinfo,Bookinfo本身不需要任何改動,隻需要為Bookinfo的微服務注入Istio的Sidecar。最終架構圖如下:

Istio使用【Bookinfo示例】

所有的微服務都與Envoy邊車打包在一起,該Envoy邊車攔截對服務的出/入請求,并與Istio控制面互動,提供路由、采集、實施各種政策等。

啟動Bookinfo服務,參考官網

  • 進入istio目錄
[[email protected] 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)
           
  • 确定啟動完成
[[email protected] 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
           
[[email protected] 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
           
  • 确認網關已建立
[[email protected] 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。

[[email protected] 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部署的節點。
[[email protected] 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

Istio使用【Bookinfo示例】
Istio使用【Bookinfo示例】
Istio使用【Bookinfo示例】

不停的重新整理頁面,可以看到傳回的Reviewer是不同的版本。

簡單分析下

針對samples/bookinfo/networking/bookinfo-gateway.yaml,我們可以看看預設配置做了啥。

[[email protected] 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和背景服務。

繼續閱讀