服務網格Istio入門-詳細記錄Kubernetes安裝Istio並使用
我最新最全的文章都在 南瓜慢說 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 "//dl.k8s.io/release/$(curl -L -s //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 //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 //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>.
打開://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 "//10.101.63.99:9080"; done
for i in $(seq 1 100); do curl -s -o /dev/null "//10.110.126.60:9080"; done
for i in $(seq 1 100); do curl -s -o /dev/null "//10.104.252.123:9080"; done
for i in $(seq 1 100); do curl -s -o /dev/null "//10.104.41.104:9080"; done
查看Graph,就可以看到一些請求的線,紅色是失敗的,綠色是健康正常的:
當然還有其它更多的功能,這裡就不一一講解了。
4 總結
這篇為入門體驗,以後更多細節我們再一一道來吧。