使用 Kubernetes 來部署你的 Laravel 程序

file

Laravel 是開發 PHP 應用程序的優秀框架。 無論您是需要構建新想法的原型,開發 MVP(最小可行產品)還是發佈成熟的企業系統,Laravel 都可以促進所有開發任務和工作流程。

如何處理部署應用程序是一個很有選擇性的問題。 Vagrant 非常適合搭建類似於遠程服務器的本地環境。 但是,在生產環境中,您很可能需要的不僅僅是一個 Web 主機和一個數據庫。 您可能會針對多個要求提供單獨的服務。 您還需要有適當的機制來確保應用程序始終在線運行,並且服務器可以有效地均衡負載。

在本文中,我將解釋如何在 Kubernetes 上搭建一個簡單的 Laravel 應用程序的環境。

Kubernetes 是什麼?爲什麼使用它?

Kubernetes 是一款由 Google 發起的開源系統,目的在於提高集羣環境下管理容器化應用的效率。有些人將其稱爲容器編排平臺,而 Kubernetes 並非唯一的此類平臺。不過,相比其它對手,其享譽已盛,且知名度仍在不斷提高;更別說你一旦習慣上它,就會發現它真的十分易用。

如果你依然好奇爲何有人能夠愉快地和 Kubernetes 玩耍,答案就是——簡單。Kubernetes 能夠讓部署、管理多個項目所需的大量集羣變得更加容易。

將 Laravel 應用部署到 Minikube

正如我之前提到的,我將會在本文展示如何部署一個簡單、無狀態的 Laravel 應用到 Kubernetes。我將詳細說明此過程中涉及到的步驟,同時向大家解釋爲何需要執行某項操作。此外,我還將展示如何快速橫向擴展應用,並使用 Ingress Controller 使其能夠通過特定域名或 IP 訪問。

你可以在多個雲平臺上面運行 Kubernetes ,例如 Google Cloud Engine 和 Amazon Web Services。在這個例子中,你會使用 Minikube 運行你的程序,Minikube 是一個讓你在本地更容易運行 Kubernetes 的工具。

與 Vagrant 類似,Minikube 僅僅是一個包含了 Kubernetes 運行平臺和 Docker 的虛擬機。如果使用真正的 Kubernetes 的話,你需要使用 Docker 部署你的應用,同時你需要將運行平臺擴展到三個節點。

應用

我已經準備了一個簡單的 Laravel 程序,你可以從 GitHub 克隆下來。它只是一個全新的 Laravel 安裝程序。因此,你可以使用本例中的演示程序,也可以自己創建一個新的 Laravel 程序。如果使用本例中的演示程序,請按照下面的命令將其克隆到項目目錄裏面。

cd /to/your/working/directory
git clone [email protected]:learnk8s/laravel-kubernetes-demo.git .

預備條件

要實現本示例,你需要在你的本地系統中安裝如下軟件:

1) Docker

2) Kubectl

3) Minikube

如果你在Windows系統中安裝上述軟件遇到問題,請查閱 Windows 10 中 Docker 和 Kubernetes 入門教程,這是一個手把手教學的入門教程。

Docker 鏡像

Kubernetes 部署容器化的應用,因此首先你需要爲示例應用創建一個 Dcoker 鏡像。由於本例中你在本地運行 Minikube,因此你只能用示例代碼中的 Dockerfile 文件創建一個本地 Docker 鏡像。

FROM composer:1.6.5 as build 
WORKDIR /app 
COPY . /app 
RUN composer install
FROM php:7.1.8-apache 
EXPOSE 80 
COPY --from=build /app /app 
COPY vhost.conf /etc/apache2/sites-available/000-default.conf 
RUN chown -R www-data:www-data /app \ 
  && a2enmod rewrite

該 Dockerfile 文件由兩部分組成:

  • 第一部分擴展了一個 PHP 的 composer 鏡像,因此你能夠安裝應用依賴。
  • 第二部分創建了一個包含 Apache 服務的鏡像, Apache 服務將會爲示例應用服務。

在測試 Docker 鏡像前,你需要使用如下的命令創建鏡像:

cd /to/your/project/directory 
docker build -t yourname/laravel-kubernetes-demo .

然後使用下面的命令運行示例程序:

docker run -ti \ 
  -p 8080:80 \ 
  -e APP_KEY=base64:cUPmwHx4LXa4Z25HhzFiWCf7TlQmSqnt98pnuiHmzgY= \     
  laravel-kubernetes-demo

示例程序可以通過 http://localhost:8080 訪問。

在這個安裝中,容器是通用的,同時 APP_KEY 並不是寫死或共享的。

在 Minikube 中創建鏡像

cd /to/your/project/directory
eval $(minikube docker-env)
docker build -t yourname/laravel-kubernetes-demo .
別忘記執行上面的 eval 命令。 要在虛擬機中創建鏡像,執行上面的 eval 命令是必須的。你只需要在當前的終端中執行一次這個命令。

部署鏡像

現在示例應用的鏡像已經創建完成,並且在 Minikube 中是可用的,因此你可以接下來繼續部署這個鏡像。

我總是一開始就要確保 kubectl 在正確的上下文環境中。在這個例子中,上下文環境是 Minikube。你可以使用下面的命令快速的切換上下文環境:

kubectl config use-context minikube

然後你可以部署容器鏡像:

kubectl run laravel-kubernetes-demo \   
        --image=yourname/laravel-kubernetes-demo \   
        --port=80 \   
        --image-pull-policy=IfNotPresent \   
        --env=APP_KEY=base64:cUPmwHx4LXa4Z25HhzFiWCf7TlQmSqnt98pnuiHmzgY=

上述的命令告訴 kubectl 從 Docker 鏡像中運行我們的示例程序。上述命令的第一個參數告訴 kubectl 如果在本地存在鏡像,就不要去登記處(例如 Docker Hub)拉取鏡像。請注意,你仍然需要登錄到 Docker 中,因爲這樣 kubectl 才能檢查鏡像是否是最新的。

通過下面的命令,你會看到有一個 Pod 是爲示例程序而創建的:

kubectl get pods

該命令會返回類似如下的輸出:

NAME                                     READY STATUS RESTARTS AGE
laravel-kubernetes-demo-7dbb9d6b48-q54wp 1/1   Running 0       18m

你也可以使用 Minikube 的 GUI 控制面板來監控集羣。GUI 還有助於可視化大多數經常討論的指標。要查看該控制面板,請執行下屬命令:

minikube dashboard

或者獲取控制面板的 URL 地址:

minikube dashboard --url=true

暴露一個服務

到目前爲止,你已經創建了一個運行示例程序容器的部署。在集羣中運行的 Pod 有一個動態的 IP。如果你使用該 IP 並直接把流量路由到那裏,在每次重啓 Pod 的時候,你可能每次都要更新路由表。事實上,在每次部署或者容器重啓的時候,一個新的 IP 會關聯到這個 Pod 中。爲了避免需要手動的管理 IP 地址,你需要使用服務。服務在 Pods 集合中充當負載均衡器的角色。所以,儘管一個 Pod 的 IP 地址改變了,但是服務總是指向該 Pod。同時,由於服務總是擁有一個固定的 IP,因此你不需要手動更新任何東西。

file

你可以使用下面的命令創建一個服務:

kubectl expose deployment laravel-kubernetes-demo --type=NodePort --port=80

倘若一切順利,你會看到一個與下面信息相似的確認信息:

service "laravel-kubernetes-demo" exposed

執行下面的命令:

kubectl get services

上述命令顯示了正在運行中的服務列表。你也可以通過控制面板中的 「服務」 導航菜單查看正在運行中的服務。很顯然,一個更加令人興奮的驗證部署和服務暴露的方法就是在瀏覽器中運行示例程序。 ?

要獲取應用(服務)的URL地址,你可以使用下面的命令:

minikube service --url=true laravel-kubernetes-demo

上述命令會輸出 IP 地址和端口號,例如:

http://192.168.99.101:31399

或者直接在瀏覽器中啓動程序:

minikube service laravel-kubernetes-demo

不想錯過接下來的故事,實驗或者小提示。 如果你欣賞這篇文章,敬請期待接下來更多的文章內容。 希望新的內容直接發到你的郵箱並提升在 Kubernetes 方面的專業技能。  現在請訂閱

擴展

你已經成功在 Kubernetes 中部署了應用。這是令人興奮的。但是做這一切的重點是什麼?你只是在一個 Pod 中做了一個部署,在一個節點上面暴露了網頁服務。讓我們把目前的應用多部署兩個實例。

file

現在你應該明白你正在處於什麼位置,執行下面的命令獲取希望得到的和現在已有的 Pod 列表:

kubectl get deployment
NAME                    DESIRED CURRENT UP-TO-DATE AVAILABLE
AGE laravel-kubernetes-demo 1       1       1          1         57m

上面的輸出中,每一項都是「1」。你希望獲得三個 Pod。因此,我們通過下面的命令進行擴展:

