構建小的鏡像
經過下面兩種方式能夠減少構建鏡像大小:node
- Small Base Images:有些base鏡像有很是齊全的工具鏈,考慮考慮是否須要這些工具鏈,仍是隻須要精簡鏡像版鏡像並補充所需的工具
- Builder Pattern:對於一些go、c語言項目,使用docker提供的builder pattern,先構建一個容器用來編譯代碼,並將編譯結果拷貝到最終鏡像中,最終鏡像就是一個精簡版linux鏡像+可執行文件
小鏡像能夠提高兩點:linux
- 性能:提高構建、上傳、下載鏡像的時間,能夠極大下降新加宿主機的負載
- 安全性:鏡像越小表明容器越小,容器越小表明容器能夠被攻擊的地方就越少,也就越安全
使用namespace
使用namespace將集羣資源切分紅多塊,能夠提升集羣內部隔離性、管理效率和性能docker
使用Readiness和Liveness Probes作health check
k8s提供了兩種容器的health check機制:後端
- Readiness:用來check容器是否能夠接收流量,若是check失敗,就不讓容器接收流量
- Liveness:用來check容器是否存活,若是check失敗,就重啓容器
默認,k8s認爲Liveness Check成功的容器,Readiness Check也成功,因而能夠直接接收流量安全
k8s提供三種Probe用來check容器是否health工具
- Http Probes:發送http請求,若是返回200 ~ 300,代表health
- Command Probes:在容器中執行命令,若是返回0,代表health
- 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
- 給pod設置Terminating狀態,並等待pod中容器退出
- 執行pod的preStop Hook邏輯。能夠是一個發送給容器的command或者http請求,能夠幫助那些沒有優雅退出邏輯的容器,提早作一些預清理操做
- 發送SIGTERM給pod
- 當容器成功退出後,或等待時間超過優雅退出的最大時間(默認30s),發送SIGKILL給pod,pod被完全清理
映射外部服務
當但願在k8s集羣中訪問外部服務時,須要知道外部服務的域名、或者ip+port。一般域名這種比較固定,能夠hard code,可是ip+port變化比較頻繁,須要保證這些信息可配置化spa
- 使用ConfigMap:須要在deployment中引入ConfigMap,而且當ConfigMap中配置的Endpoint變化時,還須要重啓deployment中的container才能生效
- 使用
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上
參考資料