返回文章列表

Kubernetes叢集佈署WordPress應用程式

本文示範如何在 Amazon Web Services 上佈署 Kubernetes 叢集,並將 WordPress 應用程式佈署至該叢集。文章涵蓋建立 Nginx 叢集、MySQL 與 WordPress Pod,以及使用 Elastic Load Balancer 暴露服務。同時,文章也說明瞭如何建立和使用

Web 開發 容器技術

在雲端環境中佈署應用程式已成為現代軟體開發的趨勢。本文將引導讀者如何在 AWS 上建立 Kubernetes 叢集,並將 WordPress 佈署到此叢集。過程中會使用 Nginx 作為反向代理伺服器,並使用 Elastic Load Balancer 進行負載平衡,確保應用程式的高用性。同時,我們也會利用 EBS 持久化儲存 WordPress 的資料和設定,避免資料遺失。最後,我們將會看到如何透過 Kubernetes 指令操作和管理這些資源,以及如何清理這些資源以節省成本。

在 Amazon Web Services 上佈署 Kubernetes 叢集與 WordPress 應用程式

建立 Nginx 叢集與服務

首先,我們需要在 Kubernetes 叢集中建立一個 Nginx 叢集。執行以下指令以確認 Nginx 叢集控制器(nginxcluster controller)是否已正確註冊五個 Pod:

kubectl get rc

接著,執行以下指令以建立服務並將 Pod 對外暴露:

kubectl expose rc nginxcluster --port=80 --type=LoadBalancer

再次執行 kubectl get services 指令,應該可以看到新建立的服務:

kubectl get services

內容解密:

  • kubectl expose 指令用於將 Replication Controller 管理的 Pod 對外暴露為服務。
  • --port=80 指定服務的連線埠號為 80。
  • --type=LoadBalancer 表示在 AWS 上建立 Elastic Load Balancer。

取得 Elastic Load Balancer 的 URL

由於我們的 Kubernetes 叢集執行在 Amazon Web Services 上,當我們暴露服務時,Kubernetes 會呼叫 AWS API 並啟動一個 Elastic Load Balancer。執行以下指令以取得 Load Balancer 的 URL:

kubectl describe service nginxcluster

內容解密:

  • kubectl describe service 指令用於取得指定服務的詳細資訊。
  • 在輸出結果中,可以找到 Load Balancer 的 URL。

在 AWS 上檢視 Elastic Load Balancer

開啟 AWS 控制檯,可以看到 Kubernetes 建立的 Elastic Load Balancer。

建立 WordPress 應用程式

接下來,我們將佈署 WordPress 應用程式。首先,需要建立兩個 Amazon EBS 卷,用於儲存 MySQL 資料函式庫和 WordPress 檔案。

建立 EBS 卷

執行以下指令兩次,以建立兩個 EBS 卷:

aws ec2 create-volume --availability-zone eu-west-1c --size 10 --volume-type gp2

內容解密:

  • aws ec2 create-volume 指令用於建立 EBS 卷。
  • --availability-zone 指定 EBS 卷的可用區域。
  • --size 指定 EBS 卷的大小。
  • --volume-type 指定 EBS 卷的型別。

建立 MySQL Pod 與服務

建立 MySQL Pod 的定義檔案 mysql.yaml,並在其中加入一個 EBS 卷的 ID:

apiVersion: v1
kind: Pod
metadata:
  name: mysql
  labels:
    name: mysql
spec:
  containers:
  - resources:
    image: russmckendrick/mariadb
    name: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: yourpassword
    ports:
    - containerPort: 3306
      name: mysql
    volumeMounts:
    - name: mysql-persistent-storage
      mountPath: /var/lib/mysql
  volumes:
  - name: mysql-persistent-storage
    awsElasticBlockStore:
      volumeID: <insert your volume id here>
      fsType: ext4

執行以下指令以建立 MySQL Pod:

kubectl create -f mysql.yaml

內容解密:

  • apiVersionkind 定義了 Kubernetes 資源的版本和型別。
  • metadataspec 定義了 Pod 的中繼資料和規格。
  • containers 定義了 Pod 中的容器。
  • volumes 定義了 Pod 中的持久儲存卷。

建立 WordPress Pod

建立 WordPress Pod 的定義檔案 wordpress.yaml,並在其中加入另一個 EBS 卷的 ID:

apiVersion: v1
kind: Pod
metadata:
  name: wordpress
  labels:
    name: wordpress
