導語 本次采用的是 Kubernetes v1.15.0 版集群環境,Helm 版本為 v2.14.3,安裝的 Istio 版本為 v1.4,官方文檔說明中指出只在 K8S 的 v1.13、v1.14、v1.15 做過測試,請暫時不要將 K8S 升級至 v1.16 版
Ps:Kubernetes安裝指引,請查看文檔==>傳送門
一、部署helm
- 安裝helm客戶端
從github下載helm(https://github.com/helm/helm/releases)
wget https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz
解包,只需要包中的一個命令
tar zxf helm-v2.14.3-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/ &&
chmod +x /usr/local/bin/helm
設置命令自動補全
echo 'source <(helm completion bash)' >> /etc/profile
. /etc/profile
#重載環境變量
- 安裝Tiller server(需要創建授權用戶)
tiller-rbac.yaml #創建授權用戶
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
kubectl apply -f tiller-rbac.yaml
#執行yaml文件
helm init --service-account=tiller
#Tiller server的環境初始化
helm init -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3 --stable-repo-url http://mirror.azure.cn/kubernetes/charts/ --service-account tiller --override spec.selector.matchLabels.'name'='tiller',spec.selector.matchLabels.'app'='helm' --output yaml | sed 's@apiVersion: extensions/v1beta1@apiVersion: apps/v1@' | kubectl apply -f -
檢查安裝
kubectl get pods -n kube-system | grep tiller
helm version
二、安裝Istio
- 添加 Istio 到 Helm 倉庫
helm repo add istio.io https://storage.googleapis.com/istio-release/releases/1.4.0/charts/
- 下載Istio
wget https://github.com/istio/istio/releases/download/1.4.0/istio-1.4.0-linux.tar.gz
tar -zxvf istio-1.4.0-linux.tar.gz
mv istio-1.4.0 istio
cd istio
- 創建命名空間
kubectl create namespace istio-system
- 安裝 CRDs (Custom Resource Definitions)
helm template install/kubernetes/helm/istio-ini t --name istio-init --namespace istio-system | kubectl apply -f -
等待 CRDs 創建完成
kubectl -n istio-system wait --for=condition=complete job --all
輸出如下
job.batch/istio-init-crd-10-1.4.0 condition met
job.batch/istio-init-crd-11-1.4.0 condition met
job.batch/istio-init-crd-14-1.4.0 condition met
- 部署 Istio 到集群
helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl apply -f -
kubectl get pods -n istio-system
- 為default添加istio注入(可選)
kubectl label namespace default istio-injection=enable
三、部署測試應用bookinfo
bookinfo示例部署了一個用於演示多種 Istio 特性的應用,該應用由四個單獨的微服務構成。 這個應用模仿在線書店的一個分類,顯示一本書的信息。 頁面上會顯示一本書的描述,書籍的細節(ISBN、頁數等),以及關於這本書的一些評論。
- bookinfo應用的架構
-
Bookinfo 應用分為四個單獨的微服務
- productpage. 這個微服務會調用 details 和 reviews 兩個微服務,用來生成頁面
- details. 這個微服務中包含了書籍的詳細信息。
- reviews. 這個微服務中包含了書籍相關的評論。它還會調用 ratings 微服務
- ratings. 這個微服務中包含了由書籍評價組成的評級信息。
-
reviews微服務有三個版本
- v1 版本不會調用 ratings 服務。
- v2 版本會調用 ratings 服務,並使用 1 到 5 個黑色星形圖標來顯示評分信息。
- v3 版本會調用 ratings 服務,並使用 1 到 5 個紅色星形圖標來顯示評分信息。
-
bookinfo的編排文件bookinfo.yaml(目錄samples/bookinfo/platform/kube)
-
創建命名空間用以部署
kubectl create ns bookinfo-application
-
為這個命名空間大上 istio-injection=enabled 標簽
kubectl label namespace bookinfo-application istio-injection=enabled
-
部署 bookinfo application
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -n bookinfo-application
-
暴露服務入口
如果沒有外部負載均衡可以將名為 istio-ingressgateway 的 service 類型由LoadBalancer修改為 NodePort 類型,隨后通過 istio-ingressgateway 所在的服務器IP地址+端口的形式訪問服務。
istio 的 Gateway 允許外部流量進入 Istio 服務網,與 K8S 的 ingress 直接指定路由不同,istio 的路由規則不在 gateway 中指定,需要通過 VirtualService 單獨配置。執行下面命令創建 gateway 和 virtualservice。kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml -n bookinfo-application
-
訪問頁面並不斷刷新
可以在瀏覽器打開 http://NodeIp:NodePort/productpage以瀏覽 Bookinfo Application 頁面,如果刷新幾次應用的頁面,就會看到 productpage 頁面中會隨機展示 reviews 服務的不同版本的效果(紅色、黑色的星形或者沒有顯示)。reviews 服務出現這種情況是因為我們還沒有使用 Istio 來控制版本的路由。
http://192.168.68.150:31380/productpage
- 最終應用部署的示意圖
要在 Istio 中運行這一應用,無需對應用自身做出任何改變。 您只要簡單的在 Istio 環境中對服務進行配置和運行,具體一點說就是把 Envoy sidecar 注入到每個服務之中。 最終的部署結果將如下圖所示(注意前面步驟中對bookinfo-application命名空間打了標簽)
所有的微服務都和 Envoy sidecar 集成在一起,被集成服務所有的出入流量都被 sidecar 所劫持,這樣就為外部控制准備了所需的 Hook,然后就可以利用 Istio 控制平面為應用提供服務路由、遙測數據收集以及策略實施等功能。
-