使用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/
# 下載最新kubectlcurl -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/
# 下載minikubecurl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \ && chmod +x minikube# 安裝minikubesudo 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-utilssudo adduser `id -un` libvirt # 添加當前使用者到 libvirt使用者組sudo adduser `id -un` kvm # 添加當前使用者到kvm使用者組# 如果你的作業系統版本不是Ubtuntu18.04 請自行從上方文件連結中尋找對應的作業系統安裝方式# 啟動基於kvm2驅動的minikube虛擬機器minikube config set vm-driver kvm2minikube start --memory=16384 --cpus=4 --kubernetes-version=v1.18.2 # 注意這裡的版本應該與kubectl --version的版本應該接近,否則可能不相容
至此,一個基於kvm2驅動的minikube虛擬機器搭建完成
# 在minikube中檢視記憶體使用的方式$ minikube ssh$ top
3. 安裝istio
# 下載istiocurl -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=enabledkubectl 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# 驗證已經執行著Prometheuskubectl -n istio-system get svc prometheus# 進行埠轉發使得可以從外部訪問Prometheuskubectl -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}/productpagehttp://${GATEWAY_URL}/login
# 這個介面只能透過GET請求,並且header中Referer的值要為http://${GATEWAY_URL}/productpagehttp://${GATEWAY_URL}/logout
2. Prometheus的介面
# 這是普羅米修斯的查詢面板http://localhost:9090/graph
# 這是獲取指標資料的介面http://localhost:9090/api/v1/query?query=<指標名字>&time=<時間戳的值,浮點數># 返回值是json資料