1. 程式人生 > 其它 >istio bookinfo微服務搭建流程

istio bookinfo微服務搭建流程

技術標籤:AnomalyDetectionkuberneteslinux運維dockeristio

使用istio的Demo——bookinfo可以很方便的進行配置變更和故障注入,在這篇部落格編寫之時,部落格內貼附的文件皆是有效的,但是文件會有更新和廢棄,請按照文章思路自行尋找對應的最新文件。
部分文件可能需要訪問Google資源,請提前準備。

1. 安裝kubectl和minikube

安裝kubectl可參考:https://kubernetes.io/docs/tasks/tools/install-kubectl/
安裝minikube可參考:https://v1-18.docs.kubernetes.io/docs/tasks/tools/install-minikube/

# 下載最新kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
# 安裝
sudo install kubectl /usr/bin/ 
# 下載minikube
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \
  && chmod +x minikube
# 安裝minikube
sudo install minikube /usr/bin/minikube

2. 搭建istio所需平臺

搭建istio可使用多種平臺,這裡我使用的是minikube。建立minikube虛擬機器參考文件:https://istio.io/latest/zh/docs/setup/platform-setup/minikube/。
安裝minikube kvm2驅動參考文件:https://minikube.sigs.k8s.io/docs/drivers/kvm2/,https://minikube.sigs.k8s.io/docs/start/#install-a-hypervisor,https://help.ubuntu.com/community/KVM/Installation。

# 在ubuntu18.04中建立基於kvm2的minikube虛擬機器
sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
sudo adduser `id -un` libvirt  # 添加當前使用者到 libvirt使用者組
sudo adduser `id -un` kvm  # 添加當前使用者到kvm使用者組
# 如果你的作業系統版本不是Ubtuntu18.04 請自行從上方文件連結中尋找對應的作業系統安裝方式

# 啟動基於kvm2驅動的minikube虛擬機器
minikube config set vm-driver kvm2
minikube start --memory=16384 --cpus=4 --kubernetes-version=v1.18.2 
 # 注意這裡的版本應該與kubectl --version的版本應該接近,否則可能不相容

至此,一個基於kvm2驅動的minikube虛擬機器搭建完成

# 在minikube中檢視記憶體使用的方式
$ minikube ssh
$ top

3. 安裝istio

# 下載istio
curl -L https://istio.io/downloadIstio | sh -
# 進入根目錄,文章編寫之時是istio-1.8.2的版本
cd istio-1.8.2
# 該資料夾下有istioctl等一些工具,因此需要配置環境變數
export PATH=$PWD/bin:$PATH  # 也可以在~/.bashrc中配置
# 使用官方提供的Demo配置檔案安裝istio即可(滿足大部分的需求)
istioctl manifest install --set profile=demo
# 至此,istio安裝完成,下面是監測是否正確安裝的流程
kubectl get svc -n istio-system # 檢視所有的服務
kubectl get pods -n istio-system # 檢視所有的Pod

4. 安裝Demo : bookinfo

這個示例官方給了比較多的文件說明,說明了如何配置變更和故障注入:https://istio.io/latest/zh/docs/examples/bookinfo/

# 進入istio根目錄(即上面所說的istio-1.8.2)
# 為default名稱空間打上標籤:istio-injection=enabled
kubectl label namespace default istio-injection=enabled
# 使用kubectl 部署應用
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
# 檢查服務是否正常啟動:
kubectl get services
# 檢查Pods是否正常啟動:
kubectl get Pods # bookinfo服務啟動的比較慢,建議等久一點
# Service和Pods都啟動完畢後通過下面指令檢查服務是否正常執行:
$ 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>

5. 確定Ingress的IP和埠

這一步的目的是使得可以從叢集外部訪問叢集的服務

# 為程式定義Ingress閘道器:
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
# 確認閘道器建立完成
kubectl get gateway

在這裡插入圖片描述

# 接著設定 INGRESS_HOST 和 INGRESS_PORT 變數
# 參考文件:https://istio.io/latest/zh/docs/tasks/traffic-management/ingress/ingress-control/#determining-the-ingress-i-p-and-ports
# 按照上面的流程,我們沒有使用外部的負載均衡,因此操作如下:
# 設定INGRESS_PORT 環境變數
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
# 設定SECURE_INGRESS_PORT 環境變數(暫時沒用)
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
# 設定INGRESS_HOST 環境變數
export INGRESS_HOST=$(minikube ip)

設定gateway URL

export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

確認可以從外部進行訪問:

curl -s http://${GATEWAY_URL}/productpage | grep -o "<title>.*</title>"
# 輸出應該為:<title>Simple Bookstore App</title>

6. 配置Prometheus:

參考文件:https://istio.io/latest/docs/ops/integrations/prometheus/, https://istio.io/latest/zh/docs/tasks/observability/metrics/querying-metrics/

# 安裝Prometheus(進入istio根目錄)
kubectl apply -f samples/addons/prometheus.yaml

# 驗證已經執行著Prometheus
kubectl -n istio-system get svc prometheus

# 進行埠轉發使得可以從外部訪問Prometheus
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 9090:9090 &

# 在瀏覽器中訪問http://localhost:9090/graph 即可開啟Prometheus面板

7.相關使用和總結:

1. bookinfo的介面

${GATEWAY_URL}的值可以從上面第5步獲取,請自行獲取並替換!

# 這個介面可以直接發get請求,是bookinfo的前端
http://${GATEWAY_URL}/productpage
# 這個介面只能通過POST請求,並且header中Referer的值要為http://${GATEWAY_URL}/productpage
http://${GATEWAY_URL}/login
# 這個介面只能通過GET請求,並且header中Referer的值要為http://${GATEWAY_URL}/productpage
http://${GATEWAY_URL}/logout

2. Prometheus的介面

# 這是普羅米修斯的查詢面板
http://localhost:9090/graph
# 這是獲取指標資料的介面
http://localhost:9090/api/v1/query?query=<指標名字>&time=<時間戳的值,浮點數>
# 返回值是json資料