利用 Kubernetes Service 的 selector 無痛運維線上 pod_Kubernetes中文社群
Kubernetes 有一個叫做 service 的功能,這個功能為 pod 提供負載均衡器的服務。當 pod 執行出現錯誤,或者停止工作的時候,有時候你想要從 service 上刪除 pod 而不終止 pod。
Service & Endpoints
這個端點清單會自動更新 IP 地址和埠。因為對應的 pod 是根據定義在 service 上的標籤選擇器被選擇出來的。這也就意味著 service 可以很輕鬆地跟 pod 本身結合。大家也可以看到選擇器模式已經被運用到很多其它 Kubernetes 元件了,比如 Deployment,ReplicaSet。
由於端點清單是基於標籤選擇器自動更新的,所以我們通過更新在 pod 上的標籤將行為異常的 pod 拿走,這樣的話它就不會跟選擇器匹配了。為了能夠更新 service,將 pod 從中移除,我們需要一個良好設計的標籤選擇器。
所以,首先我們需要新增一個標籤,這樣就可以將任意 pod 從 service 中拿出來了。
現在讓我們用 enabled 標籤來建立一個 Deployment:
在我們的 service 中,我們在選擇器中使用這些標籤:
之後,建立我們的 Deployment 和 service,這個過程中,這些 pod 是保持執行的。
在這裡,也是可以列出端點的。
假設 pod nginx-1802606028-1posu 服務異常,我們需要對其進行維護。首先讓我們得到它的 pod IP。
現在,為了對 pod 進行維護,我們把 enabled 標籤修改成除了“true”的其它東西。我們需要輸入--overwrite 標誌來強制更新已經存在的標籤。
如果我們再次檢查端點,我們就會注意到我們還是有兩個端點。因為 Deployment 根據它的選擇器發現它需要啟動另一個 pod (進入維護狀態的 pod 不再匹配 Deployment 的選擇器導致符合要求的 pod 數量不及設定的數量)。
我們注意到,正在維護的 pod 已經不在端點上了。
現在我們可以對我們的 pod 進行維護。
維護
每個應用程式維護 pod 的方式都是不一樣的,所以我在這裡就不做深入了。然而,Kubernetes 很多功能都可以輕鬆連線到執行在你叢集裡的應用程式,所以在這裡我簡要描述一下。
kubectl attach
你可以連線到一個正在執行的 pod,通過標準輸入傳送資料,從標準輸出獲得除錯資訊。如果你的程序允許你在 stdin 上傳送命令來獲得關於內部狀態的資訊的話。但是,有些容器並不會建立 TTY。你能看到的是 stdout,這跟只使用 kubectl logs 差別不大。
kubectl exec
kubectl exec 意味著你可以在容器中執行命令。你可以使用它來做很多事情,可能要使用它來發送訊號給容器中的程序。
或者,你可以開啟一個 bash shell,如果你安裝了 bash 的話。
kubectl port-forward
另一個有用的功能就是 port forward 了。我們可以用這個來轉移本地埠到我們的 pod,這樣的話我們就可以給它傳送請求,並且看到它是如何迴應的。
接著,我們就可以從另一個終端給它傳送請求。
總結
標籤選擇器令維護 pod 變得容易。但是還是有些細節需要你注意一下的。
Service和Deployments
由於 Service 和 Deployment 都經常使用標籤選擇器,所以當你將一個 pod 從 service 中移除,它仍然可能是 Deployment 的一部分,這種情況也是可能的。在大多數情況下,這都是 OK 的,但是如果你有一個 Deployment,帶有 HorizontalPodAutoscaler 的功能,那麼 Deployment 久可能任意時刻縮容而刪除你的 pod。同樣,當單個的 pod 從 service 中拿出來的時候,它仍然可能對你的應用程式產生影響。鑑於這些原因,我建議同樣也要將 Deployment 拿出來,並且用 Deployment 來啟動一個替代的 pod。
將 Pods 放回到 Service
在我們的 pod 上完成維護之後,我們可能就想要把它放回到 service。這個可以通過再次更新標籤來匹配 service 選擇器。