kubernetes容器刪除時快速釋放ip的方案

問題的來由

在kubernetes集羣的生產中,常常遇到這樣的一個問題,就是在應用大規模更新時,大量容器刪除然後大量容器建立,建立的容器須要很長時間才能就緒。這其中一個可能的緣由,就是大量容器刪除釋放ip過於緩慢,致使新建立的容器沒法及時獲取ip,從而沒法及時啓動。api

這種狀況廣泛存在於ip池較小或者應用升級須要ip保持不變的情景下,具備較爲廣泛的意義。針對這一狀況,筆者先前作過一個方案用以解決該問題,在這裏與你們分享一下。網絡

k8s容器刪除的流程

首先,咱們先來梳理下容器刪除的整個流程,看下爲何會釋放ip緩慢。kubernetes容器的整個刪除流程基本套路以下:app

  1. 發送刪除請求到apiserver,標記容器的deletionTimestamp
  2. kubelet watch到該事件,知道pod須要刪除,進入刪除流程
  3. pod執行killPod流程
  4. kill app容器
    1. 執行preStopHook
    2. 等待gracePeriod
    3. 中止app容器
  5. kill pause容器
    1. 調用cni接口,中止容器網絡
    2. 中止pause容器
  6. 從apiserver中將pod的信息清除(真正刪除掉存儲在etcd的pod信息)

那麼能夠看到,ip的釋放實際上是發生在調用cni接口的時候。所以,按照常規流程,其須要等待的時間爲執行preStopHook的時間 + gracePeriod + 中止app容器的時間。這個時間對於但願快速釋放ip的情形下,是較爲漫長的(通常要幾十秒)。code

加速ip資源釋放的方案與利弊

若是想要加速ip資源的釋放,那麼方式也就是顯而易見的,就是在kubernetes的現有流程基礎上進行定製開發,將cni的調用前置,將其提早到kill app容器以前server

特別注意,這裏只是將cni接口調用提早,可是不要將中止pause容器提早,不然先中止pause容器可能會致使app容器中止時會有一些問題。接口

修改後的流程以下:事件

  1. 發送刪除請求到apiserver,標記容器的deletionTimestamp
  2. kubelet watch到該事件,知道pod須要刪除,進入刪除流程
  3. pod執行killPod
  4. 調用cni接口,中止容器網絡,釋放容器ip
  5. kill app容器
    1. 執行preStopHook
    2. 等待gracePeriod
    3. 中止app容器
  6. kill pause容器
    1. 調用cni接口,中止容器網絡(可選)
    2. 中止pause容器
  7. 從apiserver中將pod的信息清除(真正刪除掉存儲在etcd的pod信息)

這樣的話,能夠在第一時間儘快釋放ip,而無需等待太久。ip

可是這樣的方案也存在着很大的弊端,就是首先摘除了容器的網絡,而若是preStopHook的執行或者中止app容器時須要依賴容器網絡(好比應用須要調用某個接口才能進行下線等),可能會致使流程沒法進行,容器被卡住,造成殭屍容器或者造成應用信息錯誤。資源

所以這個方案最好要作成可選的選項,在annotation中增長一個註解。然後根據應用的實際狀況,選擇是否使用快速釋放ip的策略。開發

相關文章
相關標籤/搜索