三赠堵、跨語言微服務(wù)框架 - Istio官方示例(自動注入.請求路由.流量控制.故障注入)

一. 自動注入(sidecar)

說到服務(wù)網(wǎng)格必然是侵入式的包裹著你的服務(wù),在中間過程完成了一些列工作,那么就到了我們的第一個主題自動注入,大家在通過webui或者是kubectl創(chuàng)建的時候默認并不會觸發(fā)Istio的容器注入,那么有以下幾種方式可以讓istio注入生效:

  • 使用命令注入istioctl來創(chuàng)建容器
> istioctl kube-inject -f samples/sleep/sleep.yaml | kubectl apply -f -
  • 開啟namespace自動注入無論從任何地方創(chuàng)建POD在這個namespace都會自動注入

首先我們需要確認MutatingAdmissionWebhook并且ValidatingAdmissionWebhook許可控制器并以正確的順序添加了,也就是我們在搭建K8S時的修改,并且需要確認啟用了registrationregistration API:

image

先創(chuàng)建一個用于測試的namespace:

apiVersion: v1
kind: Namespace
metadata:
   name: istio-test
   labels:
     name: istio-test

我們可以通過以下命令查看開啟了自動注入的namespace:

> kubectl get namespace -L istio-injection
NAME           STATUS    AGE       ISTIO-INJECTION
default        Active    4d        
istio-system   Active    1h        disabled
istio-test     Active    21m      
kube-public    Active    4d        
kube-system    Active    4d       

通過以下命令可以開啟自注入:

> kubectl label namespace istio-test istio-injection=enabled
NAME           STATUS    AGE       ISTIO-INJECTION
default        Active    4d        
istio-system   Active    1h        disabled
istio-test     Active    21m       enabled
kube-public    Active    4d        
kube-system    Active    4d       

我們在istio中創(chuàng)建一個nginx鏡像看看和正常的鏡像有什么區(qū)別:

image

在容器組中明顯多出了一個istio-proxy這個就表示注入成功了

二, 部署示例項目bookinfo

要開始進行請求路由實驗之前我們需要先部署好官方提供的demo其實也就是幾條命名搞定的事情:

創(chuàng)建基礎(chǔ)Deployment + Service

> kubectl apply -n istio-test -f istio-1.0.3/samples/bookinfo/platform/kube/bookinfo.yaml
# 確認pod創(chuàng)建成功
NAME                             READY     STATUS    RESTARTS   AGE
details-v1-6764bbc7f7-49mnq      2/2       Running   0          14m
nginx-65c588c7d5-6jmzz           2/2       Running   0          23m
productpage-v1-54b8b9f55-jtwmd   2/2       Running   0          13m
ratings-v1-7bc85949-hcl9r        2/2       Running   0          14m
reviews-v1-fdbf674bb-5n7t7       2/2       Running   0          13m
reviews-v2-5bdc5877d6-4fg72      2/2       Running   0          13m
reviews-v3-dd846cc78-vp4r7       2/2       Running   0          13m

# 確認service創(chuàng)建成功
> kubectl get services -n istio-test
NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.43.31.242   <none>        9080/TCP   35s
productpage   ClusterIP   10.43.80.92    <none>        9080/TCP   24s
ratings       ClusterIP   10.43.51.233   <none>        9080/TCP   34s
reviews       ClusterIP   10.43.220.25   <none>        9080/TCP   27s

創(chuàng)建Istio網(wǎng)關(guān)(可選使用主要控制域名路由的入口):

> kubectl apply -n istio-test -f istio-1.0.3/samples/bookinfo/networking/bookinfo-gateway.yaml
# 確定網(wǎng)關(guān)創(chuàng)建成功
> kubectl get gateway -n istio-test
NAME               AGE
bookinfo-gateway   14s

創(chuàng)建基礎(chǔ)路由規(guī)則(控制流量就是控制rule的規(guī)則):

> kubectl apply -n istio-test -f istio-1.0.3/samples/bookinfo/networking/destination-rule-all.yaml
# 通過以下命令可以查看路由規(guī)則
 kubectl get destinationrules -o yaml -n istio-test

三. 請求路由

開始之前我們需要先理解下圖整個服務(wù)之間的關(guān)系

image

部署好了之后Istio網(wǎng)關(guān)會默認占用31380端口作為80端口的出口,在網(wǎng)關(guān)中從31380進來的流量進行了路由判斷并且統(tǒng)一路由到了**productpage
**9080端口,所以我們訪問http://:31380/productpage能得到以下界面:

image

因為reviews有v1.v2.v3三個版本,并且在rule配置中都進行了配置,所以多次訪問在右邊的星星會有不一樣的結(jié)果(此時概率是3/1):

image
image

3.1 所有流量指向V1版本

> kubectl apply -n istio-test -f istio-1.0.3/samples/bookinfo/networking/virtual-service-all-v1.yaml

規(guī)則如下,去除了V2和V3:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1

現(xiàn)在在無論怎么刷新就只能看到V1返回內(nèi)容:

image

3.2 指定jason用戶的流量指向到V2版本

> kubectl apply -n istio-test -f istio-1.0.3/samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml

規(guī)則中定義了在headers中有配置的情況下路由訪問到V2

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1
image

登錄之后發(fā)現(xiàn)怎么刷新都顯示的是V2版本的黑星星

image

四. 故障注入

4.1 HTTP延遲故障

在微服務(wù)系統(tǒng)中可能表明看上去沒有問題,可能存在潛在的彈性文檔,當請求壓力變大響應(yīng)時間變長可能會應(yīng)為一些內(nèi)部的超時機制不合理等問題導致不可使用,這個時候通過Istio的HTTP延遲故障可以模擬出訪問延遲來排查這類異常BUG

