課程實錄 | 從 0 搭建高可用 Wordpress 部落格(上)

語言: CN / TW / HK

原文作者:陶輝

原文連結:課程實錄 | 從 0 搭建高可用 Wordpress 部落格(上)

轉載來源:NGINX 開源社群


編者按——本文為系列課程《在 K8s 中用好 NGINX 》的第一節《從 0 搭建高可用 WordPress 部落格》的課程實錄。由於文章較長,將分為上下兩篇釋出,點選這裡收看課程回放。

在本節課程中,陶輝老師首先基於環境搭建,講解如何從 0 搭建高可用 Wordpress 部落格,然後展開講述儲存、網路部分課程概述了作者對 K8s 的理解、虛擬化技術與容器的差別,也幫助您快速瞭解 K8s 的架構、重要元件以及教學中所用例子的最終架構。

課程背景簡介

本文將分享如何在 K8s 中用好 NGINX。K8s 目前是一個特別火的話題,無論是 Server List、還是 FAS 都是要基於 K8s 來構建。一些基礎實力不是很強的非網際網路公司,他們也有能力去管理幾萬個節點共同完成一些任務,很多時候都歸功於 K8s。

在開始之前,我們需要基於環境來講解 NGINX ,因為 K8s 太靈活了, NGINX Ingress、Load Balance 等等用法太多,必須要不斷的調整並通過實操進行學習。

第一步,通過一個案例來講解如何從 0 搭建高可用 Wordpress 部落格。Wordpress 是用 PHP 語言編寫,和 MySql 資料庫連通,可以定製化搭建各種型別網站的部落格。環境搭建完成後就可以開始研究網路以及儲存的整個架構。

託管:從 IaaS 到 PaaS

 

在演示之前分享一下我對 K8s 的理解。由於這是一個比較新的技術,很多概念和版本都在變更中,所以會基於我的理解為大家講解,未必會適用於未來。

比如我剛工作的時候還沒有公有云,如果你在大廠可能會有自己的 IDC 機房,但如果你是在一個小公司很多時候伺服器是放在運營商的機房裡,所以需要從頭搭建——作業系統需要自己安裝,儲存、網路、甚至包括長時間不間斷的 UPS 電源等等,這些裝置都需要自己搭建,特別是以前運維和開發分工不明、新應用上線時更加麻煩,準備時長也很長。

後來有了公有云,其以前的名稱叫 IaaS,本次演示也將基於 IaaS 上。那麼 K8s 和 IaaS 的差別在哪裡呢?做 IaaS 的時候我們需要理解作業系統,例如在 Windows 2000 或是在 Linux Server 上操作是不一樣的,甚至 Linux 裡的 CentOS 和 Ubuntu 也有略微的差別。

本次講解將會基於 CentOS 和 Ubuntu 搭建 K8s 系統。如果分散式系統裡宕掉一個機器還需要容災,要監控機器之間的流量,比如針對公網的出入流量、內網之間的 CPU、還有磁碟、RO 等等。

接下來著重介紹 PaaS,以前公有云的 PaaS 是非常不落地的,它本質上是希望開發只需要提交程式碼和資料就可以了。至於服務上如何排程、運維並演化成程序以及程序如何切換都由 PaaS 平臺自主完成,然而以前的 PaaS 平臺做不到這些, K8s 卻可以完成。

 

前端經常會講的 ServerLess/FaaS,這些 function as a service 只是一些概念,本次講解不做展開分析。

 

包括雲原生也是同樣的道理,我們希望開發只關注核心的東西,並不需要分散精力去處理運維工作,不像在用 IaaS 的時候每個公司都要有運維。

在未來雲原生的趨勢下,公司將不再需要運維,因為我們可以把運維的工作交給雲廠商,這也是為什麼這些公有云特別積極的在推 K8s 。

虛擬化技術與容器的差別

 

容器和之前的虛擬化技術有什麼差別呢?比如演示需要用的騰訊雲 CentOS 7.i 系統,我們在這個虛擬機器上面放了很多 K8s 系統。他們之間有什麼差別呢?

其實我以前也是從事虛擬化技術的,在 2012 年加入阿里雲的時候還在用英國劍橋大學的一個開源虛擬化系統 Xen 進行開發,當時底層用的 Linux,基於 Xen 這一層,上面可以有 Windows、Linux 等各種不同版本的虛擬化作業系統。

