本文記錄了作者在Azure Kubernetes集群上安裝istio的過程,以及對應(yīng)用示例的操作租幕。
除非你是與世隔絕凉敲,否則你可能已經(jīng)知道微服務(wù)架構(gòu)模式在過去幾年中迅速普及。這是由兩方面來推動的捅彻,一方面是云部署服務(wù)越來越便利组去,另一方面是小團隊首先期望專注于構(gòu)建簡單好用的子服務(wù),然后才是構(gòu)建應(yīng)用程序步淹。
總的來說从隆,這樣很好诚撵,但也導(dǎo)致了其他一些問題:
1、增加了API層面的安全問題键闺。使用較小的服務(wù)寿烟,以及服務(wù)之間的許多依賴關(guān)系,必須有更多的端點以確保安全辛燥。復(fù)合(Compounding)是一種 “不信任”(“trust nothing”)安全模型的舉措筛武,包括內(nèi)部網(wǎng)絡(luò),因此devops團隊需要建立一種機制來驗證正在與我交流的微服務(wù)是真實的挎塌。
2徘六、需要監(jiān)控更多的服務(wù)。監(jiān)控是必須的榴都,但是微服務(wù)架構(gòu)模型又需要添加另一層監(jiān)控待锈。例如,當(dāng)發(fā)現(xiàn)一個性能問題時嘴高,您現(xiàn)在不能判斷是服務(wù)應(yīng)用還是后端存儲的問題竿音。也可能,是由它所使用的任何依賴服務(wù)引起的拴驮。對服務(wù)延遲進(jìn)行簡單的監(jiān)控是不夠的春瞬,您還需要對服務(wù)使用的每個依賴關(guān)系進(jìn)行度量。
3套啤、流量管理問題快鱼。在多個團隊不斷發(fā)展的服務(wù)之間的互連的數(shù)量,意味著我們需要以多種方式管理它們之間的流量:在應(yīng)用程序的不同版本之間切換流量纲岭、速率限制抹竹、回路阻斷等,以防止依賴服務(wù)的級聯(lián)故障止潮。
Istio是CNCF贊助的一個項目窃判,旨在解決這些問題。這篇博客文章將幫助您安裝Istio喇闸,并演示如何對示例應(yīng)用程序進(jìn)行操作袄琳。
我將使用Azure做演示,但在本教程中所需的全部內(nèi)容是RBAC啟用的Kubernetes 1.9集群和MutatingAdmissionWebhook Admission Controller插件燃乍。如果您使用其他的云創(chuàng)建您的群集唆樊,可以跳過下一節(jié)。
Azure Kubernetes集群創(chuàng)建記錄
對于ACS引擎(ACS Engine)的當(dāng)前缺省值刻蟹,必須重寫默認(rèn)的包含MutatingAdmissionWebhook的Admission Controllers插件逗旁,以便以后可以自動為服務(wù)注入sidecar容器。您可以在ACS引擎cluster.json中通過指定實現(xiàn)(參考Kubernetes1.9項目的部署建議):
{
"apiVersion": "vlabs",
"properties": {
"orchestratorProfile": {
"orchestratorType": "Kubernetes",
"orchestratorRelease": "1.9",
"kubernetesConfig": {
"apiServerConfig": {
"--admission-control": "NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
}
}
},
....
}
在Kubernetes集群上安裝Istio
假設(shè)已有一個配置了RBAC的Kubernetes1.9集群舆瘪。首先片效,獲取最新版本的Istio红伦,并添加其CLI工具istioctl
到安裝目錄,可以參照網(wǎng)站上 安裝步驟 的前四個步驟執(zhí)行淀衣。
在寫這篇文章時昙读,helm chart還不能正常工作,所以不要走這條路膨桥。而是將項目解壓后蛮浑,用kubectl apply
安裝到項目的根目錄:
$ kubectl apply -f install/kubernetes/istio-auth.yaml
你能看到istio的核心組件啟動起來,最后得到一組pod只嚣,如下:
$ kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
istio-ca-797dfb66c5-5dc6f 1/1 Running 0 2h
istio-ingress-84f75844c4-g666n 1/1 Running 0 2h
istio-mixer-9bf85fc68-l54vm 3/3 Running 0 2h
istio-pilot-575679c565-rkm82 2/2 Running 0 2h
安裝自動的sidecar 注入
Istio的核心功能之一是代理服務(wù)間的所有流量陵吸。這使得它能夠做非常有用的事情,比如端點之間的相互認(rèn)證介牙,在服務(wù)的當(dāng)前/下一版本之間進(jìn)行業(yè)務(wù)拆分,并度量請求的等待時間澳厢。
Istio在每一個服務(wù)pod中創(chuàng)建一個sidecar容器环础,通過攔截pod創(chuàng)建及執(zhí)行這種注入來代理流量。
在 Istio項目頁面上記錄了如何自動注入剩拢。為了簡潔线得,下面是用Istio root執(zhí)行的一組命令來配置這個。首先為Kubernetes CA創(chuàng)建一組證書:
$ ./install/kubernetes/webhook-create-signed-cert.sh \
--service istio-sidecar-injector \
--namespace istio-system \
--secret sidecar-injector-certs
接下來徐伐,安裝sidecar注入配置圖:
$ kubectl apply -f install/kubernetes/istio-sidecar-injector-configmap-release.yaml
然后贯钩,建立caBundle YAML文件,用于Kubernetes API服務(wù)器調(diào)用WebHook:
$ cat install/kubernetes/istio-sidecar-injector.yaml | \
./install/kubernetes/webhook-patch-ca-bundle.sh> \
install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml
最后办素,安裝sidecar injector webhook角雷。
$ kubectl apply -f install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml
sidecar injector webhook現(xiàn)在可以運行了:
$ kubectl -n istio-system get deployment -listio=sidecar-injector
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE istio-sidecar-injector 1 1 1 1 1d
安裝已綁定的工具
默認(rèn)情況下,Istio不會將其sidecar代理注入到應(yīng)用程序pod中性穿,而是需要引導(dǎo)它對特定的命名空間注入sidecar∩兹現(xiàn)在我們?yōu)槟J(rèn)命名空間執(zhí)行以下操作:
$ kubectl label namespace default istio-injection**=**enabled
Istio包括一個叫做BookInfo的應(yīng)用程序示例,我們可以使用它來觀察這種注入需曾,以及Istio的其他功能吗坚。可以通過上面的鏈接了解這個應(yīng)用程序的體系結(jié)構(gòu)呆万,然后安裝它:
$ kubectl apply -f samples/bookinfo/kube/bookinfo.yaml
一旦創(chuàng)建了pod商源,你會發(fā)現(xiàn)它們不是通常的1/1,而是2/2:
$kubectl get pods
NAME READY STATUS RESTARTS AGE
details-v1-64b86cd49-8tn9p 2/2 Running 0 15s
productpage-v1-84f77f8747-6dh6l 2/2 Running 0 13s
ratings-v1-5f46655b57-bpwkb 2/2 Running 0 14s
reviews-v1-ff6bdb95b-m8f6f 2/2 Running 0 14s
reviews-v2-5799558d68-8t7h8 2/2 Running 0 14s
reviews-v3-58ff7d665b-2hfx2 2/2 Running 0 13s
這表明Istio已經(jīng)將一個sidecar容器注入到它們中的每一個谋减,它們將對我們前面提到的流量進(jìn)行代理牡彻。執(zhí)行describe可以查看一個pod的描述(你的pod id可能有所不同):
$ kubectl describe pod reviews-v1-ff6bdb95b-m8f6f
輸出包括兩個容器,reviews
容器和istio-proxy
容器出爹。
可以通過查找Istio的入口控制器的公共IP來查看該應(yīng)用程序的運行情況:
$ kubectl get services -n istio-system | grep istio-ingress
istio-ingress LoadBalancer 10.0.58.79 13.68.135.154 80:32552/TCP,443:31324/TCP 3h
打開http://13.68.135.154/productpage(需要換成自己的ip)并刷新讨便,會發(fā)現(xiàn)有三個版本的應(yīng)用程序(沒有星充甚、紅星和黑星)正在負(fù)載均衡。
Istio可視化工具
Istio還捆綁了一些非常有用的工具霸褒,用于服務(wù)網(wǎng)格的管理伴找、調(diào)試和可視化。其中第一個是Grafana和Prometheus废菱,它們是用Istio儀表板預(yù)先配置的技矮。
在0.5.1版本中,在yaml定義中有一個Prometheus命名空間的bug殊轴。編輯install/kubernetes/addons/prometheus.yaml衰倦,查找ServiceAccount
。確保它的定義開始部分如下旁理,如果缺少命名空間就加上它(這在主機中是固定的樊零。該問題在最近的版本中已被解決,所以如果它看起來像下面的話就可以忽略)
apiVersion: v1
kind: ServiceAccount
metadata:
name: prometheus
namespace: istio-system
這樣孽文,您就可以安裝所有這些工具了:
$ kubectl apply -f install/kubernetes/addons/prometheus.yaml
$ kubectl apply -f install/kubernetes/addons/grafana.yaml
$ kubectl apply -f install/kubernetes/addons/servicegraph.yaml
$ kubectl apply -f install/kubernetes/addons/zipkin.yaml
一旦啟動起來驻襟,就應(yīng)該讓這些pod在集群中運行:
$kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
grafana-648859cf87-gpjmw 1/1 Running 0 2h
istio-ca-797dfb66c5-5dc6f 1/1 Running 0 3h
istio-ingress-84f75844c4-g666n 1/1 Running 0 3h
istio-mixer-9bf85fc68-l54vm 3/3 Running 0 3h
istio-pilot-575679c565-rkm82 2/2 Running 0 3h
istio-sidecar-injector-7b559f7f6f-btzr9 1/1 Running 0 2h
prometheus-cf8456855-f2q2r 1/1 Running 0 2h
servicegraph-7ff6c499cc-wm7r2 1/1 Running 0 2h
zipkin-7988c559b7-hsw7x 1/1 Running 0 2h
然后,我們可以通過端口的port-forward命令連接到Grafana前端:
$ exportGRAFANAPOD=$(kubectl get pods -n istio-system | grep "grafana" | awk '{print $1}')
$ kubectl port-forward $GRAFANAPOD -n istio-system 3000:3000
通過瀏覽器打開http://localhost:3000芋哭。
Grafana預(yù)先配置了多個儀表板沉衣,下面這個用來監(jiān)視Mixer,Istio的組件之一减牺。
如果您最近點擊了圖書信息應(yīng)用程序豌习,您會在輸入請求圖中看到您的請求。還可以通過可視化看到應(yīng)用程序的服務(wù)如何使用Service Graph進(jìn)行通信拔疚。
$ export SERVICEGRAPHPOD=$(kubectl get pods -n istio-system | grep "servicegraph" | awk '{print $1}')
$ kubectl port-forward $SERVICEGRAPHPOD -n istio-system 8088:8088
在點擊多個圖書信息頁面后肥隆,打開http://localhost:8088/dotviz可以看到服務(wù)之間的所有互連:
您還可以使用Zipkin查看延遲分解圖:
$ export ZIPKINPOD=$(kubectl get pods -n istio-system | grep "zipkin" | awk '{print $1}')
$ kubectl port-forward $ZIPKINPOD -n istio-system 9411:9411
打開http://localhost:9411,您可以點擊一個產(chǎn)品頁面請求稚失,看看哪些服務(wù)組件導(dǎo)致整個延遲:
有關(guān)這些工具的詳細(xì)信息可以參考Istio項目文檔https://istio.io/docs/tasks/telemetry/巷屿。
Istio流量管理工具
Istio工具的核心在于其流量管理功能。請參照鏈接墩虹,這些文檔能夠非常清楚地描述如何使用這些工具嘱巾,并通過這些工具來管理集群中服務(wù)之間的通信來解決諸如回路阻斷、請求路由诫钓、入口和錯誤注入等旬昭。
希望這個演練很有用。如果你有任何反饋或者喜歡這樣的內(nèi)容菌湃,請在Twitter上聯(lián)系或關(guān)注我问拘。