做爲處理服務通信的基礎設施層,ServiceMesh 技術經過引入輕量級網絡代理,實現了服務訪問、流量治理、可觀察性等關鍵功能,受到了社區的高度關注。Istio 是開源的 ServiceMesh 產品,提供了一個完整的知足微服務應用多種需求的解決方案。git
本文基於最新發布的 Istio1.7.3 版本,從安裝和部署出發,介紹 Istio 的安裝部署過程,並結合 Bookinfo 示例應用,方便讀者認識 Istio 的各個組件及其功能。github
準備工做
Kubernetes 集羣
在安裝以前,須要首先準備一套可用的 Kubernetes 集羣,這裏咱們使用 Istio 1.7.3 進行安裝,官方推薦的 Kubernetes 版本包括 1.16, 1.17, 1.18。編程
本文使用的是百度智能雲提供的容器引擎服務 CCE,該服務提供了對容器的生命週期管理,可以知足 Istio 的安裝部署要求。選用的 Kubernetes 版本是 1.16.8,包括兩個節點,配置爲 CentOS 7.3 x86_64 (64bit),4核12G。json
Istio 安裝文件瀏覽器
下載 Istio,下載內容包括安裝文件、示例和 istioctl 命令行工具。微信
一、這裏咱們使用 MAC 系統,能夠經過如下命令下載最新版本的 Istio:網絡
$ curl -L https://istio.io/downloadIstio | sh -
也能夠直接訪問 Istio release(https://github.com/istio/istio/releases/tag/1.7.3) 頁面下載與當前操做系統對應的安裝文件。架構
注意:當前的最新版本爲 1.7.3,若是須要下載安裝歷史版本,在命令行中指定環境變量 ISTIO_VERSION 便可,若是下載特定系統架構的安裝包,則須要設置環境變量 TARGET_ARCH。app
二、切換到 Istio 包所在目錄。這裏咱們的目錄名爲 istio-1.7.3,該安裝目錄包含以下內容:負載均衡
$ cd istio-1.7.3/
-
manifests/ 目錄:安裝 istio 相關的清單文件,包括 charts、profiles 等
-
samples/ 目錄:包含一組示例應用,覆蓋多種應用場景
-
bin/ 目錄:包含 istioctl 的客戶端文件。istioctl 命令行工具用於手動注入 Envoy sidecar 代理
-
tools/ 目錄:istio 安裝和使用過程相關的腳本
將 istioctl 客戶端路徑增長到 path 環境變量中,在 MAC 系統下執行如下命令:
$ export PATH=$PWD/bin:$PATH
Istio部署實踐
Istio 主要提供瞭如下三種安裝方式,用戶能夠根據本身的實際須要進行選擇。
一、使用 Istioctl 安裝:istioctl 是支持多種自定義選項的的命令行工具,用戶能夠靈活配置,實現 Istio 組件的定製化安裝。Istio 官方推薦使用該方式進行安裝部署,可用於生產環境。
二、使用 Helm 自定義安裝:這種安裝方式使用 Helm charts 定義 Istio 的安裝選項,目前該安裝方式已被棄用。
三、安裝獨立的 Operator:該方式使用獨立的 Istio operator 來安裝 istio,以聲明式的方式管理安裝配置,目前仍處於實驗階段,不推薦在生產環境使用。
下面咱們以 istioctl 安裝方式爲主,介紹istio的安裝步驟和組件信息。
部署 Istio
一、使用 demo 配置文件進行安裝
Istio 官方提供了針對不一樣場景的配置文件,這些內置的配置文件提供了對 Istio 控制平面和數據平面的定製內容。用戶能夠根據實際場景選擇特定的配置文件,而後結合自定義選項完成定製化安裝。當前提供如下幾種內置配置文件包括:
-
default: 根據默認的安裝選項啓用組件,建議用於生產環境的部署。
-
demo: 用於展現 Istio 的基本功能,支持運行 Bookinfo 應用程序和相關任務。
-
minimal:使用 Istio 的流量管理功能所需的最少組件。
-
remote:用於配置多集羣服務網格場景下的遠程集羣。
-
empty:不部署任何組件,可用於自定義配置的基礎文件。
-
preview:包含實驗性功能,用於探索 Istio 新功能,但沒法保證穩定性。
在選定上述配置文件以後,能夠在安裝 Istio 時在命令行添加一個或多個 --set <key>=<value> 選項,完成 Istio 安裝插件的其餘選項配置。
這裏爲了測試方便,咱們直接使用內置的 demo 配置文件進行安裝,執行如下命令便可:
$ istioctl install --set profile=demoDetected that your cluster does not support third party JWT authentication. Falling back to less secure first party JWT. See https://istio.io/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for details.✔ Istio core installed✔ Istiod installed✔ Egress gateways installed✔ Ingress gateways installed✔ Installation complete
該命令表示在 Kubernetes 集羣上按照 default 配文件的描述安裝 Istio 組件。
二、查看組件狀態
而後查看 Kubernetes 服務是否已經成功建立:
$ kubectl get svc -n istio-systemNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEistio-egressgateway ClusterIP 172.18.2.116 <none> 80/TCP,443/TCP,15443/TCP 5m35sistio-ingressgateway LoadBalancer 172.18.177.126 154.85.54.75 15021:30059/TCP,80:31088/TCP,443:31806/TCP,31400:30831/TCP,15443:32665/TCP 5m35sistiod ClusterIP 172.18.167.120 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP,853/TCP 6m1s
查看 Kubernetes pod 是否已經正常部署,且處於 Running 狀態:
$ kubectl get pod -n istio-systemNAME READY STATUS RESTARTS AGEistio-egressgateway-7bf76dd59-vtsj9 1/1 Running 0 5m46sistio-ingressgateway-586dbbc45d-2l6sz 1/1 Running 0 5m46sistiod-6cc5758d8c-mgdcb 1/1 Running 0 6m13s
三、開啓自動注入
Istio 安裝完成後,在部署應用以前,須要首先開啓 sidecar 的自動注入,這裏能夠經過爲命名空間添加標籤實現,執行如下命令便可:
$ kubectl label namespace default istio-injection=enablednamespace/default labeled
部署 Bookinfo 示例應用
在下載的 Istio 安裝文件中,包括多種示例應用,這裏咱們以 Bookinfo 爲例,介紹服務的部署使用過程。該應用由四個單獨的微服務構成:
-
productpage
:該服務會調用details
和reviews
兩個微服務,用來生成頁面。 -
details
:該服務包含了書籍的信息。 -
reviews
:該服務包含了書籍相關的評論,會調用ratings
微服務。 -
ratings
:該服務包含了由書籍評價組成的評級信息。
這些微服務使用不一樣的編程語言實現,實現了一個簡單的在線書店平臺,用於展現書籍的描述、評級等基本信息。
一、使用 kubectl 部署示例應用
進入 istio 安裝目錄 istio-1.7.3,執行下面的命令完成應用部署。
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yamlservice/details createdserviceaccount/bookinfo-details createddeployment.apps/details-v1 createdservice/ratings createdserviceaccount/bookinfo-ratings createddeployment.apps/ratings-v1 createdservice/reviews createdserviceaccount/bookinfo-reviews createddeployment.apps/reviews-v1 createddeployment.apps/reviews-v2 createddeployment.apps/reviews-v3 createdservice/productpage createdserviceaccount/bookinfo-productpage createddeployment.apps/productpage-v1 created
二、查看服務和實例是否正常建立
$ kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEdetails ClusterIP 172.18.44.247 <none> 9080/TCP 26skubernetes ClusterIP 172.18.0.1 <none> 443/TCP 35mproductpage ClusterIP 172.18.106.238 <none> 9080/TCP 26sratings ClusterIP 172.18.2.59 <none> 9080/TCP 26sreviews ClusterIP 172.18.10.251 <none> 9080/TCP 26s
$ kubectl get podNAME READY STATUS RESTARTS AGEdetails-v1-5974b67c8-cpw96 2/2 Running 0 3m31sproductpage-v1-64794f5db4-svfk2 2/2 Running 0 3m30sratings-v1-c6cdf8d98-skc4q 2/2 Running 0 3m30sreviews-v1-7f6558b974-cwsh9 2/2 Running 0 3m30sreviews-v2-6cb6ccd848-5fzgc 2/2 Running 0 3m31sreviews-v3-cc56b578-qqmn2 2/2 Running 0 3m31s
能夠看到,服務和實例都已經建立成功。
三、肯定 Ingress 的 IP 和端口
在 Bookinfo 服務正常啓動並運行以後,須要設置 Istio 網關,這樣能夠在 Kubernetes 集羣外部訪問應用。
$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yamlgateway.networking.istio.io/bookinfo-gateway createdvirtualservice.networking.istio.io/bookinfo created
這裏咱們使用的 Kubernetes 集羣支持外部負載均衡器,能夠看到已經分配到 EXTERNAL-IP:
$ kubectl get svc istio-ingressgateway -n istio-systemNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEistio-ingressgateway LoadBalancer 172.18.177.126 154.85.54.75 15021:30059/TCP,80:31088/TCP,443:31806/TCP,31400:30831/TCP,15443:32665/TCP 14m
設置 ingress IP 和端口:
$ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}') $ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}') $ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
四、應用訪問
在瀏覽器端打開地址 http://${GATEWAY_URL}/productpage,這裏咱們獲取到的地址是154.85.54.75:80,能夠看到界面以下。
查看組件面板
爲了方便對服務網格應用進行觀察和管理,Istio能夠與不一樣的遙測組件進行集成,這些組件在服務拓撲、流量分析、問題定位等方面具備很大幫助。目前Istio提供的組件類型包括:grafana、jaeger、kiali、prometheus。下面咱們以 Kiali 爲例,介紹一下組件的安裝和使用。
一、安裝組件
執行如下命令安裝 Istio 組件:
$ kubectl apply -f samples/addons
能夠查看組件部署狀態:
$ kubectl get pod -n istio-systemNAME READY STATUS RESTARTS AGEgrafana-767c5487d6-d4rdm 1/1 Running 0 9m53sistio-egressgateway-7bf76dd59-vtsj9 1/1 Running 0 37mistio-ingressgateway-586dbbc45d-2l6sz 1/1 Running 0 37mistiod-6cc5758d8c-mgdcb 1/1 Running 0 37mjaeger-566c547fb9-brgcm 1/1 Running 0 9m53skiali-89fd7f87b-7vcgx 1/1 Running 0 9m53sprometheus-788c945c9c-btvwz 2/2 Running 0 9m53s
能夠看到,grafana、jaeger、kiali 和 prometheus 組件都已經安裝完成。
二、訪問kiali組件
經過下面的命令能夠在本地訪問kiali界面:
$ istioctl dashboard kialihttp://localhost:20001/kiali
三、觀察 Kiali 面板
屢次刷新 Bookinfo 頁面,經過以下命令打開 Kiali 面板,能夠看到 Bookinfo 服務拓撲以下圖所示。
小結
本文介紹了 Istio 1.7.3 的部署過程,並經過 Bookinfo 示例應用介紹了服務網格的使用,目前官方推薦使用 istioctl 進行安裝,能夠直接使用內置的配置文件完成 Istio 的安裝,操做簡單方便,本文經過描述 Istio 安裝和使用過程,使讀者對 Istio 造成初步認識。
做者簡介:孫召昌,百度高級研發工程師,現就任於百度基礎架構部雲原生團隊,參與了服務網格、雲服務編排、分佈式事務等項目的研發工做,並在百度內部完成多個核心業務的規模化落地,對雲原生、微服務、Service Mesh、多雲等方向有深刻的研究和實踐經驗。
瞭解更多微服務、雲原生技術的相關信息,請關注咱們的微信公衆號【雲原生計算】!