在 2013 年時,阿里雲從 Xen 切到了 KVM,因為當時認為 KVM 效能提升了很多,但和今天的容器相比較還是天差地別的。

KVM 其實是一種很重的虛擬化,它上面和底層的作業系統之間會消耗很多的效能和記憶體。在虛擬化裡,底層放 Linux 上層放 Windows,或者底層放 Linux 2.6 核心,上層放 Linux 4.9 核心都是可以的。

但容器不一樣,其核心是共用的,這些容器之間只是通過名字空間隔離的技術,也就是 Linux 中的 C-Group 技術來把程序、網路,和磁碟給隔離開。

如果你用了 Docker 就會知道它只是做到了隔離,並不會佔用其他資源。在宿主機上能看到所有 Docker 裡面跑的 Apache、PHP 全都一目瞭然。所以它效能很高,只是簡單隔離了一下網路和 CPU。其中 CPU 就是把時間片隔離了,可以設定只用 25% 的 CPU、單顆CPU等等,並且隔離網路。以上就是 KVM 和容器兩者之間的差別。

然而這個名字空間隔離是極其有限的,比如如果在某個虛擬機器裡改系統時間,物理機的系統時間是不受影響的。而容器就不行了,由於系統時間只有一個,修改一個容器之後所有的容器都會被改掉。

所以名字空間隔離技術其實是很輕且很有限的,像是程序、儲存、網路、系統時間等等這些是沒有辦法進行隔離的。

瞭解 K8s 架構

 

在演示部署之前,需要先了解 K8s 架構裡面有哪些東西。大部分人在學習 K8s 的時候,可能公司運維已經做好了搭建,所以對架構怎麼部署並不用關注。

但在今天的講解中,由於我需要經常調整 K8s 的網路去演示 NGINX 和 K8s 之間的關係,所以必須從頭開始搭建。

K8s 的架構核心是在每一個伺服器上,比如目前我們做搭建的兩臺伺服器,它們都被部署了 Kubelet。 會負責管理容器,所以不能在容器內執行,這需要先安裝 Kubelet。當部署 Kubelet 後就可以管理每臺 Linux 上的容器了,比如 Docker 也是一種容器。

如果不用 Docker 也沒關係,曾有新聞報道表示容器執行時不支援 Docker 了,這其實是一個誤讀。比如我們看圖中的紅線,這代表著作業系統通過驅動去使用硬體。

作業系統和 Container Runtime (容器執行時)中間的黃線是 OCI(Open Container Initiative)它包含了容器映象的標準,也就是當我們 pull 一個映象的時候所需的所有規則,以及容器執行起來的時候怎樣去啟動程序等等,這兩個介面標準都放在 OCI裡。OCI 是很多公司包括 Docker 所使用的一種規範。而 Docker 更多隻適合單機執行,它的叢集非常不好用。

後來 K8s 發展的特別好,因為它的定位從一開始就不是為單機交付進行服務的。K8s 核心的關鍵是在於 Controller Manager 和 Scheduler,並且使用一種宣告式的語言編排。

比如我會先定義清楚前面有 3 個 PHP 的 Wordpress,後面有一個 MySql 是組倍的或是一組多倍的,前面有幾個 Load Balance,中間是讀寫分離或是別的等等,這些東西先定義清楚並且寫在 yaml 檔案中,然後提交給 K8s 由它自己來幫我維護。這就是 k8s 的切入點,是我們能維護上萬臺節點的關鍵所在。

而 Docker Swam 的切入點就差很多了並且很不靈活,所以 K8s 自己設計了一套容器執行時介面(container runtime interface)。

上圖中黃色的線是很多廠商共同定製的 OCI 標準,綠色的線是 K8s 自己的 CI。對 K8s 來說,無論是否適用於 OCI ,只要能支援這條綠色的 CI 介面,就能知道怎麼去拉映象、起容器、怎麼去管理了。所以核心在於把 kubelet 安裝上,其他東西自然就受支援了。


更多資源

想要更及時全面地獲取 NGINX 相關的技術乾貨、互動問答、系列課程、活動資源?

請前往 NGINX 開源社群: