使用 Kubernetes 來部署你的 Laravel 程式

Summer__發表於2019-01-10

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 git@github.com: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 開發者社群 laravel-china.org/topics/2201…

相關文章