系列文章
- istio 實戰 一 Kubernetes 中快速搭建 istio
- istio 實戰 二 bookinfo 部署
- istio 實戰 三 智能路由
- istio 實戰 四 權重路由以及監控
- istio 實戰 五 網格可視化 - kiali
- istio 實戰 六 全鏈路監控 - Jaeger
簡介
部署一個樣例應用,它由四個單獨的微服務構成,用來演示多種 Istio 特性。這個應用模仿在線書店的一個分類,顯示一本書的信息。頁面上會顯示一本書的描述,書籍的細節(ISBN、頁數等),以及關於這本書的一些評論。
Bookinfo 應用分爲四個單獨的微服務:
productpage :productpage 微服務會調用 details 和 reviews 兩個微服務,用來生成頁面。
details :這個微服務包含了書籍的信息。
reviews :這個微服務包含了書籍相關的評論。它還會調用 ratings 微服務。
ratings :ratings 微服務中包含了由書籍評價組成的評級信息。
reviews 微服務有 3 個版本:
v1 版本不會調用 ratings 服務。
v2 版本會調用 ratings 服務,並使用 1 到 5 個黑色星形圖標來顯示評分信息。
v3 版本會調用 ratings 服務,並使用 1 到 5 個紅色星形圖標來顯示評分信息。
下圖展示了這個應用的端到端架構。
前提
- kubernetes 集羣 基於centos7 搭建 1.14 kubernetes 集羣
- Istio 1.2.4: istio 實戰 一 Kubernetes 中快速搭建 istio
操作步驟
在使用 kubectl apply 進行應用部署的時候,如果目標命名空間已經打上了標籤 istio-injection=enabled,Istio sidecar injector 會自動把 Envoy 容器注入到你的應用 Pod 之中。
創建命名空間
kubectl create ns bookinfo
添加label
- 添加 label:
kubectl label ns bookinfo istio-injection=enabled
- 查看 label:
kubectl describe ns bookinfo
Name: bookinfo
Labels: istio-injection=enabled
Annotations: <none>
Status: Active
No resource quota.
No resource limits.
部署 bookinfo
- 部署:
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -n bookinfo
- 獲取 pod:
kubectl get pod -n bookinfo
NAME READY STATUS RESTARTS AGE
details-v1-c5b5f496d-7c6sc 2/2 Running 0 29m
productpage-v1-c7765c886-5j2mr 2/2 Running 0 29m
ratings-v1-f745cf57b-lr5js 2/2 Running 0 29m
reviews-v1-75b979578c-xwv7r 2/2 Running 0 29m
reviews-v2-597bf96c8f-gmtc5 2/2 Running 0 29m
reviews-v3-54c6c64795-xcpz9 2/2 Running 0 29m
- 確認app是否正常:
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>"
確認集羣是否支持 負載均衡
執行以下命令以確定您的 Kubernetes 集羣是否在支持外部負載均衡器的環境中運行;
kubectl get svc istio-ingressgateway -n istio-system
如果 EXTERNAL-IP 有值(IP 地址或主機名),則說明您的環境具有可用於 Ingress 網關的外部負載均衡器。如果 EXTERNAL-IP 值是 (或一直是 ),則說明可能您的環境並沒有爲 Ingress 網關提供外部負載均衡器的功能。在這種情況下,您可以使用 Service 的 node port 方式訪問網關
由於使測試環境用的本地k8s集羣肯定不支持,本次使用nodeport 方式訪問網關,在公有云部署的可以忽略此步驟
設置 istio-ingressgateway service 爲 node port
- 修改 service type
kubectl patch service istio-ingressgateway -n istio-system -p '{"spec":{"type":"NodePort"}}'
- 查看service:
kubectl get svc istio-ingressgateway -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway NodePort 10.110.171.111 <none>
15020:32681/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30352/TCP,15030:3133
8/TCP,15031:31328/TCP,15032:30977/TCP,15443:31688/TCP 23m
部署 istio gateway
- 部署:
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml -n bookinfo
- 查看 gateway:
kubectl get gateway -n bookinfo
NAME AGE
bookinfo-gateway 46s
- 設置 INGRESS_PORT:
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o
jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
- 確認 port
echo $INGRESS_PORT
31380
- 應用缺省目標規則
kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml -n bookinfo
測試
瀏覽器訪問 http://hostip:INGRESS_PORT/productpage
刷新瀏覽器,看到星級評論發生變化,好了你已經成功部署istio 的demo。