spec:
  containers:
  - image: wordpress
    name: wordpress
    env:
    - name: WORDPRESS_DB_PASSWORD
      value: yourpassword
    ports:
    - containerPort: 80
      name: wordpress
    volumeMounts:
    - name: wordpress-persistent-storage
      mountPath: /var/www/html
  volumes:
  - name: wordpress-persistent-storage
    awsElasticBlockStore:
      volumeID: <insert your volume id here>
      fsType: ext4

執行以下指令以建立 WordPress Pod:

kubectl create -f wordpress.yaml

內容解密:

  • WordPress Pod 的定義與 MySQL Pod 類別似,但使用了不同的映像檔和環境變數。

圖表翻譯:Kubernetes 叢集架構圖

圖表翻譯: 此圖表展示了 Kubernetes 叢集的架構,包括 Nginx 叢集、MySQL Pod、WordPress Pod,以及它們所使用的 Elastic Load Balancer 和 EBS 卷。Kubernetes 叢集管理著這些元件,並確保它們能夠協同工作。

第7章:探討Kubernetes排程器

佈署WordPress應用程式

在前面的章節中,我們已經學習瞭如何佈署和管理Kubernetes叢集。現在,讓我們來佈署一個WordPress應用程式,以展示Kubernetes的實際應用。

首先,我們需要建立一個Pod來執行WordPress容器。建立一個名為wordpress.yaml的檔案,內容如下:

apiVersion: v1
kind: Pod
metadata:
  name: wordpress
spec:
  containers:
  - name: wordpress
    image: wordpress:latest
    ports:
    - containerPort: 80

內容解密:

  • apiVersionkind定義了Kubernetes資源的版本和型別。
  • metadata包含了Pod的名稱和其他後設資料。
  • spec定義了Pod的規格,包括容器的名稱、映像和埠。

接下來,使用以下命令建立Pod:

kubectl create -f wordpress.yaml

然後,等待Pod啟動,並檢查容器的日誌:

kubectl logs wordpress

佈署WordPress服務

現在,我們需要建立一個服務來暴露WordPress Pod。建立一個名為wordpress-service.yaml的檔案,內容如下:

apiVersion: v1
kind: Service
metadata:
  name: wpfrontend
spec:
  selector:
    name: wordpress
  ports:
  - port: 80
    targetPort: 80
  type: LoadBalancer

內容解密:

  • spec定義了服務的規格,包括選擇器、埠和型別。
  • selector指定了服務要選擇的Pod。
  • type設定為LoadBalancer,以便在AWS上建立一個Elastic Load Balancer。

使用以下命令建立服務:

kubectl create -f wordpress-service.yaml

然後,檢查服務的狀態和Elastic Load Balancer的詳細資訊:

kubectl get services
kubectl describe service wpfrontend

測試WordPress應用程式

現在,您應該能夠透過Elastic Load Balancer的URL存取WordPress安裝頁面。完成安裝後,登入並上傳一張圖片到“Hello World”文章中。

接下來,讓我們刪除WordPress Pod並重新建立它,以驗證資料是否仍然存在:

kubectl delete pod wordpress
kubectl create -f wordpress.yaml

檢查容器的ID,以確保它已經改變:

kubectl describe pod wordpress | grep "Container ID"

存取WordPress網站,您應該會看到一切都保持不變。

清理資源

完成測試後,讓我們刪除WordPress Pod和服務:

kubectl delete pod wordpress
kubectl delete pod mysql
kubectl delete service wpfrontend
kubectl delete service mysql

Kubernetes支援工具

現在,讓我們來看看一些隨著Kubernetes叢集佈署的支援工具。

Kubernetes儀錶板

首先,開啟Kubernetes儀錶板的URL,並使用使用者名稱和密碼登入。然後,您可以使用UI佈署NGINX Cluster應用程式。

Grafana

接下來,開啟Grafana的URL,並檢視叢集統計資訊。Grafana從InfluxDB Pod取得資料,因此您可以檢視每個Pod的指標。

ELK堆積疊

最後,讓我們看看ELK堆積疊,它由Elasticsearch、Logstash和Kibana組成。ELK堆積疊是一個強大的中央日誌記錄平台。

開啟Kibana的URL,並組態索引模式。然後,您可以檢視所有傳送到Elasticsearch的日誌資料。

探討 Kubernetes 與 Amazon EC2 Container Service(ECS)

在前面的章節中,我們已經探討了 Kubernetes 的基本架構、佈署和管理。在本章中,我們將進一步討論 Kubernetes 的相關工具,並介紹 Amazon 的容器管理服務——Amazon EC2 Container Service(ECS)。

