我最新最全的文章都在南瓜慢說 www.pkslow.com,文章更新也只在官網,歡迎大家來喝茶~~

1 服務網格Istio

Istio是開源的Service Mesh實現,一般用於Kubernetes叢集容器中的連線、監控和保護。它的核心特性有:

  • 流量管理

    • 通過簡單配置實現服務之間的流量;
    • 簡化服務級屬性如熔斷、超時、重試;
    • 支援A/B測試、金絲雀釋出等。
  • 安全
    • 通訊層面的安全控制;
    • 開發人員只需要專注於應用程式開發。
  • 可觀察性
    • Metrics;
    • Logging;
    • Tracing。
  • 平臺支援
    • Kubernetes;
    • 各種雲平臺。

Istio的架構分為資料平臺和控制平面,資料平面通過Sidecar代理工作,如下:

2 Kubernetes安裝istio

2.1 建立伺服器

為了避免出現映象下載慢或無法下載的問題,我們使用阿里雲香港的伺服器來做示例。為了省錢,我使用的是搶佔式例項,8CPU 16GB記憶體,大概是0.28/小時,用完即刪就可以了。

  • CPU:8核

  • 記憶體:16GB

  • 系統:Ubuntu 20.04 64位

  • 價格:0.28/時

  • 分配公網IP:是

  • 頻寬計費模式:按使用流量

  • 頻寬峰值:最大

測試登陸如下:

ssh [email protected]

$ free -h
total used free shared buff/cache available
Mem: 15Gi 153Mi 15Gi 2.0Mi 325Mi 15Gi

正常連線,可以開始使用了。

2.2 安裝Kubernetes

我這裡不打算建立一個Kubernetes叢集,所以只用了一臺機,如果有興趣的可檢視之間的文章《詳細記錄用kubeadm在Ubuntu上安裝Kubernetes叢集》。

這裡通過minikube來啟動kubernetes,我們一步一步來安裝吧:

# 必要的更新
$ apt-get update -y
$ apt-get upgrade -y # 下載kubectl命令列工具
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" # 執行許可權
$ chmod a+x kubectl
$ mv ./kubectl /usr/local/bin/kubectl # 安裝Docker
$ apt-get install -y docker.io # 檢測Docker安裝情況
$ docker --version
Docker version 20.10.7, build 20.10.7-0ubuntu1~20.04.1 # 下載minikube
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 # 執行許可權
$ chmod +x minikube
$ mv minikube /usr/local/bin # 安裝conntrack依賴
$ apt-get install -y conntrack # 啟動kubernetes,需要等待一小段時間,因為要下載映象,啟動kubernetes
$ minikube start --driver=none # 檢測啟動成功
kubectl version
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.0", GitCommit:"c2b5237ccd9c0f1d600d3072634ca66cefdf272f", GitTreeState:"clean", BuildDate:"2021-08-04T18:03:20Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.2", GitCommit:"092fbfbf53427de67cac1e9fa54aaa09a28371d7", GitTreeState:"clean", BuildDate:"2021-06-16T12:53:14Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"linux/amd64"}

我們看到對應的Pod也起來了:

2.3 安裝istio

安裝完Istio後,我們就可以開始安裝Istio了,過程如下:

# 下載安裝包:
$ curl -L https://istio.io/downloadIstio | sh - # 新增到Path
$ export PATH="$PATH:/root/istio-1.10.3/bin" # 檢測是否可以正常安裝
$ istioctl x precheck
No issues found when checking the cluster. Istio is safe to install or upgrade! # 執行安裝
$ istioctl install

安裝成功後,會出現如下介面:

檢視名稱空間,會多出一個istio-system:

3 使用istio

我們通過安裝官方的示例來看如何使用。先要給對應的命令空間加標籤,這樣istio才會識別,才會注入代理:

$ kubectl label namespace default istio-injection=enabled

接著我們安裝對應的示例程式碼:

kubectl apply -f istio-1.10.3/samples/bookinfo/platform/kube/bookinfo.yaml

可以看到所有應用都起來了,而且每個Pod是有兩個Container的:

為了更好地監控我們的應用,我們來新增一些元件或外掛:

$ kubectl apply -f istio-1.10.3/samples/addons

這樣,我們就多了許多新的元件,如Grafana、Jaeger、Kiali、Prometheus等:

我們以Kiali以例,暴露服務出來,來看看它給我們帶來了什麼:

# 新增NodePort
$ kubectl expose deployment kiali --type=NodePort --name=kiali-nodeport -n istio-system # 找到對應的埠
kubectl get service -n istio-system | grep kiali # 在其它外部訪問,注意IP為伺服器的公網IP
$ curl 47.242.151.110:31015
<a href="/kiali/">Found</a>.

開啟:http://47.242.151.110:31015/kiali ,不要用Chrome開啟,對於非https的網頁,Chrome會開啟失敗。我用Safari可以正常開啟:

我們來模擬一些請求:

kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.101.63.99 <none> 9080/TCP 77m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 132m
productpage ClusterIP 10.110.126.60 <none> 9080/TCP 77m
ratings ClusterIP 10.104.252.123 <none> 9080/TCP 77m
reviews ClusterIP 10.104.41.104 <none> 9080/TCP 77m # 迴圈傳送請求
for i in $(seq 1 100); do curl -s -o /dev/null "http://10.101.63.99:9080"; done
for i in $(seq 1 100); do curl -s -o /dev/null "http://10.110.126.60:9080"; done
for i in $(seq 1 100); do curl -s -o /dev/null "http://10.104.252.123:9080"; done
for i in $(seq 1 100); do curl -s -o /dev/null "http://10.104.41.104:9080"; done

檢視Graph,就可以看到一些請求的線,紅色是失敗的,綠色是健康正常的:

當然還有其它更多的功能,這裡就不一一講解了。

4 總結

這篇為入門體驗,以後更多細節我們再一一道來吧。