使用 Kubernetes 來部署你的 Laravel 程序

file

Laravel 是開發 PHP 應用程序的優秀框架。 不管您是須要構建新想法的原型,開發 MVP(最小可行產品)仍是發佈成熟的企業系統,Laravel 均可以促進全部開發任務和工做流程。php

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

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

Kubernetes 是什麼?爲何使用它?

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

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

將 Laravel 應用部署到 Minikube

正如我以前提到的,我將會在本文展現如何部署一個簡單、無狀態的 Laravel 應用到 Kubernetes。我將詳細說明此過程當中涉及到的步驟,同時向你們解釋爲什麼須要執行某項操做。此外,我還將展現如何快速橫向擴展應用,並使用 Ingress Controller 使其可以經過特定域名或 IP 訪問。docker

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

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

應用

我已經準備了一個簡單的 Laravel 程序,你能夠從 GitHub 克隆下來。它只是一個全新的 Laravel 安裝程序。所以,你可使用本例中的演示程序,也能夠本身建立一個新的 Laravel 程序。若是使用本例中的演示程序,請按照下面的命令將其克隆到項目目錄裏面。windows

cd /to/your/working/directory
git clone git@github.com:learnk8s/laravel-kubernetes-demo.git .
複製代碼

預備條件

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

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…

相關文章
相關標籤/搜索