Kubernetes In Action 有狀態應用編排——Statefulset

本文整理自 CNCF X 阿里巴巴雲原生技術公開課 & 《Kubernetes In Action》

回顧一下Deployment的功能

  • 支持定義一組pod的期望數量,Controller會爲我們維持Pod的數量在期望的版本以及期望的數量。
  • 支持配置Pod的發佈方式,配置完成後Controler會按照我們給出的策略來更新Pod。
  • 支持一鍵回滾

Deployment 認爲管理的所有相同版本的Pod都是一模一樣的副本

但以上應付的是無狀態的應用,但是面臨以下有狀態的場景:

  • Pod之間並非相同副本,每一個pod都有獨立標誌
  • 每個pod對應一個固定網絡hostname,並且在發佈升級後能夠繼續保持
  • 每個pod有一個獨立的存儲盤,並且在發佈升級後能夠繼續掛載原有盤
  • 應用發佈的時候能夠按照固定順序升級Pod

Statefulset 有狀態應用控制器

1.每個Pod都有order序號,會按照order序號創建,刪除,更新pod
2.通過配置headless service,使得每個pod有一個唯一的hostname
headless service (無clusterIP,每一個pod都有一個endpoint,都有一個對應的dns域名)
3.通過配置pvc模板,就是pvc template,使得每個pod有一塊或者多塊pv存儲盤
4.支持一定數量灰度發佈

如何提供穩定的網絡標識?

有時候訪問有狀態的Pod需要通過主機名來定位,而無狀態的Pod就不需要,因爲每個無狀態的Pod都是一樣的,路由轉發隨便選一個就完事。

因此一個Statefulset要求創建一個用於記錄每個Pod網絡標記的headless Service

通過這個Service,每個pod將擁有獨立的DNS記錄,這樣集羣裏它的夥伴或者客戶端可以通過主機名方便找到他。

如何爲每個有狀態實例提供專屬的穩定存儲?

在StatefulSet中也需要創建持久卷聲明模板,那麼在Pod創建之前,先創建這些PVC,然後再綁定到一個Pod實例上

example

在這裏插入圖片描述

通過把Service的clusterIP設置爲None,即Service爲headless-service,可以使得StatefulSet裏面的Pod都擁有獨立的網絡標識。

然後在StatefulSet的配置中要指定其對應哪一個Service

版本

Deployment使用ReplicaSet來管理和維持副本數量,而StatefulSet controller直接管理下屬的Pod,而Pod用一個label來標識版本

Statefulset有什麼

在這裏插入圖片描述

總結StatefulSet

支持每個Pod獨享PVC,每一個Pod有一個獨立的hostname,升級發佈後還能複用PVC和網絡標識

提供At most once語義,必須保證兩個擁有相同標記和綁定相同PVC的pod不會同時運行

對比Replicaset

  • Replicaset的每個Pod都會共享一個PVC,對應一個PV,沒有辦法使得其定義的所有副本都有一個單獨的PVC
  • 不能爲每個Pod提供穩定的標誌,例如某個pod刪掉,重新再起一個pod,這個新的pod會有全新的主機名和IP
  • Replicaset創建的pod都是隨機生成的,即常見的podName+Hash,而Statefulset創建的pod都擁有規則的名稱。

ref

https://gitbook.cn/gitchat/column/undefined/topic/5de26a4537796e6b106bef40

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章