開箱即用:在Kubernetes安裝Istio使微服務(wù)變得更容易

本文記錄了作者在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的組件之一减牺。

圖1

如果您最近點擊了圖書信息應(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ù)之間的所有互連:

圖2

您還可以使用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)致整個延遲:

圖3

有關(guān)這些工具的詳細(xì)信息可以參考Istio項目文檔https://istio.io/docs/tasks/telemetry/巷屿。

Istio流量管理工具

Istio工具的核心在于其流量管理功能。請參照鏈接墩虹,這些文檔能夠非常清楚地描述如何使用這些工具嘱巾,并通過這些工具來管理集群中服務(wù)之間的通信來解決諸如回路阻斷、請求路由诫钓、入口和錯誤注入等旬昭。

希望這個演練很有用。如果你有任何反饋或者喜歡這樣的內(nèi)容菌湃,請在Twitter上聯(lián)系或關(guān)注我问拘。

原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子骤坐,更是在濱河造成了極大的恐慌绪杏,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纽绍,死亡現(xiàn)場離奇詭異蕾久,居然都是意外死亡,警方通過查閱死者的電腦和手機拌夏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門僧著,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人障簿,你說我怎么就攤上這事盹愚。” “怎么了站故?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵皆怕,是天一觀的道長。 經(jīng)常有香客問我西篓,道長愈腾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任污淋,我火速辦了婚禮,結(jié)果婚禮上余掖,老公的妹妹穿的比我還像新娘寸爆。我一直安慰自己,他們只是感情好盐欺,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布赁豆。 她就那樣靜靜地躺著,像睡著了一般冗美。 火紅的嫁衣襯著肌膚如雪魔种。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天粉洼,我揣著相機與錄音节预,去河邊找鬼。 笑死属韧,一個胖子當(dāng)著我的面吹牛安拟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宵喂,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼糠赦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拙泽,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤淌山,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后顾瞻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泼疑,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年朋其,在試婚紗的時候發(fā)現(xiàn)自己被綠了王浴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡梅猿,死狀恐怖氓辣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情袱蚓,我是刑警寧澤钞啸,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站喇潘,受9級特大地震影響体斩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颖低,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一絮吵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忱屑,春花似錦蹬敲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至从铲,卻和暖如春瘪校,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背名段。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工阱扬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伸辟。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓价认,卻偏偏與公主長得像,于是被迫代替她去往敵國和親自娩。 傳聞我的和親對象是個殘疾皇子用踩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355