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