您好,登錄后才能下訂單哦!
小編給大家分享一下Kubernetes與容器設計模式的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
在程序設計領域,面向對象設計和面向對象語言是大家最為熟悉和強大的工具,而面向對象除了其強大的核心特性之外,還有人們通過實踐總結出來的一系列設計模式,可以用來解決實際應用設計中的一些復雜問題。
云原生應用運行的環境都是復雜的分布式環境,在這種情況下,一些有用的設計模式可以起到四兩撥千斤的作用,而K8s社區推出的容器設計模式,則是結合了K8s集群的微服務模型提出的一系列可重用的解決典型分布式系統問題的模式。目前K8s社區推出的容器設計模式主要分為三大類:
1) 單容器管理模式;
2) 單節點多容器模式;
3) 多節點多容器模式;
K8s的最大特色是支持多容器的微服務實例。當然,單容器的模式也是支持的,只不過這種模式并不能突出K8s的特色和強大。很多人對K8s一直以來的印象是:功能強大,但入門較難。其實,單單就啟動一個單容器微服務實例,K8s的命令行操作跟Docker原生命令一樣簡單。
[root@demo-k8s ~]# kubectl run nginx --image=nginx deployment "nginx" created [root@demo-k8s ~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx 1 1 1 1 24s [root@demo-k8s ~]# kubectl get rs NAME DESIRED CURRENT AGE nginx-3137573019 1 1 1m
由上面的例子可以看到,K8s只要一個命令既可以啟動以nginx為鏡像的一個微服務實例。與此同時,K8s的強大之處在于,方便用戶用一個命令的同時,仍然保證了K8s應用體系的完整性和規范性。也就是說,雖然用戶只運行了一個命令,但K8s為用戶自動創建了四種API對象,包括:Deployment,ReplicaSet(RS),Pod和Container。要想擴展伸縮同一服務的實例個數也非常簡單。
[root@demo-k8s ~]# kubectl scale deployment nginx --replicas=3 deployment "nginx" scaled [root@demo-k8s ~]# kubectl get rs NAME DESIRED CURRENT AGE nginx-3137573019 3 3 22m
依靠這種兼顧易用性和模型一致性的設計理念,K8s使自己既適合簡單場景也適合復雜場景。
從單節點多容器模式開始的容器設計模式,是真正體現K8s設計特點的地方,也就是基于多容器微服務模型的分布式應用模型。在K8s體系中,Pod是一個輕量級的節點,同一個Pod中的容器可以共享同一塊存儲空間和同一個網絡地址空間,這使得我們可以實現一些組合多個容器在同一節點工作的模式。既然Pod的特點是共享存儲空間和網絡地址,那么單節點多容器模式一定是利用這兩種特性的。
第一種單節點多容器模式是挎斗模式。這種模式主要是利用在同一Pod中的容器可以共享存儲空間的能力。
一個典型的挎斗應用場景如圖所示:一個工具容器寫文件到共享的文件目錄,應用主容器從共享的文件目錄讀文件。例如,我們可以用Nginx構建一個代碼發布倉庫,簡單的將代碼放到某個本地目錄即可。為了保持同步,我們同時用一個裝有Git客戶端的容器定時到原始代碼倉庫同步下拉最新的代碼。這種模式的好處是,工具容器的鏡像,也就是打包有Git客戶端的鏡像可以重用,而不需要跟應用的容器打包在一起。同樣的應用,應用主容器不用Nginx也可以用Apache Httpd,都可以跟工具容器組合起來形成微服務。
另一個典型的挎斗模式如圖所示:一個工具容器讀文件,應用容器寫文件。例如:一個基于Nginx的Web應用向系統文件系統寫入日志,而一個收集日志的容器從共享目錄讀出日志,并輸出到集群的日志系統。這一模式的好處在于,工具容器的鏡像是可以重用的,不需要在每次更新應用容器打包的時候,把工具容器的執行文件打包進去。
第二種單節點多容器模式是外交官模式。這種模式主要利用同一Pod中的容器可以共享網絡地址空間的特性。如圖所示,在一個Pod中給應用容器搭配一個工具容器作為代理服務器。工具容器幫助應用容器訪問外部服務,使得應用容器訪問服務時不需要使用外網的IP地址,而只需要用localhost訪問本地服務。在這種模式下,作為代理服務器的工具容器好像外部服務派駐在Pod中的“外交官”,使得應用容器辦理業務時只需要跟本Pod的外交官打交道,而不需要出國了,因此而得名。
第三種單節點多容器模式是適配器模式。這種模式對于監控和管理分布式系統尤為重要。對分布式系統的一種理想設計目標,就是能夠實現“分布地執行和存儲,統一的監控和管理”。要想實現“統一的監控和管理”,應用和監控管理交互的接口需要是統一的,而且其接口是依照“統一的監控服務”的接口模式來實現。這和面向對象設計模式中的“適配器模式”也非常相似。
一個典型的可以采用適配器模式的系統,是利用Prometheus作為監控服務的分布式系統。在Prometheus周邊項目中,有諸多適用于不同應用系統的監控數據輸出器(Exporter),負責收集跟特定應用相關的監控數據,使得Prometheus服務可以以統一的數據模式收集不同應用系統的監控數據,每個Exporter同時也都是一個適配器模式的實現。
多節點選舉在分布式系統中是一種重要的模式,特別是對有狀態服務來說。在分布式系統中,一般來說,無狀態服務,可以隨意的水平伸縮,只要把運行業務邏輯的實例復制出去運行就可以,這也就是K8s里ReplicationController和ReplicaSet所做的事情。
對于有狀態服務,人們也希望能夠水平的擴展,但因為每個實例有自己的持久化狀態,而這個持久化狀態必須要延續它的生命,因此,有狀態服務的水平伸縮模式就是狀態的分片,其中機制跟數據庫的分片是一致的。那么對于一個原生為分布式系統設計的有狀態服務,每個實例與分片數據的對應關系,就成為這個有狀態服務的全局信息。對于任何服務,多個實例的全局信息都需要一個保存的地方。
一個簡單的辦法是保存在外部的一個代理服務器上,這也就是MariaDB的Galera解決方案的做法,也是所以代理服務器為后端服務器所做的事情。但這種方式的問題在于,系統要依賴外部代理服務器,而代理服務器本身的高可用和水平伸縮還是沒有解決的問題。
所以對于要原生自己解決高可用和水平伸縮問題的系統,例如Etcd和ElasticSearch,一定要有原生的主控節點選舉機制。這樣這個分布式系統就不需要依賴外部的系統來維護自己的狀態了。對于一個分布式系統,最主要的系統全局信息,就是集群中有哪些節點,Master節點是哪個,每個節點對應哪個分片。主控節點的任務,就是保存和分發這些信息。
在K8s集群中,一個微服務實例Pod可以有多個容器。這一特性很好地提高了多節點選舉機制的可重用性。它使得我們可以專門開發一個用于選舉的容器鏡像,在實際部署中,將選舉容器和普通應用容器組合起來,應用容器只需要從本地的選舉容器讀取狀態,就可以得到選舉結果。這樣,使得應用容器可以只關注自身業務邏輯相關的代碼。
分布式系統的一個重要作用是能夠充分利用多個物理計算資源的能力,特別是在動態按需調動計算資源完成計算任務。設想如果有大量的需要處理的任務隨機的到來,對計算資源需要的容量是不確定地;顯然,按照最大可能計算量和最小可能計算量設置計算節點都是不合理的。
這種情況下,可以把需要處理的任務放到一個待處理的隊列里,根據需要啟動計算節點從隊列讀取任務進行處理。在容器技術廣泛應用之前,也有諸多的分布式處理系統依靠隊列來處理大量計算任務,例如大數據處理系統Hadoop和Spark等。這些系統的一個限制是實現隊列處理模式大多要遵循特定的編程模式和特定的編程語言,同時搭建基礎設施也大多復雜而耗時。而基于容器和Kubernetes編排技術的工作隊列模式的好處在于,利用非常簡單的編排腳本就可以實現工作隊列模式,而用Pod作為輕量級處理節點的模式,使得動態的調度計算資源變得非常容易。在Kubernetes中應用工作隊列模式的邏輯示意圖如下:
以上是“Kubernetes與容器設計模式的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。