kubectl scale --replicas=3 deployment/laravel-kubernetes-demo deployment "laravel-kubernetes-demo" scaled

命令執行完成。你已經將第一個 Pod 複製另外兩個,系統爲你提供了三個 Pod 來運行這個服務。執行 get deployment 可以檢驗這一切:

kubectl get deployment
NAME                    DESIRED CURRENT UP-TO-DATE AVAILABLE
AGE laravel-kubernetes-demo 3       3       3          3         59m

你也可以在控制面板中的 Pods 頁面或服務頁面查看這些內容。

現在,你正在使用三個 Pod 運行三個應用實例。

想象一下這種場景,你的應用越來越受歡迎。成千上萬的訪客使用你的網頁或軟件。過去,你可能都焦頭爛額在編寫腳本創建更多實例的事情上。但是在 Kubernetes 中,您可以快速擴展出多個實例:

kubectl scale --replicas=10 deployment/laravel-kubernetes-demo deployment "laravel-kubernetes-demo" scaled

你看看使用 Kubernetes 擴展你的網站是何其便捷。

Ingress

你已經實現了不錯的功能,部署了應用並擴展之。當你指向羣集的(Minikube)IP地址和節點的端口號時,你就已經可見瀏覽器中正在運行的程序了。 現在,你將看到如果通過指定的 URL 訪問應用程序,就如同之前部署到雲端那樣。

爲了在 Kubernetes 中使用 URL,你需要一個 Ingress。 Ingress 是一組允許入站連接到達 Kubernetes 集羣的規則。Ingress 是非常必要的,因爲在 Kubernetes 中,諸如 Pod 之類的資源僅具有可在集羣內和集羣內路由的IP地址。也就是說它們是無法進出外部環境的。
file

我在演示應用源碼中包含了一個有如下內容的 ingress.yaml 文件:

apiVersion: extensions/v1beta1 kind: Ingress metadata:   name: laravel-kubernetes-demo-ingress   annotations: ingress.kubernetes.io/rewrite-target: / spec:   backend:     serviceName: default-http-server     servicePort: 80   rules:   - host: laravel-kubernetes.demo   - http:       paths:       - path: /         backend:           serviceName: laravel-kubernetes-demo           servicePort: 80

在你所期望的 Kubernetes 資源文件基本內容裏,該文件定義了一組路由流量入站的規則。 laravel-kubernetes.demo URL 會指向應用運行的 Service ,就像之前在 8181 端口上標記 laravel-kubernetes-demo 那樣。

沒有集成 Ingress 資源, Ingress 控制器是無法使用的,因此您需要創建一個新的控制器或使用現有控制器。 本教程使用的是 Nginx Ingress 控制器來管理路由資源。 Minikube(v0.14及以上版本) 附帶 Nginx 設置作爲插件,您需要手動啓用這個插件:

minikube addons enable ingress
注意,Minikube 可能需要幾分鐘才能下載並安裝 Nginx 作爲 Ingress 路由控制器。

啓用 Ingress 插件後,您可以通過這種方式來創建 Ingress 實例:

kubectl create -f path-to-your-ingress-file.yaml

您可以通過運行以下命令來驗證並獲取 Ingress 的實例信息:

kubectl describe ing laravel-kubernetes-demo-ingress

輸出一些配置相關的信息:

Name: laravel-kubernetes-demo-ingress 
Namespace: default 
Address: 192.168.99.101 
Default backend: default-http-server:80 (<none>) 
Rules:   
  Host Path Backends   
  ---- ---- --------
  *        
       / laravel-kubernetes-demo:8181 (172.17.0.6:8181) 
Annotations:
  rewrite-target: / 
Events: 
Type   Reason Age  From                     Message 
----   ------ ---- ----                     ------- 
Normal CREATE 39s  nginx-ingress-controller Ingress default/laravel-kubernetes-demo-ingress

Normal UPDATE 20s  nginx-ingress-controller Ingress default/laravel-kubernetes-demo-ingress

您現在可以通過 minikube IP地址訪問應用程序,如上所示。 要通過 URL https://laravel-kubernetes.demo 訪問網站應用,您需要在 hosts 文件中添加一條解析記錄。

結論

希望這篇文章能幫助您熟悉 Kubernetes 的部署和搭建。 根據我自己的經驗,如果你經常進行類似的環境搭建,這會讓你的搭建過程更加得心應手且有趣。

轉自 PHP / Laravel 開發者社區 https://laravel-china.org/top...
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章