k8s最佳實踐

構建小的鏡像

經過下面兩種方式能夠減少構建鏡像大小:node

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

小鏡像能夠提高兩點:linux

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

使用namespace

使用namespace將集羣資源切分紅多塊,能夠提升集羣內部隔離性、管理效率和性能docker

使用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是可壓縮資源,推薦超售,內存是不可壓縮資源,不可超獸ui

優雅退出

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

  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變化比較頻繁,須要保證這些信息可配置化spa

  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上

參考資料

相關文章
相關標籤/搜索