1. 程式人生 > >利用 Kubernetes Service 的 selector 無痛運維線上 pod_Kubernetes中文社群

利用 Kubernetes Service 的 selector 無痛運維線上 pod_Kubernetes中文社群

Kubernetes 有一個叫做 service 的功能,這個功能為 pod 提供負載均衡器的服務。當 pod 執行出現錯誤,或者停止工作的時候,有時候你想要從 service 上刪除 pod 而不終止 pod。

Service & Endpoints
這個端點清單會自動更新 IP 地址和埠。因為對應的 pod 是根據定義在 service 上的標籤選擇器被選擇出來的。這也就意味著 service 可以很輕鬆地跟 pod 本身結合。大家也可以看到選擇器模式已經被運用到很多其它 Kubernetes 元件了,比如 Deployment,ReplicaSet。

螢幕快照_2016-10-09_上午11.08_.30_.png

由於端點清單是基於標籤選擇器自動更新的,所以我們通過更新在 pod 上的標籤將行為異常的 pod 拿走,這樣的話它就不會跟選擇器匹配了。為了能夠更新 service,將 pod 從中移除,我們需要一個良好設計的標籤選擇器。
所以,首先我們需要新增一個標籤,這樣就可以將任意 pod 從 service 中拿出來了。
現在讓我們用 enabled 標籤來建立一個 Deployment:

螢幕快照_2016-10-09_上午11.09_.21_.png

在我們的 service 中,我們在選擇器中使用這些標籤:

螢幕快照_2016-10-09_上午11.09_.53_.png

之後,建立我們的 Deployment 和 service,這個過程中,這些 pod 是保持執行的。

螢幕快照_2016-10-09_上午11.11_.03_.png

在這裡,也是可以列出端點的。

螢幕快照_2016-10-09_上午11.12_.00_.png

假設 pod nginx-1802606028-1posu 服務異常,我們需要對其進行維護。首先讓我們得到它的 pod IP。

螢幕快照_2016-10-09_上午11.12_.50_.png

現在,為了對 pod 進行維護,我們把 enabled 標籤修改成除了“true”的其它東西。我們需要輸入--overwrite 標誌來強制更新已經存在的標籤。

螢幕快照_2016-10-09_上午11.13_.32_.png

如果我們再次檢查端點,我們就會注意到我們還是有兩個端點。因為 Deployment 根據它的選擇器發現它需要啟動另一個 pod (進入維護狀態的 pod 不再匹配 Deployment 的選擇器導致符合要求的 pod 數量不及設定的數量)。

螢幕快照_2016-10-09_上午11.13_.59_.png

我們注意到,正在維護的 pod 已經不在端點上了。

螢幕快照_2016-10-09_上午11.14_.35_.png

現在我們可以對我們的 pod 進行維護。
維護
每個應用程式維護 pod 的方式都是不一樣的,所以我在這裡就不做深入了。然而,Kubernetes 很多功能都可以輕鬆連線到執行在你叢集裡的應用程式,所以在這裡我簡要描述一下。

kubectl attach
你可以連線到一個正在執行的 pod,通過標準輸入傳送資料,從標準輸出獲得除錯資訊。如果你的程序允許你在 stdin 上傳送命令來獲得關於內部狀態的資訊的話。但是,有些容器並不會建立 TTY。你能看到的是 stdout,這跟只使用 kubectl logs 差別不大。

螢幕快照_2016-10-09_上午11.15_.17_.png

kubectl exec
kubectl exec 意味著你可以在容器中執行命令。你可以使用它來做很多事情,可能要使用它來發送訊號給容器中的程序。

螢幕快照_2016-10-09_上午11.16_.10_.png

或者,你可以開啟一個 bash shell,如果你安裝了 bash 的話。

螢幕快照_2016-10-09_上午11.16_.39_.png

kubectl port-forward
另一個有用的功能就是 port forward 了。我們可以用這個來轉移本地埠到我們的 pod,這樣的話我們就可以給它傳送請求,並且看到它是如何迴應的。

螢幕快照_2016-10-09_上午11.17_.09_.png

接著,我們就可以從另一個終端給它傳送請求。

螢幕快照_2016-10-09_上午11.17_.43_.png

總結
標籤選擇器令維護 pod 變得容易。但是還是有些細節需要你注意一下的。

Service和Deployments
由於 Service 和 Deployment 都經常使用標籤選擇器,所以當你將一個 pod 從 service 中移除,它仍然可能是 Deployment 的一部分,這種情況也是可能的。在大多數情況下,這都是 OK 的,但是如果你有一個 Deployment,帶有 HorizontalPodAutoscaler 的功能,那麼 Deployment 久可能任意時刻縮容而刪除你的 pod。同樣,當單個的 pod 從 service 中拿出來的時候,它仍然可能對你的應用程式產生影響。鑑於這些原因,我建議同樣也要將 Deployment 拿出來,並且用 Deployment 來啟動一個替代的 pod。

將 Pods 放回到 Service
在我們的 pod 上完成維護之後,我們可能就想要把它放回到 service。這個可以通過再次更新標籤來匹配 service 選擇器。

螢幕快照_2016-10-09_上午11.18_.59_.png