k8s最佳實踐

構建小的鏡像

通過下面兩種方式可以減小構建鏡像大小:

  1. Small Base Images:有些base鏡像有非常齊全的工具鏈,考慮考慮是否需要這些工具鏈,還是只需要精簡鏡像版鏡像並補充所需的工具
  2. Builder Pattern:對於一些go、c語言項目,使用docker提供的builder pattern,先構建一個容器用來編譯代碼,並將編譯結果拷貝到最終鏡像中,最終鏡像就是一個精簡版linux鏡像+可執行文件

小鏡像可以提升兩點:

  1. 性能:提升構建、上傳、下載鏡像的時間,可以極大降低新加宿主機的負載
  2. 安全性:鏡像越小代表容器越小,容器越小代表容器可以被攻擊的地方就越少,也就越安全

使用namespace

使用namespace將集羣資源切分成多塊,可以提高集羣內部隔離性、管理效率和性能

使用Readiness和Liveness Probes做health check

k8s提供了兩種容器的health check機制:

  1. Readiness:用來check容器是否可以接收流量,如果check失敗,就不讓容器接收流量
  2. Liveness:用來check容器是否存活,如果check失敗,就重啓容器

默認,k8s認爲Liveness Check成功的容器,Readiness Check也成功,於是可以直接接收流量

k8s提供三種Probe用來check容器是否health

  1. Http Probes:發送http請求,如果返回200 ~ 300,表明health
  2. Command Probes:在容器中執行命令,如果返回0,表明health
  3. TCP Probes:與指定port建立連接,如果成功連接,則表明health

給資源設置request和limit

k8s在調度的時候,會以request作爲參考依據,並以limit限制資源使用

  • ResourceQuotas:限制namespace的總cpu、mem等資源的request和limit
  • LimitRanges:限制namespace中每個pod的cpu、mem等資源的request和limit,避免超小或者超大的pod,並提供pod的cpu、mem默認值

通過使用request和limit進行超售,cpu是可壓縮資源,推薦超售,內存是不可壓縮資源,不可超獸

優雅退出

當pod被刪除或者殺死的時候,會走優雅退出流程:

  1. 給pod設置Terminating狀態,並等待pod中容器退出
  2. 執行pod的preStop Hook邏輯。可以是一個發送給容器的command或者http請求,可以幫助那些沒有優雅退出邏輯的容器,提前做一些預清理操作
  3. 發送SIGTERM給pod
  4. 當容器成功退出後,或等待時間超過優雅退出的最大時間(默認30s),發送SIGKILL給pod,pod被徹底清理

映射外部服務

當希望在k8s集羣中訪問外部服務時,需要知道外部服務的域名、或者ip+port。通常域名這種比較固定,可以hard code,但是ip+port變化比較頻繁,需要保證這些信息可配置化

  1. 使用ConfigMap:需要在deployment中引入ConfigMap,並且當ConfigMap中配置的Endpoint變化時,還需要重啓deployment中的container才能生效
  2. 使用Static kubernetes Service:一種後端沒有映射任何pod的Service,可以用來映射kubernetes Endpoints,並在Endpoint中配置外部服務的ip+port。通過將訪問Service Name來映射到該Service後端的Endpoint,最後映射到具體的ip+port。每次ip+port有變動,直接修改Endpoint中信息即可

zero downtime升級集羣

集羣分master和node,先升級master,再升級node

  • master:將新版本master部署在單獨的zone,保證multi-zone集羣共同工作,並通過vip分流,將老版本zone停服,流量自動轉移到新版本zone
  • node:提前部署好新版本node節點,組織成node pool。按node爲粒度,將老版本node中pod逐步rolling update到新版本node上
本文轉移開源中國-k8s最佳實踐 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章