從一個例子入手Istio

74617380_p0_master1200

轉載請聲明出處哦~,本篇文章發佈於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:

image-20201024215839257

那麼Istio又是什麼呢?Istio就是一個Service Mesh實現的形態,用於服務治理的開放平臺,並且Istio是與K8s緊密結合的適用於雲原生場景的平臺。

下面我們看看Istio的架構圖:

The overall architecture of an Istio-based application.

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 會調用 detailsreviews 兩個微服務,用來生成頁面由python來編寫。
  • details 中包含了書籍的信息由,Ruby來編寫
  • reviews 中包含了書籍相關的評論。它還會調用 ratings 微服務,由java編寫。
  • ratings 中包含了由書籍評價組成的評級信息,由Node js編寫。

下面這個圖展示了調用關係:

image-20201025163623769

如果我們的應用要接入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來完成一個實例,比較簡單和基礎,裏面的很多細節我這裏都一筆帶過了,但是在後面的一些內容會基於這個例子來進行講解裏面的具體實現原理,所以這篇文章還是有些必要的。

Reference

What's a service mesh?

What is Istio?

https://istio.io/latest/docs/examples/bookinfo/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章