構建小的鏡像
通過下面兩種方式可以減小構建鏡像大小:
- Small Base Images:有些base鏡像有非常齊全的工具鏈,考慮考慮是否需要這些工具鏈,還是只需要精簡鏡像版鏡像並補充所需的工具
- Builder Pattern:對於一些go、c語言項目,使用docker提供的builder pattern,先構建一個容器用來編譯代碼,並將編譯結果拷貝到最終鏡像中,最終鏡像就是一個精簡版linux鏡像+可執行文件
小鏡像可以提升兩點:
- 性能:提升構建、上傳、下載鏡像的時間,可以極大降低新加宿主機的負載
- 安全性:鏡像越小代表容器越小,容器越小代表容器可以被攻擊的地方就越少,也就越安全
使用namespace
使用namespace將集羣資源切分成多塊,可以提高集羣內部隔離性、管理效率和性能
使用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是可壓縮資源,推薦超售,內存是不可壓縮資源,不可超獸
優雅退出
當pod被刪除或者殺死的時候,會走優雅退出流程:
- 給pod設置Terminating狀態,並等待pod中容器退出
- 執行pod的preStop Hook邏輯。可以是一個發送給容器的command或者http請求,可以幫助那些沒有優雅退出邏輯的容器,提前做一些預清理操作
- 發送SIGTERM給pod
- 當容器成功退出後,或等待時間超過優雅退出的最大時間(默認30s),發送SIGKILL給pod,pod被徹底清理
映射外部服務
當希望在k8s集羣中訪問外部服務時,需要知道外部服務的域名、或者ip+port。通常域名這種比較固定,可以hard code,但是ip+port變化比較頻繁,需要保證這些信息可配置化
- 使用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上