我們將在 reviews:v2 和 ratings 服務(wù)之間的一個用戶 jason 注入一個 7 秒的延遲昼蛀。 這個測試將會發(fā)現(xiàn)故意引入 Bookinfo 應(yīng)用程序中的錯誤弯院。

由于 reviews:v2 服務(wù)對其 ratings 服務(wù)的調(diào)用具有 10 秒的硬編碼連接超時,比我們設(shè)置的 7s 延遲要大售躁,因此我們期望端到端流程是正常的(沒有任何錯誤)酌住。

> kubectl apply -n istio-test -f istio-1.0.3/samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml
> kubectl get -n istio-test virtualservice ratings -o yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
  ...
spec:
  hosts:
  - ratings
  http:
  - fault:
      delay:
        fixedDelay: 7s
        percent: 100
    match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: ratings
        subset: v1
  - route:
    - destination:
        host: ratings
        subset: v1

你期望 Bookinfo 主頁在大約 7 秒鐘加載完成并且沒有錯誤。但是失暴,出現(xiàn)了一個問題军浆,Reviews 部分顯示了錯誤消息,頁面實際上用了大約 6s蝴悉。

image

在 productpage 和 reviews 服務(wù)之間超時時間是 6s - 編碼 3s + 1 次重試總共 6s ,reviews 和 ratings 服務(wù)之間的硬編碼連接超時為 10s 瘾敢。由于我們引入的延時拍冠,/productpage 提前超時并引發(fā)錯誤尿这。

這些類型的錯誤可能發(fā)生在典型的企業(yè)應(yīng)用程序中,其中不同的團隊獨立地開發(fā)不同的微服務(wù)庆杜。Istio 的故障注入規(guī)則可幫助您識別此類異常射众,而不會影響最終用戶。

PS : 請注意晃财,這里僅限制用戶 “jason” 的失敗影響叨橱。如果您以任何其他用戶身份登錄,則不會遇到任何延遲断盛。

4.2 HTTP abort進行故障注入

測試微服務(wù)彈性的另一種方法是引入 HTTP abort 故障,如果異常中斷那么需要做出對應(yīng)的處理罗洗。為用戶 “jason” 創(chuàng)建故障注入規(guī)則發(fā)送 HTTP abort

> kubectl apply -n istio-test -f istio-1.0.3/samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml
> kubectl get -n istio-test virtualservice ratings -o yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
  ...
spec:
  hosts:
  - ratings
  http:
  - fault:
      abort:
        httpStatus: 500
        percent: 100
    match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: ratings
        subset: v1
  - route:
    - destination:
        host: ratings
        subset: v1

立即看到頁面加載并看到 Ratings service is currently unavailable 消息

image

我們退出賬號發(fā)現(xiàn)又恢復正常了

image

五.流量控制

一個常見的用例是將流量從一個版本的微服務(wù)逐漸遷移到另一個版本。 在Istio中钢猛,您可以通過配置一系列規(guī)則來實現(xiàn)此目標伙菜, 這些規(guī)則將一定百分比的流量路由到一個或另一個服務(wù)。 在此任務(wù)中命迈,您將先分別向 reviews:v1 和 reviews:v3 各發(fā)送50%流量贩绕。 然后,您將通過向 reviews:v3 發(fā)送100%的流量來完成遷移壶愤。

走了上面流程的童鞋現(xiàn)在在不等了的情況下怎么都是訪問的V1版本的返回,使用下面的命令把50%的流量從 reviews:v1 轉(zhuǎn)移到 reviews:v3:

> kubectl apply -n istio-test -f istio-1.0.3/samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
> kubectl get -n istio-test virtualservice reviews -o yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
  ...
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 50
    - destination:
        host: reviews
        subset: v3
      weight: 50

最后將所有流量全部指向到V3版本,會發(fā)現(xiàn)始終能夠看到紅色的星星

> kubectl apply -n istio-test -f istio-1.0.3/samples/bookinfo/networking/virtual-service-reviews-v3.yaml
> kubectl get -n istio-test virtualservice reviews -o yaml
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淑倾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子征椒,更是在濱河造成了極大的恐慌娇哆,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勃救,死亡現(xiàn)場離奇詭異迂尝,居然都是意外死亡,警方通過查閱死者的電腦和手機剪芥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琴许,“玉大人税肪,你說我怎么就攤上這事“裉铮” “怎么了益兄?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長箭券。 經(jīng)常有香客問我净捅,道長,這世上最難降的妖魔是什么辩块? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任蛔六,我火速辦了婚禮荆永,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘国章。我一直安慰自己具钥,他們只是感情好,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布液兽。 她就那樣靜靜地躺著骂删,像睡著了一般。 火紅的嫁衣襯著肌膚如雪四啰。 梳的紋絲不亂的頭發(fā)上宁玫,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音柑晒,去河邊找鬼欧瘪。 笑死,一個胖子當著我的面吹牛敦迄,可吹牛的內(nèi)容都是我干的恋追。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼罚屋,長吁一口氣:“原來是場噩夢啊……” “哼苦囱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脾猛,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤撕彤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后猛拴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體羹铅,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年愉昆,在試婚紗的時候發(fā)現(xiàn)自己被綠了职员。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡跛溉,死狀恐怖焊切,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芳室,我是刑警寧澤专肪,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站堪侯,受9級特大地震影響嚎尤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伍宦,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一芽死、第九天 我趴在偏房一處隱蔽的房頂上張望乏梁。 院中可真熱鬧,春花似錦收奔、人聲如沸掌呜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽质蕉。三九已至,卻和暖如春翩肌,著一層夾襖步出監(jiān)牢的瞬間模暗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工念祭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兑宇,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓粱坤,卻偏偏與公主長得像隶糕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子站玄,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353