此作品使用於:Docker容器與Kubernetes,打造企業級的LNMP WEB架構

專案動機
IDC(Internet Data Center)網路資料中心。
公布 2021年台灣資訊與通信科技(Information and Communication Technology,簡稱ICT)市場趨勢預測:
為了從疫情的危機中復原,企業正更積極地透過容器化的多雲/混和數位基礎架構以面對下一波新常態的各種挑戰。
金融、零售和電信產業等皆已針對雲端容器化數位基礎架構進行相關投資。
IDC預測到2023年,全球將有50%的企業,台灣將有30%的企業將應用程序部署在容器化的多雲環境。

專案網站介紹

Kubernetes叢集中上線Wordpress網站
可以拜訪動態頁面與靜態頁面
重點技術
實現更精簡,快速與高效功能將傳統的虛擬伺服器網站架構(16台配置),導入到下方容器與Kubernetes叢集(4台配置),實現更精簡,快速與高效功能。

容器部署
類似於VM,但是它們具有被放寬的隔離屬性,可以在應用程序之間共享操作系統(OS)。
容器被認為是輕量級的。容器與VM 類似,具有自己的文件系統、CPU、內存、進程空間等。由於它們與基礎架構分離,因此可以跨雲和OS 發行版本進行移植。

Kubernetes部署
容器是打包和運行應用程序的輕量與高效方式。
在生產環境中,需要管理運行應用程序的容器,並確保不會停機。例如,如果一個容器發生故障,則需要啟動另一個容器。如果系統化處理將更便捷容易。
Kubernetes提供了一個可彈性運行分佈式系統的框架。
Kubernetes會滿足你的擴展要求、故障轉移、部署模式等。

佈署Kubernetes叢集
在/etc/hosts添加每台主機名稱與IP方便通信
禁用Selinux與防火牆,kubernetes基於性能理由建議關閉swap
添加docker-ce與kubernetes的yum源
安裝docker-ce,kubelet, kubectl, kubeadm
Master機器初始化
Nodes機器加入叢集
全部節點安裝通用的 flannel容器網路介面CNI(Container Network Interface)元件


Pod與Deployment
Pod由一個或者多個容器組成(例如Docker容器),它們共享容器存儲、網路和容器運行配置項。
Deployment是定義一個容器部署,包含Pod的詳細資訊,數量與標籤。Kubernetes 會就依照Deployment是定義啟動容器服務,並且維持更新
一個Deployment可以包含一個或多個Pod副本,每個Pod副本的角色相同,所以系統會自動為Deployment的多個Pod副本分發請求。
Deployment集成了上線部署、滾動升級、創建副本、恢復上線的功能,在某種程度上,Deployment實現無人值守的上線,大大降低了上線過程的複雜性和操作風險。
本實驗透過了Deployment佈署了Nginx與php-fpm網站容器與Mysql資料庫容器



Deployment-Nginx
Nginx是用於 HTTP、HTTPS、SMTP、POP3 和 IMAP 協議的開源反向代理服務器,以及負載均衡器、HTTP 緩存和 Web 服務器(原始服務器)。
Nginx 項目非常注重高並發、高性能和低內存使用,本實驗用來託管一些簡單的靜態內容。
利用Deployment資源文件,開啟三個Nginx容器,並且掛載Wordpress網站。

Deployment- “php-fpm”
PHP-FPM 負責管理一個程式池來處理來自 Web 伺服器的 HTTP 動態請求,在PHP-FPM 中,Master 程式負責與 Web 伺服器進行通訊,接收 HTTP 請求,再將請求轉發給 worker 程式處理。
Worker 程式主要負責動態執行 PHP 程式碼,處理完成後,將處理結果返回給 Web 伺服器,再由 Web 伺服器將結果傳送給客戶端,這就是 PHP-FPM 的工作原理。


Deployment-Mysql
關係型資料庫管理系統,在WEB套用方面MySQL是最好的RDBMS(Relational Database Management System,關係資料庫管理系統)套用軟體之一。
MySQL是一種關聯資料庫管理系統,關聯資料庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度並提高了靈活性。
MySQL所使用的SQL語言是用於訪問資料庫的最常用標準化語言。一般中小型網站的開發都選擇 MySQL 作為網站資料庫。
搭配PHP和Apache可組成良好的開發環境。MySQL所使用的SQL語言是用於訪問資料庫的最常用標準化語。

Service
Kubernetes Service 從邏輯上定義了運行在集群中的一組Pod,這些Pod 提供了相同的功能。當每個Service 創建時,會被分配一個唯一的IP 地址(也稱為clusterIP)。
這個IP 地址與一個Service 的生命週期綁定在一起,當Service 存在的時候它也不會改變。可以配置Pod 使它與Service 進行通信,Pod 知道與Service 通信將被自動地負載均衡到該Service 中的某些Pod 上。
本實驗創建了3個service,分別與Nginx與php-fpm網站容器與Mysql資料庫容器進行連接。


Ingress
在生產環境中,我們會將網站或系統放到 Kubernetes 上執行與管理,再利用 Service 機制把服務暴露給外部存取使用。
Ingress 能夠實現第七層網路協定(L7)功能,並以域名(Domain name)形式來對應到 Service 的 Pod 端點。
本實驗中,我們使用ingress,連接整個網站叢集中的Nginx-service,讓用戶可以從外部拜訪整個網站。


Horizontal Pod Autoscaler
Horizontal Pod Autoscaler 可以根據CPU 利用率自動擴縮ReplicationDeployment的Pod 數量。
本實驗中創建一個Horizontal Pod Autoscaler 用於控制php-fpm的Deployment,使Pod 的副本數量維持在1 到5 之間。
大致來說,HPA 將(通過Deployment)增加或者減少Pod 副本的數量以保持所有Pod 的平均CPU 利用率在50% 左右(由於每個Pod 請求200 毫核的CPU,這意味著平均CPU 用量為100 毫核)。

專案心得分享&回饋
一年來致力於Linux學習,從系統管理,服務配置,叢集架構,一直進展到容器技術,Kubernetes佈署,這樣的學習歷程也呼應了現在現今IT技術的發展趨勢。
調查發現,希望擁有容器化的應用服務的企業,從2018的9%增加到2020的19%,容器技術正在取代虛擬化。IDC預測到2023年,全球將有50%的企業,台灣將有30%的企業將應用程序部署在容器化的多雲環境
在本次專案中,將從從傳統的虛擬化方式的叢集架構出發,再遷移到Docker與Kubernetes,可以比較在佈署上的差距與便捷。
Docker可以快速在虛擬機與伺服器上啟動容器,一台主機上可以同時執行多個容器,運行效能更高資源消耗更少。
最後,本專案中透過Kubernetes對容器的高效管理,可以體驗更快速的交付和部署,更輕鬆的遷移和擴展。
Comments