Kubernetes 相關工具與清理

Kubernetes 提供了多種工具來幫助管理和監控叢集。一些重要的工具包括 Kubernetes、Heapster、KubeDNS 和 InfluxDB。這些工具主要作為 API 端點存在,用於內部管理和排程。

當我們完成 Kubernetes 叢集的測試後,需要清理相關資源以避免不必要的費用。首先,我們需要銷毀叢集。為此,我們需要重新進入當初佈署 Kubernetes 叢集時的組態狀態,執行以下命令:

export KUBE_AWS_ZONE=eu-west-1c
export AWS_S3_REGION=eu-west-1
export NUM_NODES=2
export KUBERNETES_PROVIDER=aws

接著,在相同的目錄下執行以下命令來銷毀叢集:

./kubernetes/cluster/kube-down.sh

內容解密:

此命令會連線到 AWS API 並開始拆除所有與 Kubernetes 叢集相關的例項、組態和其他資源。此過程需要幾分鐘,請勿中斷,否則可能會留下仍在執行的資源,從而產生額外費用。

完成叢集銷毀後,建議登入 AWS 控制檯,手動刪除未附著的 EBS 卷和標有 Kubernetes 的 S3 儲存桶,以避免持續產生費用。

Kubernetes 的優勢與彈性

Kubernetes 自首次公開發布以來已經有了顯著的成熟度。它提供了強大的容器排程功能,並且不依賴於特定的雲端服務提供商,可以輕鬆佈署在 AWS、Google Cloud Platform 或本地虛擬伺服器上。

Kubernetes 能夠適應不同平台的技術需求,例如持久化儲存。它已經成為一個統一的平台,得到了 Google、Microsoft 和 Red Hat 等多家廠商的支援。

Amazon EC2 Container Service(ECS)簡介

Amazon EC2 Container Service(ECS)是 Amazon 提供的一種高度可擴充套件、高效能的容器管理服務,支援 Docker 容器。使用 ECS,您可以在一組受管理的 Amazon EC2 例項上輕鬆執行應用程式。

ECS 無需您自行安裝、操作和擴充套件叢集管理基礎設施。透過簡單的 API 呼叫,您可以啟動和停止 Docker 應用程式,查詢叢集的完整狀態,並使用許多熟悉的功能,如安全組、彈性負載平衡、EBS 卷和 IAM 角色。

在 AWS 控制檯中啟動 ECS

要啟動 ECS 叢集,首先登入 AWS 控制檯,選擇所需的區域,然後點選 EC2 Container Service 連結。

首次啟動 ECS 時,會看到服務的概述影片。點選「Get started」進入嚮導,幫助您啟動第一個叢集。

首先,您需要建立一個任務定義(Task Definition),類別似於 Docker Compose 檔案。在這裡,您將定義要執行的容器映像及其允許消耗的資源(如 RAM 和 CPU),並對映主機到容器的埠。

使用 Plantuml 圖表呈現 ECS 架構

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Kubernetes叢集佈署WordPress應用程式

package "Kubernetes Cluster" {
    package "Control Plane" {
        component [API Server] as api
        component [Controller Manager] as cm
        component [Scheduler] as sched
        database [etcd] as etcd
    }

    package "Worker Nodes" {
        component [Kubelet] as kubelet
        component [Kube-proxy] as proxy
        package "Pods" {
            component [Container 1] as c1
            component [Container 2] as c2
        }
    }
}

api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2

note right of api
  核心 API 入口
  所有操作經由此處
end note

@enduml

圖表翻譯: 此圖示呈現了使用者請求如何透過 Elastic Load Balancer 分發到 ECS 叢集中的 Docker 容器,並最終存取資料儲存的過程。

建立與管理 Amazon ECS 叢集

現在我們已經定義了服務,接下來需要一個位置來啟動它。這就是 EC2 例項發揮作用的地方,同時也是您仍然需要付費的地方。雖然 Amazon EC2 Container Service 的設定是免費的,但您仍需要為提供叢集計算資源付費。這些費用將是您的標準 EC2 例項費用。請按照以下截圖填寫詳細資訊,然後點選「Review & launch」:

檢查組態與啟動例項

在啟動任何東西之前,您將有機會仔細檢查 AWS 帳戶中的所有組態。這是您最後一次離開啟動 ECS 叢集的機會。如果您對所有組態都滿意,請點選「Launch instance & run service」按鈕:

啟動過程概述

