Linkerd 2.10(Step by Step) (一)將您的服務(wù)添加到 Linkerd
為了讓您的服務(wù)利用 Linkerd,它們還需要通過(guò)將 Linkerd 的數(shù)據(jù)平面代理(data plane proxy)注入到它們服務(wù)的 pod 中,從而進(jìn)行網(wǎng)格化。
Linkerd 2.10 中文手冊(cè)持續(xù)修正更新中:
https://linkerd.hacker-linner.com/
Linkerd 2.10 系列
- 快速上手 Linkerd v2 Service Mesh(服務(wù)網(wǎng)格)
- 騰訊云 K8S 集群實(shí)戰(zhàn) Service Mesh—Linkerd2 & Traefik2 部署 emojivoto 應(yīng)用
- 詳細(xì)了解 Linkerd 2.10 基礎(chǔ)功能,一起步入 Service Mesh 微服務(wù)架構(gòu)時(shí)代
將 Linkerd 的控制平面添加到您的集群不會(huì)改變您的應(yīng)用程序的任何內(nèi)容。為了讓您的服務(wù)利用 Linkerd,它們需要通過(guò)將 Linkerd 的數(shù)據(jù)平面代理注入到它們的 pod 中來(lái)進(jìn)行網(wǎng)格化(meshed)。
對(duì)于大多數(shù)應(yīng)用程序,網(wǎng)格化服務(wù)就像添加 Kubernetes annotation 一樣簡(jiǎn)單。但是,在啟動(dòng)時(shí)立即進(jìn)行網(wǎng)絡(luò)調(diào)用的服務(wù)可能需要處理啟動(dòng)競(jìng)爭(zhēng)條件,而使用 MySQL、SMTP、Memcache 和類似協(xié)議的服務(wù)可能需要處理 server-speaks-first 協(xié)議。
繼續(xù)閱讀以了解更多信息!
使用注解(annotations)對(duì)服務(wù)進(jìn)行網(wǎng)格化
對(duì) Kubernetes resource 進(jìn)行網(wǎng)格劃分通常是通過(guò)使用 linkerd.io/inject: enabled 的 Kubernetes annotation 來(lái)注解資源或其命名空間來(lái)完成的。當(dāng)資源被創(chuàng)建或更新時(shí),這個(gè)注解會(huì)觸發(fā)自動(dòng)代理注入。
為方便起見(jiàn),Linkerd 提供了一個(gè) linkerd inject 文本轉(zhuǎn)換命令,可以將此 annotation 添加到給定的 Kubernetes 清單中。當(dāng)然,這些注解可以通過(guò)任何其他機(jī)制進(jìn)行設(shè)置。
簡(jiǎn)單地添加注釋不會(huì)自動(dòng)對(duì)現(xiàn)有 pod 進(jìn)行網(wǎng)格劃分。設(shè)置注解后,您需要重新創(chuàng)建或更新任何資源(例如使用 kubectl rollout restart)以觸發(fā)代理注入。(通常,可以執(zhí)行rolling update 以將代理注入實(shí)時(shí)服務(wù)而不會(huì)中斷。)
示例
要將 Linkerd 的數(shù)據(jù)平面代理添加到 Kubernetes 清單中定義的服務(wù), 您可以在將清單應(yīng)用到 Kubernetes 之前 使用 linkerd inject 添加注解(annotations):
- cat deployment.yml | linkerd inject - | kubectl apply -f -
此示例轉(zhuǎn)換 deployment.yml 文件以在正確的位置 添加注入注解(injection annotations),然后將其應(yīng)用于集群。
驗(yàn)證數(shù)據(jù)平面 Pod 是否已注入
要驗(yàn)證您的服務(wù)是否已添加到網(wǎng)格中, 您可以查詢 Kubernetes 以獲取 pod 中的容器列表,并確保列出了代理:
- kubectl -n MYNAMESPACE get po -o jsonpath='{.items[0].spec.containers[*].name}'
這里我們看一下 emojivoto 這個(gè)應(yīng)用相關(guān)的信息:
- kubectl -n emojivoto get po -o jsonpath='{.items[0].spec.containers[*].name}'
- # 如果一切順利,您將在輸出中看到 `linkerd-proxy`,例如:linkerd-proxy emoji-svc
關(guān)于啟動(dòng)競(jìng)爭(zhēng)條件(startup race conditions)的說(shuō)明
雖然代理啟動(dòng)非??欤?Kubernetes 不提供任何關(guān)于容器啟動(dòng)順序的保證, 因此應(yīng)用程序容器可能會(huì)在代理準(zhǔn)備好之前啟動(dòng)。這意味著在應(yīng)用程序啟動(dòng)時(shí)立即建立的任何連接都可能會(huì)失敗,直到代理處于活動(dòng)狀態(tài)。
在很多情況下,這可以被忽略:理想情況下,應(yīng)用程序?qū)⒅卦囘B接, 或者 Kubernetes 將在失敗后重新啟動(dòng)容器,最終代理將準(zhǔn)備就緒?;蛘撸梢允褂? linkerd-await 延遲應(yīng)用程序容器直到代理準(zhǔn)備好, 或者設(shè)置一個(gè) skip-outbound-ports 來(lái)繞過(guò)這些連接的代理。
關(guān)于 server-speaks-first 協(xié)議的說(shuō)明
Linkerd 的協(xié)議檢測(cè)通過(guò)查看客戶端數(shù)據(jù)的 前幾個(gè)字節(jié)來(lái)確定連接的協(xié)議。某些協(xié)議(例如 MySQL、SMTP 和其他服務(wù)器優(yōu)先協(xié)議)不發(fā)送這些字節(jié)。在某些情況下,這可能需要額外的配置以避免在 建立第一個(gè)連接時(shí)出現(xiàn) 10 秒的延遲。