微服務(wù)火了好幾年,但因?yàn)闆]有統(tǒng)一標(biāo)準(zhǔn),涉及的技術(shù)范圍廣泛,更新迭代太快,學(xué)習(xí)曲線較陡,要完整,系統(tǒng)的掌握并非易事。不過技術(shù)終究是要為業(yè)務(wù)服務(wù),無論用什么技術(shù),只要能快速開發(fā),易于部署,簡化運(yùn)維和更新,能快速響應(yīng)業(yè)務(wù)的需求和變化,就是好技術(shù)。微服務(wù)之所以受歡迎,就是一旦掌握了,就可以達(dá)到以上目的。就好比開飛機(jī),會(huì)開飛機(jī),當(dāng)然很快,但要學(xué)會(huì),得下些功夫。還好,在開源社區(qū)和云技術(shù)發(fā)展得如火如荼的今天,我們不用從零開始造飛機(jī),只要選用主流的技術(shù)和平臺,就站在了一群牛人的肩膀上,學(xué)會(huì)了就可以穩(wěn)定飛上好幾年。
開源當(dāng)中,Istio無疑是Service Mesh架構(gòu)微服務(wù)最活躍的社區(qū),它基本是技術(shù)和平臺中立的,支持各種混合部署的模式,解決了很多微服務(wù)中遇到的共性問題,如對連接,安全和監(jiān)控的管理等等,使得我們開發(fā)只需集中精力實(shí)現(xiàn)業(yè)務(wù)需求就好,絕大多數(shù)共性問題可以在部署時(shí)通過配置解決?,F(xiàn)在(2020.2.10)穩(wěn)定的版本也到了1.4.3。
這篇文章就先探討一下 Istio 在Azure上基于AKS的安裝,我們可以幾分鐘內(nèi)把Istio的平臺運(yùn)行起來,當(dāng)然,這不是AKS的初級介紹,希望讀者對AKS有基本的了解。
我們先簡要介紹一下Istio的主要組件,組件架構(gòu)如下圖:
01
Proxy 基于Envoy的side car, 用C++開發(fā)的高性能的服務(wù)代理,可以自動(dòng)或手動(dòng)注入到服務(wù)的pod中,實(shí)現(xiàn)服務(wù)的共性需求,如健康檢查,融斷,負(fù)載均衡,指標(biāo)采集,加密/安全等。
02
Mixer 關(guān)鍵主控組件,主要負(fù)責(zé)服務(wù)策略下發(fā),從Proxy和其他服務(wù)收集指標(biāo)數(shù)據(jù)等。同時(shí)支持通過插件增加功能。
03
Pilot 負(fù)責(zé)服務(wù)(Side Car)發(fā)現(xiàn),服務(wù)的流量管理/智能路由,以及服務(wù)可靠性保障等。
04
Citadel 主要負(fù)責(zé)身份和證書的管理,保障使得服務(wù)間以及與客戶端間的通信安全。
05
Galley 負(fù)責(zé)配置的驗(yàn)證,導(dǎo)入,處理和分發(fā),它為其他Istio組件屏蔽了底層平臺(如Kubernetes)的差異。
參考:
https://istio.io/docs/ops/deployment/architecture/
Istio的組件都會(huì)以pod的形式部署在k8s或AKS上,所以建議用獨(dú)立的namesapce istio-system來管理,當(dāng)然也會(huì)占用一定的資源。為減少與業(yè)務(wù)應(yīng)用的相互影響和保證高可用,能在生產(chǎn)環(huán)境用獨(dú)立的node pool來部署這些組件就更好。
01
創(chuàng)建AKS集群
可以參考以下命令,需要注意的是, Istio安裝時(shí)默認(rèn)Pilot Pod需要比較大的內(nèi)存(2G * 2 pods),建議不要選4G或以下的虛機(jī)。
#全局變量 按需要修改
RGName=aksISTIO #資源組名稱
REGION=southeastasia #部署區(qū)域
AKSNAME=aksISTIO #AKS 集群名稱
NODESIZE=Standard_B2ms #使用虛機(jī)大小
#創(chuàng)建資源組
az group create --name $RGName --location $REGION
#創(chuàng)建AKS集群,vm-set-type 和 load-balancer-sku 兩參數(shù)保證支持多node pool,不需要也可以去掉
az aks create --resource-group $RGName --name $AKSNAME \
--node-count 2 --enable-addons monitoring --generate-ssh-keys \
--admin-username myadmin --node-vm-size $NODESIZE \
--vm-set-type VirtualMachineScaleSets \
--load-balancer-sku standard
#安裝完成后運(yùn)行以下命令確認(rèn)運(yùn)行正常
#安裝az aks命令支持
az aks install-cli
#獲取AKS集群隱式登錄
az aks get-credentials --resource-group $RGName --name $AKSNAME
#查看節(jié)點(diǎn)信息
kubectl get nodes
#因?yàn)?/span>AKS安裝Istio需要啟用(默認(rèn))RBAC, 想用k8s web console,需授權(quán)給服務(wù)帳號
kubectl create clusterrolebinding kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard
#通過tunnel本地IP來瀏覽 k8s web console
az aks browse -n $AKSNAME -g $RGName
02
安裝Istio
#下載Istio安裝介質(zhì)
# Specify the Istio version that will be leveraged throughout these instructions
ISTIO_VERSION=1.4.3
curl -sL"https://github.com/istio/istio/releases/download/$ISTIO_VERSION/istio-$ISTIO_VERSION-linux.tar.gz" | tar xz
cd istio-$ISTIO_VERSION
sudo cp ./bin/istioctl /usr/local/bin/istioctl
sudo chmod +x /usr/local/bin/istioctl
# Generate the bash completion file and source it in your current shell
mkdir -p ~/completions && istioctl collateral --bash -o ~/completions
source ~/completions/istioctl.bash
# Source the bash completion file in your .bashrc so that the command-line completions
# are permanently available in your shell
echo "source ~/completions/istioctl.bash" >> ~/.bashrc
#創(chuàng)建istio namespace
kubectl create namespace istio-system --save-config
#管理員密碼
MYPASSWORD=xxxxxxxxx
#在k8s創(chuàng)建Grafana的管理用戶
GRAFANA_USERNAME=$(echo -n "grafana" | base64)
GRAFANA_PASSPHRASE=$(echo -n ${MYPASSWORD} | base64)
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: grafana
namespace: istio-system
labels:
app: grafana
type: Opaque
data:
username: $GRAFANA_USERNAME
passphrase: $GRAFANA_PASSPHRASE
EOF
#在k8s創(chuàng)建Kiali的管理用戶
KIALI_USERNAME=$(echo -n "kiali" | base64)
KIALI_PASSPHRASE=$(echo -n ${MYPASSWORD} | base64)
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: kiali
namespace: istio-system
labels:
app: kiali
type: Opaque
data:
username: $KIALI_USERNAME
passphrase: $KIALI_PASSPHRASE
EOF
通過yaml來安裝istio
Istio自帶安裝腳本,里面有幾個(gè)安裝模版,每個(gè)模版含不同的組件,見下圖:
如果想安裝demo的模版,可以通過下面命令:
istioctl manifest apply --set profile=demo
也可以創(chuàng)建istio安裝yaml文件,來自定義安裝組件,見:https://github.com/radezheng/blog/blob/master/Istio/istio.aks.yaml
安裝命令如下,在安裝介質(zhì)目錄外面運(yùn)行:
istioctl manifest apply -f istio.aks.yaml --logtostderr --set installPackagePath=./istio-1.4.3/install/kubernetes/operator/charts
安裝完成如下圖: 確認(rèn)安裝成功
#確認(rèn)安裝成功
kubectl get svc --namespace istio-system --output wide
#確認(rèn)所有Pod都在running狀態(tài)
kubectl get pods --namespace istio-system
#可以用上面創(chuàng)建的管理用戶登錄
istioctl dashboard grafana
istioctl dashboard prometheus
istioctl dashboard jaeger
#可以用上面創(chuàng)建的管理用戶登錄
istioctl dashboard kiali
至此,安裝完成。幾分鐘就有一個(gè)可用的Istio環(huán)境了,接下來可以把精力主要放在如何開發(fā)或運(yùn)維上面。出于學(xué)習(xí)的目的,大家也可以嘗試部署Istio官方例子Bookinfo App, 具體參考:
https://istio.io/docs/examples/bookinfo/
例子成功部署如下圖
希望大家都可以成為中國機(jī)長。