K8s 部署應用必備
應用部署邏輯
知識點介紹:
當希望在Kubernetes上部署應用程式時,通常要定義三個元件;
- 部署(Deployment):這是建立Pod應用程式副本的方法;
- 服務(Service):將流量排程到Pods的內部負載平衡器;
- 入口(Ingress):描述流量如何從叢集外部流到服務。
Cluster介紹:
Cluster(叢集)是計算、儲存和網路資源的集合,Kubernetes利用這些資源執行各種基於容器的應用。
最簡單的Cluster可以只有一臺主機(既是Master也是Node)。
Master介紹:
Master是Cluster的大腦,它的主要職責是排程、即決定應用放在那裡執行。
Master執行Linux作業系統,可以是物理機也可以是虛擬機器
為了實現高可用,可以執行多個Master
Node介紹:
Node的職責是執行容器應用
Node由Master管理,Node負責監控並彙報容器狀態,並根據Master的要求管理容器的生命週期
Node執行在Linux作業系統,可以是物理機也可以是虛擬機器
Controller介紹
Kubernetes通常不會直接建立Pod,而是通過controller管理pod。controller中定義了pod的部署特性,比如有幾個副本,在什麼樣的Node上執行等。為了滿足不同的應用場景,Kubernetes提供了多種Controller,包括Deployment,RePlicaSet、DaemonSet、StatefulSet、Job等。
各個Controller介紹
Deployment
DepolyMent是最常見的Controller,比如我們可以通過建立Deployment來部署應用。
Deployment可以管理Pod的多個副本,並確保Pod按期望執行。
RePlicaSet
RePlicaSet實現了pod的多副本管理
使用Deployment時會自動建立RePlicaSet,也就是說Deployment是通過RePlicaSet來管理Pod的多個副本的,我們通常不需要直接使用RePlicaSet。
DaemonSet
DaemonSet用於每個Node最多隻執行一個Pod場景,正如其名稱所揭示的,DaemonSet通常用於執行daemon。
StatefulSet
StatefulSet能夠保證Pod的每個副本在整個生命週期中名稱是不變的。而其他Controller不提供這個功能
當某個Pod發生故障需要刪除並重新啟動時,Pod的名稱將會發生變化。同時StatefulSet會保證副本按照固定的順序啟動、更新或者刪除。
Joba
Job用於執行結束就刪除的應用。而其他Controller中的pod通常是長期持續執行。
Service介紹
Deployment可以部署多個副本,每個Pod都有自己的IP,Pod可能會被頻繁的銷燬和重啟,它們的IP會隨時變化,用IP來訪問Deployment不太現實。
Service定義了外界訪問一組特定的Pod的方式,Service有自己的IP和埠,Service為Pod提供了負載均衡。
NameSpace介紹
namespace可以將一個物理的Cluster邏輯上劃分成多個虛擬的Cluster,每一個Cluster就是一個namespace,不同namespace裡面的資源是完全隔離的
Pod介紹:
Pod是Kubernetes的最小工作單元
每個Pod包含一個或多個容器,Pod中的容器會作為一個整體被Master排程到一個Node上執行。
Kubernetes引入Pod的目的
可管理性
有些容器天生就需要有緊密的聯絡,一起工作。Pod提供了比容器更高層次的抽象,將它們封裝到一個部署單元中。
Kubernetes以Pod為最小單位進行排程、擴充套件、共享資源、管理生命週期。
通訊和資源共享
Pod中的所有容器使用同一個網路namespace,即相同的IP地址和Port空間。它們可以直接用localhost通訊。
同樣的、這些容器可以共享儲存,當Kubernetes掛在volume到Pod,本質上是將volume掛載到Pod中的每一個容器。
Pod的兩種使用方式
執行單一容器
one-container-per-Pod 是Kubernetes最常見的模型,這種情況下,只是將單個容器封裝成Pod;
即便是隻有一個容器,Kubernetes管理的也是Pod而不是直接管理容器。
執行多個容器
對於那些聯絡非常緊密的,而且需要直接共享資源的容器,應該放在同一個Pod中。
比如下面這個Pod包含兩個容器:一個File Puller,一個是Web Server。File Puller會定期從外部的Content Manager中拉取最新的檔案,將其存放在共享的volume中。Web Server從volume中讀取檔案,響應controller的請求。這兩個容器是緊密協作的,他們一起為Consumer提供最新的資料。同時他們也通過volume共享資料。所以放到一個pod是最合適的。
在Kubernetes叢集中,Pod 是所有業務型別的基礎,它是一個或多個容器的組合。這些容器共享儲存、網路和名稱空間,以及如何執行規範。在Pod中,所有容器都被統一安排排程,並執行在共享的上下文中。對於具體應用而言,Pod是他們的邏輯主機,Pod包含業務相關的多個應用容器。
Kubernetes不只是支援Docker容器,它也支援其它容器。
Pod的上下文可以理解成多個linux名稱空間的聯合:
PID名稱空間(同一個Pod中應用可以看到其它程式)
網路名稱空間(同一個Pod中的應用對相同的IP地址和埠有限)
IPC名稱空間(同一個Pod中的應用可以通過VPC或者POSIX進行通訊)
UTS名稱空間(同一個Pod中的應用共享一個主機名稱)
在Pod中,容器共享一個IP地址和埠空間,他們可以通過localhost發現彼此。
在不同Pod中的容器,擁有不同的IP地址,因此不能直接在程式間進行通訊。
容器之間通常通過Pod IP地址進行通訊。
在Pod被建立時,會分配一個唯一ID,並被排程到Node中,直到Pod被終止或刪除。如果Pod所在的Node當機,給定的Pod不會被重新排程,它將被完全相同的Pod代替。
一般來說,使用者不應該直接建立Pod,即是建立單個的Pod也應該通過控制器建立。在叢集範圍內,控制器為Pod提供自愈能力,以及副本和部署管理。
一個多容器的Pod會包含一個檔案拉取器和一個Web伺服器,此web伺服器會使用一個持久化儲存卷在容器中共享儲存
每一個pod都會被指派一個唯一的ip地址,在pod中每一個容器共享網路命名儲存空間,包括IP和網路埠。當pod中的容器需要和pod外的實體進行通訊時,則需要通過埠等網路資源。
Pod能夠被指定共享儲存卷的集合,在pod中所有容器能訪問共享儲存卷,允許這些容器共享資料,儲存卷也允許在一個pod持久化資料,以防止其中的容器需要被重啟。
Pod的工作方式:
Pod是一個臨時存在的實體,所以Kubernetes不會直接建立一個獨立的pod。當直接建立一個獨立的pod,如果缺少資源或者所被排程到的node失敗,則pod會被刪除。
重啟pod和重啟pod中的容器不是同一個概念,pod自身不會執行,它只是容器執行的環境。通過控制器能建立和管理多個pod,並在叢集範圍內處理副本、部署和提供自愈能力。
例如:當一個Node失敗,控制器可以自動在另外的節點上部署一個完全一樣的副本。控制器是Pod模板來建立pod。
Pod模板是一個被包含在其它物件(例如:Deployment、StatefulSet、DaemonSet等)中的Pod規格
Pod重啟策略:
在pod中的容器可能會由於異常等原因導致其終止退出,Kubernetes提供了重啟策略以重啟容器。重啟策略對同一個Pod中的所有容器起作用,容器的重啟,是由Node上的kubelet執行。Pod支援三種重啟策略,在配置檔案中通過restartPolicy欄位設定重啟策略。
Always:只要退出就重啟;
OnFailure:只有在失敗退出(exit code != 0 )時,才會重啟。
Never:只要退出,就不再重啟;
這裡的重啟是指在Pod的宿主Node上進行本地重啟,而不是排程到其它Node上。
Volume介紹
Docker的資料持久化方式
Volume繞過container的檔案系統,直接將資料寫到host機器上,只是volume是被docker管理的,docker下所有的volume都在host機器上指定的目錄下(/var/lib/docker/volumes)
資料持久化介紹
狹義的理解: “持久化”僅僅指把域物件永久儲存到資料庫中;廣義的理解,“持久化”包括和資料庫相關的各種操作。
● 儲存:把域物件永久儲存到資料庫。
● 更新:更新資料庫中域物件的狀態。
● 刪除:從資料庫中刪除一個域物件。
● 載入:根據特定的OID,把一個域物件從資料庫載入到記憶體。
● 查詢:根據特定的查詢條件,把符合查詢條件的一個或多個域物件從資料庫載入內在存中。
2.為什麼要持久化?
持久化技術封裝了資料訪問細節,為大部分業務邏輯提供物件導向的API。
● 通過持久化技術可以減少訪問資料庫資料次數,增加應用程式執行速度;
● 程式碼重用性高,能夠完成大部分資料庫操作;
● 鬆散耦合,使持久化不依賴於底層資料庫和上層業務邏輯實現,更換資料庫時只需修改配置檔案而不用修改程式碼。
部署過程:
一旦執行了Kubernetes叢集,就可以在其上部署應用;
1、 建立Deployment配置,Deployment將指揮Kubernetes如何建立和更新應用程式的例項。
2、 建立Deployment成功後,master節點將應用例項排程到叢集中的各個節點上
3、 建立應用例項成功後,Kubernetes deployment控制器會持續監控這些例項
4、 如果託管例項的節點關閉或被刪除,deployment控制器會將該例項替換為叢集中的另一個節點上的例項。這提供一種自我修復機制解決故障維護問題
5、 控制器管理pod
a) Deployment:無狀態部署,例如web,微服務 ,API;
b) StatefulSet:有狀態部署,例如資料庫,ZK、ETCD;
c) DaemonSet:守護程式部署,例如監控Agent,日誌Agent;
d) Job&CronJob:批處理,例如資料庫庫備份、郵件通知;
6、 pod資料持久化
容器部署過程一般會有以下三種資料:
啟動時需要的初始資料,可以是配置檔案;
啟動過程中產生的臨時資料,該臨時資料需要多個容器間共享;
啟動過程中產生的業務資料
相關文章
- Helm部署k8s應用K8S
- 使用 k8s 快速部署應用服務K8S
- 全棧必備——負載均衡的應用全棧負載
- Web開發者必備:Web應用檢查清單Web
- 創業者必備的10個應用創業
- 移動應用開發必備工具盤點
- k8s學習筆記一(搭建&部署helloworld應用)K8S筆記
- ORACLE 12C RAC 部署應用包準備Oracle
- 原生IP的應用策略:養號達人必備
- Android應用開發必備的20條技能Android
- 使用Rancher在K8S上部署高效能PHP應用程式K8SPHP
- [譯]單應用跨多k8s叢集的部署與管理K8S
- 雲原生系列2 部署你的第一個k8s應用K8S
- K8s小白?應用部署太難?看這篇就夠了!K8S
- k8s運維必備-常用命令大全K8S運維
- mac必備一款Markdown 筆記應用 - JoplinMac筆記
- 架構師必備:HBase行鍵設計與應用架構
- 架構師必備:MySQL主從同步原理和應用架構MySql主從同步
- 財務人員必備的Word軟體應用技巧
- M2onhold:營銷人員必備應用
- 現代Web應用開發者必備的六大技能Web
- 微服務從程式碼到k8s部署應有盡有大結局(k8s部署)微服務K8S
- 使用 k8s 部署你的第一個應用: Pod,Deployment 與 ServiceK8S
- 開發階段,將SpringBoot應用快速部署到K8SSpring BootK8S
- k8s學習筆記(1)- 簡單部署springboot應用K8S筆記Spring Boot
- RMI應用部署
- Mac裝機必備的十款應用 - 實用工具篇Mac
- 從底層到應用,那些資料人的必備技能
- Web開發人員必備的18個iPhone應用程式WebiPhone
- 輕鬆部署 Laravel 應用 | 《08. 手動部署 - 部署應用程式碼》Laravel
- 程式設計師應該具備哪些必備技能程式設計師
- 運維必知 | 從底層到應用,入門大資料必備技能彙總!運維大資料
- Web應用防火牆是什麼?網路安全必備常識Web防火牆
- 網路安全必備常識:Web應用防火牆是什麼?Web防火牆
- Docker部署Angular應用DockerAngular
- Flask 應用如何部署Flask
- EJB 部署及應用
- LNMP部署及應用LNMP