OpenShift架構
陳照昌 Sam Chen
- 精誠資訊/恆逸教育訓練中心-資深講師
- 技術分類:網路管理與通訊應用
OpenShift架構
微服務時代的來臨,Container逐漸成為一種趨勢與潮流。但Containers越來越多,在不同的主機溝通上,開始有需求及出現困難,因此Kubernetes出現來解決了 Containers之間溝通及協調的運作。而OpenShift更架構在Kubernetes之上,增加了一些更好用的功能,讓我們在操作及管理Containers更加得心應手。以下是OpenShift的架構圖。
元件說明:
Redhat CoreOS: 是一種Linux來執行Container的最佳化作業系統。
CRI-O:是Kubernetes所實作的Container Runtime Interface(CRI),可以使用Open Container initiative(OCI)相容的Runtimes。
Kerbernets:管理叢集(cluster)的主機(實體或虛擬)的協同服務。
Etcd:是一種Key-Value的儲存(Store),是Kubernetes用來儲存Cluster中的Container或其他資源的資訊與設定。
CRDs: (Custom Resource Definitions)是儲存在Etcd中的資源型態,並且是由 Kubernetes所管理。
Containerized Services:是許多 Paas的架構功能,例如:網路、授權。
Runtimes and xPaas:是可以直接被開發人員所使用的base container images,例如:JBoss EAP及ActiveMQ。
DevOps Tools and User Experience:RHOCP提供了由REST API為基礎建立的網頁介面及命列提示的管理工具。
Kubernetes的主要資源型態(Resource type)
- Pods(po):是K8S(Kubernetes)的工作基礎單位,是由一個或多個Containers的集合,共用資源(IP address, persistent storage volumes)。
- Services(svc):單一IP/Port之結合,提供單一存取點,去存取到一群相同功能pods之集合。Service預設值是讓Client使用round-robin平衡負載的方式連接到pods。
- Replication Controllers(rc):定義pods如何被複製(水平擴充 horizontally scaled)到另一個nodes,是K8S為Containers所提供的高可用度技術。
- Persistent Volumes(pv):定義給K8S pods來使用的儲存裝置。
- Persistent Volume Claims(pvc):是pod用來對storage的一種要求,pvc用來將一個pv關連到一個pod,讓pod中的Container可以使用pv所定義的儲存裝置(storage), 通常是將pv指向的storage掛載到Container的檔案系統中。
- ConfigMaps(cm)及Secrets:內容為key及value的一個或多個組合,可以被其他資源來使用,通常是使用在集中管理設定某些值。Secrets與ConfigMaps的差別在於Secrets的值有使用base64方法編碼(不是加密)而且被限制只有少數的授權使用者才可以存取。
OpenShift增加的資源型態
- Deployment(4.5版以後)或稱之為Deployment config(dc) (4.5版以前):描述了在一個pod中的Containers的部署設定方式,並且在部署階段時被使用。dc提供了一個持續部署的基礎流程。
- Build config(bc):是一種在OpenShift專案中所定義的程序(process),使用在OpenShift Source-to-Image(S2I)功能。S2I可以根據應用程式的原始碼建立出Container image。bc是和dc一起運作,提供了可擴充Continuous Integration and Continuous Delivery(CI/CD)工作流程基礎。
- Route:使用DNS名稱做為OpenShift Router當成Application及Microservices(微服務)之ingress point(進入點)。
如果想列出所有可用資源可以執行oc api-resources或kubectl api-resources
網路架構的改變
因為整個架構使用SDN(軟體定義網路)的方式來做溝通,因此在網路結構上,會有一定程度的改變。
- Container在每一個node有自己的Internal Network存取,所以同一個node的 containers(pods)彼此可以相互存取。
- Kubernetes提供了一個SDN(軟體定義網路的方式)讓一個Cluster中的任何一個 node的任何一個pod(Container)可以相互存取。
- 因為在Kubernetes中的pod,是動態IP Address配置方式,所以每次pod重新啟動就可能配置到不同的IP Address,所以pods之間很難做互動存取。因此Service解決了這個問題,讓pods去存取Service的IP Address,而Service使用label的方式去比對pods,來取得pods所被分配的IP Address。
- OpenShift定義了一個Route資源,讓外部使用者直接存取固定的DNS名稱,來存取到Cluster中的Service及pods的資源。
結語
Container的發展對系統工程師及軟體程式設計師都會是一場大革命。而OpenShift是一個強大的管理Container的利器!!