轉載請聲明出處哦~,本篇文章發布於luozhiyun的博客:https://www.luozhiyun.com
本文使用的Istio源碼是 release 1.5。
本篇是Istio系列的第一篇,希望大家接下來能和我一起學習進步。
封面圖是Klegs的作品,顏色有一種深邃感,我很喜歡。這篇文章是Istio系列文章的開篇,主要從一個例子入手講一下Istio,並講解一些基礎概念,后面會基於這個例子來展開講解istio里面的實現原理。
Istio里面有很多有趣的內容,希望大家能一起來學習,感受Istio的魅力,當然Istio是和k8s是分不開的,所以也需要掌握了一定k8s知識能力才能進行學習,還沒有掌握的同學不妨看看我的系列文章來進行學習:深入k8s系列文章。
基本概念
先來說一下什么是Service Mesh(服務網格),一般來說Service Mesh是一種控制處理服務間通信的基礎設施層,可以在雲原生場景下幫助應用程序在復雜的服務拓撲間可靠的傳遞請求。在實際使用中,服務網格一般是通過一組輕量網絡代理來執行治理邏輯的,並且網絡代理和應用綁定在一起,但是對應用來說是無感的。
下面用一張經典的網絡示意圖來表示一下Service Mesh:
那么Istio又是什么呢?Istio就是一個Service Mesh實現的形態,用於服務治理的開放平台,並且Istio是與K8s緊密結合的適用於雲原生場景的平台。
下面我們看看Istio的架構圖:
Istio分別由數據平面(Data plane)和控制平面(Control plane)組成。
數據平面由網格內的Proxy代理和應用組成,這些代理以sidecar的形式和應用服務一起部署。每一個 sidecar會接管進入和離開服務的流量,並配合控制平面完成流量控制等方面的功能。
控制平面用於控制和管理數據平面中的sidecar代理,完成配置的分發、服務發現、和授權鑒權等功能,可以統一的對數據平面進行管理。
在上面的組件中,Proxy代理默認使用Envoy作為sidecar代理,Envoy是由Lyft內部於2016年開發的,其性能和資源占用都有着很好的表現,能夠滿足服務網格中對透明代理的輕量高性能的要求。
Pilot組件主要功能是將路由規則等配置信息轉換為sidecar可以識別的信息,並下發給數據平面,完成流量控制相關的功能。
Citadel是專門負責安全的組件,內置有身份和證書管理功能,可以實現較為強大的授權和認證等操作。
Galley主要負責配置的驗證、提取和處理等功能。
安裝 Istio
本地需要准備一台機器上面安裝有K8s,可以使用我在講k8s的時候部署的機器:1.深入k8s:k8s部署&在k8s中運行第一個程序。
因為Istio的發展太過於迅速了,我這里是使用1.5.10的版本進行舉例,大家可以去這里下載好應用包:https://github.com/istio/istio/releases/tag/1.5.10。
解壓好之后里面會包含如下文件目錄:
目錄 | 包含內容 |
---|---|
bin |
包含 istioctl 的客戶端文件 |
install |
包含 Consul、GCP 和 Kubernetes 平台的 Istio 安裝腳本和文件 |
samples |
包含示例應用程序 |
tools |
包含用於性能測試和在本地機器上進行測試的腳本 |
然后我們將istioctl客戶端路徑加入環境變量中:
[root@localhost ~]# export PATH=$PATH:$(pwd)/istio-1.5.10/bin
istio不同的版本會有不同的差異,如下表格:
default | demo | minimal | remote | |
---|---|---|---|---|
使用場景 | 生產環境 | 展示、學習 | 基本流控 | 多網格共享平面 |
核心組件 | ||||
- pilot | Y | Y | Y | |
- ingressgateway | Y | Y | ||
- engressgateway | Y |
我們這里用於學習使用,所以使用demo進行安裝:
[root@localhost ~]# istioctl manifest apply --set profile=demo
運行完命令后顯示:Installation compelte代表安裝完成。
安裝好之后會安裝一個新的namespace:istio-system
我們可以指定ns來獲取它下面的pod:
[root@localhost ~]# kubectl get pod -n istio-system
NAME READY STATUS RESTARTS AGE
grafana-764dbb499-pxs84 1/1 Running 0 17h
istio-egressgateway-775f9cd579-lsw5q 1/1 Running 0 17h
istio-ingressgateway-5d75d8897-dn8vz 1/1 Running 0 17h
istio-tracing-9dd6c4f7c-pwq22 1/1 Running 0 17h
istiod-749c4cf7f8-xgnv8 1/1 Running 0 17h
kiali-869c6894c5-l72sc 1/1 Running 0 17h
prometheus-79757ffc4-qxccg 2/2 Running 0 17h
Bookinfo 示例
Bookinfo 是 Istio 社區官方推薦的示例應用之一。它可以用來演示多種Istio的特性,並且它是一個異構的微服務應用。應用由四個單獨的微服務構成:productpage、details、reviews、ratings。
productpage
會調用details
和reviews
兩個微服務,用來生成頁面由python來編寫。details
中包含了書籍的信息由,Ruby來編寫reviews
中包含了書籍相關的評論。它還會調用ratings
微服務,由java編寫。ratings
中包含了由書籍評價組成的評級信息,由Node js編寫。
下面這個圖展示了調用關系:
如果我們的應用要接入Istio服務,那么就需要在這些應用里面都打上sidecar,使服務所有的出入流量都被sidecar所劫持,然后就可以利用istio為應用提供服務路由、遙測數據收集以及策略實施等功能。
啟動服務
要實現注入sidecar有兩種方式,一個是手動注入,一個是自動注入。
手動注入可以通過使用:istioctl kube-inject -f xxx.yaml | kubectl apply -f -
來實現。
自動注入的需要為應用部署的命令空間打上標簽 istio-injection=enabled
,如果在default空間部署應用,那么可以這么做:
[root@localhost ~]# kubectl label namespace default istio-injection=enabled
這里istio會利用k8s的webhook機制為每個創建的pod都自動注入sidecar,具體是如何做的,下一篇我們再講。
然后我們使用istio中自帶的例子部署應用:
[root@localhost ~]# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
過一段時間后確認應用都已啟動和部署成功:
[root@localhost ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
details-v1-6c9f8bcbcb-shltm 2/2 Running 0 17h
productpage-v1-7df7cb7f86-h75dd 2/2 Running 0 17h
ratings-v1-65cff55fb8-9vh2x 2/2 Running 0 17h
reviews-v1-7bccdbbf96-m2xbf 2/2 Running 0 17h
reviews-v2-7c9685df46-lljzt 2/2 Running 0 17h
reviews-v3-58fc46b64-294f4 2/2 Running 0 17h
sleep-8f795f47d-6pw96 2/2 Running 0 16h
我們可以用describe命令查看其中的pod:
[root@localhost ~]# kubectl describe pod details-v1-6c9f8bcbcb-shltm
...
Init Containers:
istio-init:
Container ID: docker://6d14ccc83bd119236bf8fda13f6799609c87891be9b2c5af7cbf7d8c913ce17e
Image: docker.io/istio/proxyv2:1.5.10
Image ID: docker-pullable://istio/proxyv2@sha256:abbe8ad6d50474814f1aa9316dafc2401fbba89175638446f01afc36b5a37919
Port: <none>
Host Port: <none>
Command:
istio-iptables
-p
15001
-z
15006
-u
1337
-m
REDIRECT
-i
*
-x
-b
*
-d
15090,15020
...
Containers:
details:
Container ID: docker://ed216429216ea1b8a1ba20960590edb7322557467c38cceff3c3e847bcff0a14
Image: docker.io/istio/examples-bookinfo-details-v1:1.15.1
Image ID: docker-pullable://istio/examples-bookinfo-details-v1@sha256:344b1c18703ab1e51aa6d698f459c95ea734f8317d779189f4638de7a00e61ae
...
istio-proxy:
Container ID: docker://a3862cc8f53198c8f86a911089e73e00f4cc4aa02eea05aaeb0bd267a8e98482
Image: docker.io/istio/proxyv2:1.5.10
Image ID: docker-pullable://istio/proxyv2@sha256:abbe8ad6d50474814f1aa9316dafc2401fbba89175638446f01afc36b5a37919
Port: 15090/TCP
Host Port: 0/TCP
Args:
...
可以看到里面有一個初始化的Init Containers,用於設置 iptables
規則。還注入了istio-proxy,這個容器是真正的 Sidecar。
為了能讓應用程序可以從外部訪問 k8s 集群,需要安裝gateway:
[root@localhost ~]# kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
檢查gateway:
[root@localhost ~]# kubectl get gateway
NAME AGE
bookinfo-gateway 17h
因為我是單機環境,未使用外部負載均衡器,需要通過 node port 訪問,然后我們查看node port:
[root@localhost ~]# kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}'
22412
我的k8snode地址是192.168.13.129,然后我們在瀏覽器輸入:
http://192.168.13.129:22412/productpage
可以訪到對應的頁面了,多刷新幾次,會發現訪問到不同的Book Reviews,因為默認使用的輪詢策略。
總結
這一篇講了一下如何安裝istio,以及如何部署應用,使用istio來完成一個實例,比較簡單和基礎,里面的很多細節我這里都一筆帶過了,但是在后面的一些內容會基於這個例子來進行講解里面的具體實現原理,所以這篇文章還是有些必要的。