一、開始使用Isito和Kubernetes
原文地址:Get Started with Istio and Kubernetes
參考文章:Bookinfo 應用
原文使用的是minikube搭建的測試環境,若在自己的主機上使用,可以使用:
[rancher搭建k8s環境]()
[ansible搭建k8s環境]()
在這個場景中,您將學習如何將istio服務網格部署到kubernetes。istio是一個開放平臺,它提供了連接、管理和保護微服務的統一方式。istio支持管理微服務之間的流量、訪問策略和聚合數據,所有這些都不需要更改微服務代碼。
該場景使用示例bookinfo應用程序。該應用程序不依賴於istio,並演示瞭如何在不進行修改的情況下在istio基礎上構建任何應用程序。
啓動Kubernetes集羣
首先,啓動kubernetes集羣。這將啓動一個具有一個主節點和一個節點的兩節點kubernetes集羣。(ps:無論是使用原文環境,還是自建k8s環境,首先要有一個k8s集羣,用於實踐)
launch.sh
健康檢查
一旦啓動,就可以使用kubectl cluster info獲取集羣的狀態。
kubectl cluster-info
部署istio
istio分兩部分安裝。第一部分涉及將用於部署和管理istio支持的服務的CLI工具。第二部分將kubernetes集羣配置爲支持istio。
安裝CLI工具
以下命令將安裝istio 1.0.0版本。
curl -L https://git.io/getLatestIstio | ISTIO_VERSION=1.0.0 sh -
成功運行後,將bin文件夾添加到路徑中。
export PATH="$PATH:/root/istio-1.0.0/bin"
cd /root/istio-1.0.0
或者將istio二進制文件放入執行目錄
cp /root/istio-1.0.0/bin/istioctl /usr/local/bin/
配置istio CRD
istio通過自定義資源定義(CRD)擴展了Kubernetes。通過應用crds.yaml部署擴展。
kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml -n istio-system
使用默認的交互TLS身份驗證安裝istio
要在默認情況下安裝istio並強制相互TLS身份驗證,請使用yaml istio-demo-auth.yaml:
kubectl apply -f install/kubernetes/istio-demo-auth.yaml
這將部署Pilot、Mixer、入口控制器和出口控制器,以及istio CA(證書頒發機構)。這些將在下一步中解釋。
檢查狀態
所有服務都部署爲pods。
kubectl get pods -n istio-system
等待它們全部運行或完成。一旦他們跑完,Isito就被正確部署了。
部署katacoda服務
要使示例bookinfo應用程序和儀表盤可供外部使用,特別是在katacoda上,請部署以下yaml
kubectl apply -f /root/katacoda.yaml
否則,BookInfo示例和其他儀表板將不可用。
istio架構
istio簡介
上一步部署了istio、 pilot、mixer、ingress-controller和egress-controller,以及istio ca(證書頒發機構)。
-
[x] Pilot-負責在運行時配置Proxy和Envoy 。
-
[x] Proxy / Envoy -每個微服務的SideCar代理,用於處理集羣中服務之間以及從服務到外部服務之間的進出流量。代理構成了一個安全的微服務網格,提供了一組豐富的功能,如發現、第7層路由、斷路器、策略實施和遙測記錄/報告功能。
-
[x] Mixer-在基礎設施後端創建一個可移植層。在基礎結構級別實施諸如ACL、速率限制、配額、身份驗證、請求跟蹤和遙測收集等策略。
-
[x] citadel/istio ca-通過TLS保護服務到服務的通信。提供一個密鑰管理系統來自動生成密鑰和證書、分發、旋轉和撤銷。
-
[x] 入口/出口-爲入站和出站外部流量配置基於路徑的路由。
- [x] 控制平面API-基礎編排器,如Kubernetes或Hashicorp Nomad。
部署示例應用程序
爲了展示istio,已經創建了BookInfo Web應用程序。此示例部署由四個單獨的微服務組成的簡單應用程序,這些微服務將用於演示istio服務網格的各種功能。
在部署將通過istio擴展的應用程序時,kubernetes yaml定義通過kube- inject擴展。這將配置服務代理SideCar(Envoy)、mixer、證書和init容器。
kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
部署網關
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
檢查狀態
kubectl get pods
當pods啓動時,您可能會看到在創建容器時發生的啓動步驟。這將配置Envoy sidecar,以便在istio服務網格中處理應用程序的流量管理和身份驗證。
一旦運行應用程序,就可以通過路徑/productpage訪問它。
我們先找到可以訪問的地址,這裏確定使用 Node Port 時的 ingress IP 和端口,用以下命令調出訪問地址:
#確定host地址
export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o 'jsonpath={.items[0].status.hostIP}')
#確定http端口
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
#確定https端口
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
#確定gateway地址
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
#顯示gateway地址
echo $GATEWAY_URL
#添加host值
192.168.123.134:31380
在需要訪問瀏覽器的主機上設置hosts文件,添加一條host用於訪問
# 打開hosts文件(這裏用的是windows)
C:\Windows\System32\drivers\etc\hosts
192.168.123.134 environments.katacoda.com
訪問對應的productpage地址:
environments.katacoda.com:31380/productpage
下一步將描述應用程序的體系結構。
應用默認目標規則
在使用istio控制BookInfo版本路由之前,需要在目標規則中定義可用的版本,稱爲子集。
kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml
BookInfo架構
部署的BookInfo示例應用程序由四個微服務組成:
- [x] ProductPage微服務是主頁,使用詳細信息填充,並查看微服務。
- [x] 詳細信息微服務包含圖書信息。
- [x] 點評微服務包含書評。它使用分級微服務作爲星級。
-
[x] Ratings Microservice包含書評的書評。
-
[x] 部署包括Reviews微服務的三個版本,以展示不同的行爲和路由:
- [x] 版本1不調用分級服務。
- [x] 版本2調用分級服務並將每個分級顯示爲1到5個黑星。
- [x] 版本v3調用分級服務,並將每個分級顯示爲1到5個紅星。
服務使用DNS通過HTTP進行通信以進行服務發現。架構概述如下所示。
BookInfo架構
應用程序的源代碼在GitHub上可用
控制路由
istio的主要特點之一是其交通管理。隨着微服務體系結構的擴展,對服務到服務的通信控制提出了更高的要求。
基於用戶的測試/請求路由
流量管理的一個方面是基於HTTP請求控制流量路由,例如用戶代理字符串、IP地址或cookie。
下面的示例將向reviews:v2發送用戶“jason”的所有流量,這意味着他們只能看到黑星。
cat samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
與部署kubernetes配置類似,可以使用istoctl應用路由規則。
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
訪問產品頁面並以用戶jason的身份登錄(密碼jason)
金絲雀釋放的交通塑造
分離流量以進行測試和展開更改的能力非常重要。這允許A/B變更測試或部署金絲雀版本。
下面的規則確保50%的流量用於評論:v1(無星級),或者評論:v3(紅色星級)。
cat samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
退出用戶jason,否則以上配置優先
注意:權重不是循環,多個請求可能會轉到同一個服務。
新版本
考慮到上述方法,如果Canary發佈成功,那麼我們希望將100%的流量轉移到Reviews:v3。
cat samples/bookinfo/networking/virtual-service-reviews-v3.yaml
這可以通過使用新的權重和規則更新路由來完成。
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-v3.yaml
列出所有路由
可以使用
istioctl get virtualservices and istioctl get virtualservices -o yaml
訪問度量
通過對應用程序通信方式的深入瞭解,可以深入瞭解應用程序的工作方式和性能指標。
生成負載
要查看圖表,首先需要有一些流量。執行下面的命令以嚮應用程序發送請求。
while true; do
curl -s environments.katacoda.com:31380/productpage > /dev/null
echo -n .;
sleep 0.2
done
訪問儀表板
隨着應用程序對流量的響應,圖表將開始突出顯示封面下發生的事情。
Gragana
第一個是istio Grafana儀表盤。儀表板返回當前正在處理的請求總數,以及每個調用的錯誤數和響應時間。
environments.katacoda.com:31390/dashboard/db/istio-mesh-dashboard
由於Isito正在管理整個服務到服務的通信,儀表盤將突出顯示聚合的總數和單個服務級別的細分。
Jaeger
Jaeger爲每個HTTP請求提供跟蹤信息。它顯示進行了哪些調用以及在每個請求中花費的時間。
https://2886795302-16686-elsy04.environments.katacoda.com/
單擊範圍以查看單個請求和所做HTTP調用的詳細信息。這是識別問題和潛在性能瓶頸的極好方法。
Service Graph
隨着系統的增長,很難可視化服務之間的依賴關係。服務圖將繪製系統連接方式的依賴樹。
https://2886795291-8088-elsy04.environments.katacoda.com/dotviz
在繼續之前,用ctrl+c停止流量處理
使用可視化工具weave scope
雖然服務圖顯示了系統如何連接的高級概述,但是一個名爲weave scope的工具爲整個集羣提供了一個強大的可視化和調試工具。
使用範圍,可以看到每個pod中運行的進程以及哪些pod正在相互通信。這能讓用戶理解istio及其應用程序的行爲。
部署作用域
啓用命令
kubectl create -f 'https://cloud.weave.works/launch/k8s/weavescope.yaml'
kubectl get pods -n weave
使作用域可訪問
一旦部署,就向公衆公開服務。
pod=$(kubectl get pod -n weave --selector=name=weave-scope-app -o jsonpath={.items..metadata.name})
kubectl expose pod $pod -n weave --external-ip="172.17.0.27" --port=4040 --target-port=4040
重要提示:scope是一個強大的工具,應該只向受信任的個人公開,而不是向外部公衆公開。確保配置了正確的防火牆和×××。
https://2886795291-4040-elsy04.environments.katacoda.com/
生成負載
作用域通過將活動系統調用映射到應用程序的不同部分和基礎結構來工作。創建負載以查看系統的各個部分現在如何通信。
while true; do
curl -s https://2886795291-80-elsy04.environments.katacoda.com/productpage > /dev/null
echo -n .;
sleep 0.2
done