Probius是一款自定義任務引擎,可以靈活方便的處理日常運維中的各種任務,我們所有的CI/CD任務都通過Probius來完成的,這篇文章Probius:一個功能強大的自定義任務系統對其有詳細的介紹,之前通過Probius更新Kubernetes的Deployment是通過指令碼的方式來完成的,指令碼大概像這樣

if [ $# != 2 ];then
echo "USAGE: $0 PROJ ENVT"
exit 1
fi PROJ=$1
ENVT=$2 BASE_DIR=/home/data/probius/${PROJ}/${ENVT}
DOCKER_DIR=${BASE_DIR}/docker
IMAGE_NAME=`cat ${BASE_DIR}/cache/image.txt` cd ${DOCKER_DIR} &&\
export KUBECONFIG=/root/.kube/config &&\
kubectl set image deployment/${ENVT}-${PROJ} ${ENVT}-${PROJ}=${IMAGE_NAME} -n ${ENVT} &&\
exit 0 ||\
exit 1

直接通過kubectl命令來更新,這就需要在Probius伺服器上安裝kubectl並打通整個叢集,這種方式僅是能用但不夠優雅,並且對於開發測試環境,在部署完成後有檢視日誌及登入系統排錯的需求,這就需要藉助Kubernetes-Dashboard來完成,多個系統相互關聯跳轉增加了使用成本,同時Dashboard的許可權也不好控制,所以我就考慮是否可以讓Kubernetes以外掛的形式整合進Probius系統,使用者在Probius系統內完成部署,同時也可以在Probius系統檢視Kubernetes的相關資訊甚至通過WebSSH登陸,徹底拋棄掉Kubernetes的Dashboard,看上去很完美,正好最近打算升級下Kubernetes叢集版本,於是就趁此機會花了幾天時間來實現了

Kubernetes子任務

首先在命令和指令碼之外添加了Kubernetes型別的子任務,部署任務只需要關聯這個Kubernetes型別的子任務就可以實現Deployment的更新

這個子任務的目的主要是為了替換上邊的指令碼,通過Kubernetes的Python客戶端來實現對Deployment的更新,有了這個子任務我們就不需要在Probius伺服器上安裝kubectl服務來執行kubectl命令了,整個部署流程能夠正常跑通

Kubernetes管理

但在部署之前我們需要先新建相關服務,以一個全新的環境為例,需要先建立Kubernetes的namespace,然後在namespace下建立deployment、service、ingress,我們的namespace是根據環境來劃分了,例如dev環境的所有容器都跑在名為dev的namespace下

Namespace建立完成後,可以點選進入檢視Namespace下的deployment、service、ingress、configmap

當前還沒有具體deployment/service/ingress,接下來就建立,每個專案都會有deployment、service和ingress,並且他們之間是相互關聯的,新建專案的同時就把這些服務給一併建立了是個不錯的選擇,為此寫了個KubeProject服務,在這裡可以定義專案的名稱、環境、映象、域名、配置以及關聯的configmap

選擇儲存僅會儲存填寫的表單資訊到資料庫,選擇儲存並建立K8S環境就可以在儲存表單資訊到資料庫的同時建立Kubernetes的deployment、service和ingress了,儲存並更新Deployment會在Deployment配置有變化的情況下使用,例如新的資源限制或是configmap繫結

當資源建立成功後我們就可以在namespace下看到相應資源了

我們最為關注的deployment資訊也可以通過點選deployment的名字或是在KubProject裡點選專案的名字進入,進入之後可以檢視deployment下的pod列表,通過webssh進入pod內部,也可以檢視每個pod的日誌,甚至可以對deployment進行scale伸縮或是重建

WebSSH很好用,想要實現的可以看看這篇文章:Django實現WebSSH操作Kubernetes Pod

至此可以擺脫Kubernetes-dashboard了

後記

我們使用Kubernetes有超過4年的時間,藉助於Kubernetes不僅提高了資源利用率,更是優化了整個運維的工作流程,受益頗多

留個截圖紀念下這戰功赫赫的叢集吧,雖然你已老去,但是你把我帶進了Kubernetes的大門,從此打開了另一個世界