在雲端環境中佈署應用程式已成為現代軟體開發的趨勢。本文將引導讀者如何在 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
內容解密:
apiVersion和kind定義了 Kubernetes 資源的版本和型別。metadata和spec定義了 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
內容解密:
apiVersion和kind定義了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 叢集時建立的其餘資源。