現在您將看到正在發生的事情的概述。通常,這將需要大約 10 分鐘來完成這些任務。在背景中,它正在執行以下操作:

  • 建立一個存取 ECS 服務的 IAM 角色
  • 為您的叢集建立 VPC
  • 建立一個啟動組態,以執行具有 ECS IAM 角色的 Amazon ECS 最佳化 Amazon Linux AMI
  • 將新建立的啟動組態附加到自動擴充套件組,並根據您定義的例項數量進行組態
  • 在控制檯中建立 ECS 叢集、任務和服務
  • 等待由自動擴充套件組啟動的 EC2 例項啟動並向 ECS 服務註冊
  • 在新建立的 ECS 叢集上執行服務
  • 建立彈性負載平衡器並將您的服務註冊到它

您可以在 AWS Marketplace 頁面上找到有關 Amazon ECS 最佳化 Amazon Linux AMI 的更多資訊:https://aws.amazon.com/marketplace/pp/B00U6QTYI2/ref=srh_res_product_title?ie=UTF8&sr=0-2&qid=1460291696921。

這個映像檔是 Amazon Linux 的精簡版本,僅執行在 Docker 上。

建立自定義任務與服務

一旦一切完成,您將獲得存取新建立的服務的選項。您應該會看到類別似於以下截圖的內容: 如您所見,我們有三個正在執行的任務和一個負載平衡器。

現在讓我們建立自己的任務和服務。從前面的服務檢視中,點選「Update」按鈕並將所需的計數從三更改為零,這將停止任務並允許我們刪除服務。要執行此操作,請點選「default」按鈕以轉到叢集檢視,然後刪除服務。

現在樣本 Web 應用程式服務已被刪除,請點選「Task Definitions」按鈕,然後點選「Create new task definition」按鈕。在開啟的頁面上,點選「Add container」按鈕並填寫以下詳細資訊:

  • 容器名稱:cluster
  • 影像:russmckendrick/cluster
  • 最大記憶體(MB):32
  • 埠對映:80(主機埠)80(容器埠)tcp(協定)

程式碼範例:

version: '3'
services:
  cluster:
    image: russmckendrick/cluster
    ports:
      - "80:80"
    deploy:
      resources:
        limits:
          memory: 32M

內容解密:

此 Docker Compose 組態檔案定義了一個名為 cluster 的服務,該服務使用 russmckendrick/cluster 映象,將主機的 80 埠對映到容器的 80 埠,並限制容器的最大記憶體使用量為 32MB。

其他所有內容都可以保留預設值。

組態任務定義與服務

填寫完畢後,點選「Add」按鈕。這將帶您回到「Create a Task Definition」螢幕,請填寫任務定義名稱,讓我們稱之為 our-awesome-cluster,然後點選「Create」按鈕:

現在我們已經定義了新的任務,接下來需要建立一個服務來附加它。點選「Clusters」選項卡,然後點選預設叢集,您應該會看到類別似於下圖的內容: 點選「Services」選項卡中的「Create」按鈕。在此螢幕上,填寫以下資訊:

  • 任務定義:our-awesome-cluster:1
  • 叢集:default
  • 服務名稱:Our-Awesome-Cluster
  • 任務數量:3
  • 最小健康百分比:50
  • 最大百分比:200

組態彈性負載平衡器

此外,在「Optional configurations」部分中,點選「Configure ELB」按鈕並使用最初為樣本 Web 應用程式服務組態的彈性負載平衡器:

填寫完資訊後,點選「Create Service」按鈕。如果一切順利,您應該會看到類別似於以下頁面:

檢視服務與負載平衡器

點選「View Service」將為您提供與我們首次看到的樣本 Webapp 服務類別似的概述:

剩下的就是點選「Load Balancer Name」以轉到 ELB 概述頁面;從這裡,您將能夠取得 ELB 的 URL,將其放入瀏覽器中應該會顯示我們的叢集應用程式: 多重新整理幾次,您應該會看到容器的主機名發生變化,表明我們正在不同的容器之間進行負載平衡。

終止叢集

現在,讓我們終止我們的叢集。要執行此操作,請轉到 AWS 控制檯頂部的「Services」選單中的 EC2 服務。 從這裡,向下滾動到左側選單底部的「Auto Scaling Groups」。從這裡,刪除自動擴充套件組,然後刪除啟動組態。這將終止構成我們的 ECS 叢集的三個 EC2 例項。

例項終止後,點選「Load Balancer」並終止彈性負載平衡器。 最後,傳回 EC2 Container Service 並透過點選「x」刪除預設叢集。這將刪除我們啟動 ECS 叢集時建立的其餘資源。