Kubernetes
提供可拓展的容器調度功能:
- 用戶可以對接不同的
container runtime
, 其中最常用的是docker
。 - 用戶可以在
docker
內封裝隔離各類進程應用 。
因此,kubernetes
可以調度和部署一系列web
服務等app
, 也可以部署分佈式應用, 計算密集型應用如Spark和Tensorflow等,這取決於開發者的部署配置和docker
鏡像內容等。
下文記錄一些實踐經驗,不深入配置層面。
Kubernetes 部署web服務
web
服務config
配置用config map方案比較方便。- 集羣管理工具用Rancher比較方便, 用戶可以在其
UI
管理多個k8s
集羣,避免編寫yam
l等和kubectl
等繁瑣操作。Rancher
在namespace
的基礎上也引入了project
的概念, 即project
內可包含多個 k8snamespace
. 但是kubectl get ns
仍會發現所有project
下的namespace
,Rancher
的這個做法只是方便用戶管理集羣。另外Rancher
對k8s
內資源的變化響應也是很不錯的, 即在Rancher
前端UI
能很及時地看到deployment
等的狀態刷新情況。另外Rancher
提供部署回滾功能,降低誤操作帶來的開銷。 - 使用
Rancher
的時候注意其與K8s的兼容關係。 web
服務間通信配置參考service。k8s
集羣所有服務上免費可用的tls
參考
Kubernetes 部署計算密集型服務
計算密集型服務與web
服務有區別:
- 計算密集型服務注重計算性能, 容器環境會有損耗(內存/cpu虛擬化開銷)
- 計算密集型服務偏向批量啓動和批量刪除等操作, 如啓動深度學習集羣,大數據集羣等, 計算完畢後
deployment/pods
等即刪除。 - 計算密集型服務對實例間帶寬要求高,在K8s環境下要考慮CNI損耗
- 不同計算業務的容器運行環境配置不同,運行依賴不同,調度配置(
workers/masters
)等較複雜
實踐:
-
優化計算和存儲性能:
- 引入統一存儲和本地固態硬盤等
- 選用開銷較少的
CNI
- 增加計算業務並行化部分, 用並行度淡化虛擬化開銷
- 容器中使用
GPU
計算有較好的性能
-
計算密集型服務的調度的簡單做法可以依賴原生
k8s
的deployment
等概念,利用k8s
的client,編寫簡單的創建服務, 如將spark master
設置爲deployment A
, 爲其配置service A
等, 再將spark worker
等設置爲deployment B
, 爲其配置service B
, 二者通過service A/B
通信。 -
計算密集型服務的調度的更佳做法具體開發可以參考k8s operator,
開發operator
的做法會更規範, 對管理複雜的計算密集型服務調度實現起來更有效。對比之下,單純依靠k8s的client去組織分佈式服務會顯得低效且會引入很多瑣碎問題,例如需要修改spark
鏡像, 插入指定的啓動程序, 用於收集spark
節點的信息等。