在現代軟體開發中,微服務架構已成為主流,而 Kubernetes 則成為容器協調的首選平臺。本文將深入探討如何利用 Azure Kubernetes Service (AKS) 佈署和管理微服務應用程式,並結合 Azure CLI、kubectl 和 Terraform 等工具,簡化佈署流程並提升效率。首先,我們會逐步說明如何建立 AKS 叢集、連線叢集以及佈署應用程式。接著,會介紹如何使用 Azure CLI 管理 Azure 資源,以及使用 kubectl 管理 Kubernetes 物件。最後,我們將探討如何使用 Terraform 以基礎設施即程式碼 (IaC) 的方式自動化基礎設施的建立和管理,包含容器登入和 Kubernetes 叢集的建立。
graph LR A[開始] --> B[建立Kubernetes叢集] B --> C[組態叢集詳細訊息] C --> D[選擇資源組和叢集名稱] D --> E[選擇位置] E --> F[搜尋Kubernetes] F --> G[點選建立]
上述 Mermaid 圖表展示了建立 Azure 中受管 Kubernetes 叢集的步驟。首先,我們啟動建立過程,然後組態叢集詳細訊息,包括選擇資源組和叢集名稱,以及選擇位置。接下來,我們搜尋「Kubernetes」,然後點選「建立」按鈕以啟動叢集建立過程。
連線到 Kubernetes 叢集
現在,我們需要檢視叢集的連線詳細資訊。在叢集的概覽頁面中,點選「連線」按鈕,如圖 6.14 所示。這將彈出一個右側的區塊,顯示您需要在本地電腦上執行的 Azure CLI 命令,以下載 Azure 認證並將 kubectl 連線到您的新叢集。
為了連線到叢集,您需要安裝 Azure CLI 工具。安裝完成後,您可以使用 Azure CLI 命令來下載 Azure 認證並設定 kubectl。
以下是連線到叢集的步驟:
- 安裝 Azure CLI 工具:在您的電腦上安裝 Azure CLI 工具,以便執行 Azure CLI 命令。
- 下載 Azure 認證:使用 Azure CLI 命令下載 Azure 認證,以便 kubectl 可以連線到您的叢集。
- 設定 kubectl:使用 Azure CLI 命令設定 kubectl,以便它可以連線到您的叢集。
圖 6.14:查詢新 Kubernetes 叢集的連線詳細資訊
如圖 6.14 所示,點選「連線」按鈕後,將彈出一個右側的區塊,顯示您需要執行的 Azure CLI 命令,以連線到您的叢集。
- 安裝 Azure CLI 工具:
az login
和az account set --subscription <subscription_id>
- 下載 Azure 認證:
az aks get-credentials --resource-group <resource_group> --name <cluster_name>
- 設定 kubectl:
kubectl config use-context <cluster_name>
flowchart TD A[安裝 Azure CLI 工具] --> B[下載 Azure 認證] B --> C[設定 kubectl] C --> D[連線到叢集]
在這個流程圖中,我們可以看到連線到叢集的步驟:安裝 Azure CLI 工具、下載 Azure 認證、設定 kubectl,最後連線到叢集。
使用 Azure CLI 進行 Kubernetes 佈署
Azure CLI 是一個強大的工具,讓我們可以輕鬆地管理 Azure 資源,包括 Kubernetes 叢集。在本文中,我們將學習如何使用 Azure CLI 來佈署我們的微服務到雲端叢集。
安裝 Azure CLI
首先,我們需要安裝 Azure CLI。您可以根據自己的平臺選擇合適的安裝方法。安裝完成後,您可以在終端機中執行 az --version
來驗證安裝是否成功。
驗證 Azure CLI
在使用 Azure CLI 之前,我們需要驗證它以確保它可以存取我們的 Azure 帳戶。您可以執行 az login
來啟動驗證程式。驗證完成後,您可以使用 az account show
來檢視目前的預設訂閱。
連線 kubectl 到 Kubernetes 叢集
現在,我們需要連線 kubectl 到我們的雲端 Kubernetes 叢集。您可以使用 az aks get-credentials
來下載憑證並連線 kubectl 到您的叢集。請注意,您需要替換 <resource-group>
和 <cluster>
為您自己的資源群組和叢集名稱。
佈署到生產叢集
在連線 kubectl 到您的叢集後,您可以開始佈署您的微服務到生產叢集。首先,您需要釋出您的映像到容器登入中心。您可以使用 docker build
來建立您的映像,並使用 docker push
來釋出它到您的容器登入中心。
測試連線
最後,您可以使用 kubectl get pods
來測試您的連線是否正常。您也可以使用 kubectl config get-contexts
來檢視所有可用的連線內容,並使用 kubectl config use-context
來切換不同的連線內容。
az login
:用於驗證 Azure CLI 的命令。az account show
:用於檢視目前的預設訂閱的命令。az aks get-credentials
:用於下載憑證並連線 kubectl 到您的叢集的命令。docker build
:用於建立您的映像的命令。docker push
:用於釋出您的映像到容器登入中心的命令。kubectl get pods
:用於檢視所有正在執行的 pod 的命令。kubectl config get-contexts
:用於檢視所有可用的連線內容的命令。kubectl config use-context
:用於切換不同的連線內容的命令。
graph LR A[安裝 Azure CLI] --> B[驗證 Azure CLI] B --> C[連線 kubectl 到 Kubernetes 叢集] C --> D[佈署到生產叢集] D --> E[測試連線]
在這個流程圖中,我們可以看到從安裝 Azure CLI 到測試連線的整個過程。每一步驟都很重要,確保我們可以順暢地佈署我們的微服務到雲端叢集。
將映像檔標記並釋出到容器登入
在將映像檔釋出到容器登入之前,我們需要根據容器登入的名稱對映像檔進行標記。您需要在命令中插入容器登入的URL:
docker tag video-streaming:1 <registry-url>/video-streaming:1
隨著我們構建和釋出微服務的新版本,別忘了增加版本號。下一個版本的映像檔將被標記為video-streaming:2
,然後是video-streaming:3
,依此類別推。
在釋出映像檔之前,我們需要登入到容器登入。您只需要插入容器登入的URL,執行命令,然後輸入您的使用者名稱和密碼:
docker login <registry-url>
現在,我們可以使用以下命令釋出映像檔:
docker push <registry-url>/video-streaming:1
當docker push
成功時,我們已經釋出了微服務,它已經準備好佈署到Kubernetes。
將容器登入連線到Kubernetes叢集
在佈署微服務之前,我們需要做的一件事是將容器登入連線到Kubernetes叢集,以便叢集可以在不需要驗證的情況下從登入中提取映像檔。這簡化了設定過程。
以下是用於將容器登入連線到Kubernetes叢集的命令:
az aks update --resource-group bmdk1 --name bmdk1 --attach-acr bmdk1
您需要插入您自己的叢集、資源群組和容器登入的名稱。以下是命令的一般格式:
az aks update --resource-group <resource-group> --name <cluster> --attach-acr <registry>
佈署到生產叢集
如果我們連線容器登入和Kubernetes叢集,它會使事情變得更容易,因為我們不需要在Kubernetes佈署組態中編碼登入驗證憑據。這是安全地簡化佈署設定的一種方法。
注意,如果您不連線容器登入到叢集,則叢集將無法從容器登入中提取微服務的映像檔。您也可以透過其他方式使其生效,但這樣更複雜且不必要。
建立佈署組態
Kubernetes佈署組態檔案(例如deploy.yaml
)會為微服務建立佈署、Pod和服務。它幾乎與我們早先用於佈署到本地Kubernetes例項的組態檔案相同。不同之處在於映像檔被參照在容器登入中。
以下是組態檔案的範例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: video-streaming
spec:
replicas: 1
selector:
matchLabels:
app: video-streaming
template:
metadata:
labels:
app: video-streaming
spec:
containers:
- name: video-streaming
imagePullPolicy: IfNotPresent
env:
- name: PORT
value: "4000"
---
apiVersion: v1
kind: Service
metadata:
name: video-streaming
spec:
selector:
app: video-streaming
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 4000
注意,映像檔被參照在容器登入中,您需要更新此URL以匹配您自己的容器登入。另外,映像檔提取策略設定為IfNotPresent
,這意味著如果映像檔不存在於叢集中,它將從容器登入中提取。新的版本也將被提取,但如果我們嘗試再次佈署現有的版本,則將使用本地快取的映像檔,而不需要再次從容器登入中提取。
服務型別設定為LoadBalancer
,這將導致Azure建立一個負載平衡器並分配一個IP地址,以便我們可以從外部世界存取微服務。
佈署微服務到 Kubernetes
現在我們的映像檔已經釋出,容器登入函式庫已經連線到我們的叢集,並且我們的設定檔已經準備好了。讓我們佈署我們的視訊串流微服務到 Kubernetes。
首先,我們需要設定服務型別為 LoadBalancer,這樣就可以建立一個 Azure 負載平衡器,使得我們的微服務可以被外部存取。但是,我們需要小心,因為這意味著任何人都可以存取我們的微服務,而不需要進行身份驗證。
佈署到生產叢集
佈署到雲端叢集和佈署到本地 Kubernetes 例項沒有什麼不同。只需要執行以下命令:
cd chapter-6/example-2
kubectl apply -f scripts/deploy.yaml
這裡,-f
引數選擇了指定的設定檔,該檔案定義了我們想要在叢集中建立的物件。
佈署完成後,我們可以執行以下命令來檢查我們剛剛建立的物件:
kubectl get pods
kubectl get deployments
kubectl get services
這些命令將顯示我們建立了一個佈署、一個 pod 和一個服務,分別對應於我們的視訊串流微服務。
測試已經佈署的微服務
雖然我們的微服務已經佈署好了,但我們仍然需要測試它是否正常工作。為了做到這一點,我們需要找到外部 IP 地址。可以透過執行以下命令來找到外部 IP 地址:
kubectl get services
這個命令將顯示外部 IP 地址,如下所示:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP
video-streaming LoadBalancer 10.0.221.252 20.127.176.147 80:32545/TCP
從輸出中,我們可以看到外部 IP 地址是 20.127.176.147
。然後,我們可以使用這個 IP 地址來測試我們的微服務。
刪除佈署
當我們完成測試後,我們可以刪除佈署以清理叢集。只需要執行以下命令:
kubectl delete -f scripts/deploy.yaml
這個命令將刪除我們建立的佈署和相關的物件。
graph LR A[映像檔釋出] --> B[容器登入函式庫連線] B --> C[設定檔準備] C --> D[佈署到 Kubernetes] D --> E[測試微服務] E --> F[刪除佈署]
這個圖表顯示了從映像檔釋出到刪除佈署的整個過程。每一步驟都對應於上述的一個命令或動作。
Kubernetes 叢集管理
在上一節中,我們已經佈署了 FlixTube 應用程式到 Kubernetes 叢集中。現在,我們來看看如何管理和維護這個叢集。
列出服務
首先,我們可以使用 kubectl get services
命令來列出叢集中的所有服務。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 17h
metadata ClusterIP 10.0.218.226 <none> 80/TCP 17h
rabbit ClusterIP 10.0.185.74 <none> 5672/TCP 17h
video-streaming ClusterIP 10.0.230.53 <none> 80/TCP 17h
video-upload ClusterIP 10.0.244.47 <none> 80/TCP 17h
外部 IP 地址
要找到外部 IP 地址,我們可以使用 kubectl get services
命令,並查詢 EXTERNAL-IP
欄位。
刪除佈署
如果我們想要刪除佈署,可以使用 kubectl delete
命令。例如,要刪除 metadata
服務,可以使用以下命令:
kubectl delete service metadata
這將刪除服務、佈署和 pod。
刪除 Kubernetes 叢集
如果我們想要刪除整個 Kubernetes 叢集,可以使用 Azure CLI 工具。首先,開啟 Azure 入口網站,找到叢集的頁面,然後點選「刪除」按鈕。
kubectl get services
命令用於列出叢集中的所有服務。kubectl delete
命令用於刪除佈署、服務和 pod。- Azure CLI 工具用於建立和組態 Azure 雲端資源。
graph LR A[kubectl get services] --> B[列出服務] B --> C[找到外部 IP 地址] C --> D[kubectl delete] D --> E[刪除佈署] E --> F[刪除 Kubernetes 叢集] F --> G[Azure CLI 工具]
在這個圖表中,我們可以看到如何使用 kubectl get services
命令來列出服務,然後找到外部 IP 地址。接下來,我們可以使用 kubectl delete
命令來刪除佈署、服務和 pod。最後,我們可以使用 Azure CLI 工具來刪除整個 Kubernetes 叢集。
Kubectl 命令回顧
Kubectl 是一款命令列工具,讓我們可以與 Kubernetes 叢集進行互動,以佈署和管理微服務。之前,我們使用它將視訊串流微服務佈署到本地的 Kubernetes 例項,然後佈署到 Azure 上的雲端管理型 Kubernetes 叢集。下表(表 6.3)回顧了 kubectl 的相關命令。
Kubectl 命令列表
命令 | 描述 |
---|---|
kubectl version | 顯示 Kubernetes 客戶端和伺服器的版本號碼 |
kubectl config current-context | 顯示您目前連線的 Kubernetes 叢集 |
kubectl config use-context | 切換到不同的 Kubernetes 叢集 |
Azure CLI 命令回顧
在使用 kubectl 之前,我們也使用了 Azure CLI 來管理 Azure 資源。下表(表 6.2)回顧了 Azure CLI 的相關命令。
Azure CLI 命令列表
命令 | 描述 |
---|---|
az --version | 顯示 Azure CLI 工具的版本號碼 |
az login | 登入您的 Azure 帳戶並連線 Azure CLI 工具 |
az account show | 顯示您目前使用的 Azure 帳戶 |
az account list | 列出所有您已設定的 Azure 帳戶 |
az account set --subscription=<id> | 設定您目前使用的 Azure 帳戶 |
az aks get-credentials --resource-group <resource-group> --name <cluster> | 下載認證並連線 kubectl 到您的 Kubernetes 叢集 |
az aks update --name <cluster> --resource-group <resource-group> --attach-acr <registry> | 將您的容器登入附加到您的 Kubernetes 叢集 |
graph LR A[使用者] -->|執行 az login|> B[Azure 帳戶] B -->|執行 az account show|> C[目前使用的 Azure 帳戶] C -->|執行 az account list|> D[所有設定的 Azure 帳戶] D -->|執行 az account set|> E[設定目前使用的 Azure 帳戶] E -->|執行 az aks get-credentials|> F[Kubernetes 叢集] F -->|執行 az aks update|> G[附加容器登入]
此圖表顯示了使用 Azure CLI 和 kubectl 的流程,從登入 Azure 帳戶到附加容器登入到 Kubernetes 叢集。
Kubernetes 環境設定與管理
Kubernetes 是一個容器協調平臺,已成為行業標準用於執行微服務。一個 Kubernetes 叢集由節點(虛擬機器)、Pod 和容器組成。Pod 是 Kubernetes 的計算單元,可以包含多個容器。Kubernetes 佈署負責維持 Pod 的執行,如果 Pod 當機或無回應,佈署將自動用新例項替換它。
Kubernetes 基本命令
kubectl config use-context <cluster-name>
:連線到已經組態的 Kubernetes 叢集。kubectl config get-contexts
:顯示所有已經組態的連線。kubectl apply -f <file>
:應用 Kubernetes 組態檔案(YAML)到叢集,建立請求的物件。kubectl delete -f <file>
:刪除組態檔案中指定的所有物件。
生產環境設定
早期將應用程式佈署到生產環境是個好主意,因為這樣可以讓客戶盡早看到應用程式並提供反饋。此外,在應用程式仍然小的時候佈署到生產環境更容易。
Kubernetes 物件
- Pod:Kubernetes 的計算單元,可以包含多個容器。
- Deployment:負責維持 Pod 的執行狀態。
- Service:建立 DNS 記錄以在叢集內暴露微服務,並可選擇使其對外界可存取。
使用 kubectl 進行佈署
kubectl 是 Kubernetes 的命令列工具,用於與 Kubernetes 互動和建立佈署。可以使用 kubectl apply
命令建立佈署,指定 YAML 組態檔案。
Azure 管理的 Kubernetes 叢集
建立管理的 Kubernetes 叢集透過 Azure 入口網站 UI 比在自己的硬體上設定 Kubernetes 簡單得多。可以使用 Azure CLI 工具連線容器登記處和 Kubernetes 叢集,實作叢集預先驗證以從容器登記處提取映像。
基礎設施即程式碼
基礎設施即程式碼(IaC)是一種技術,用於自動化基礎設施的建立。透過編寫程式碼並在本地電腦上執行它來建立基礎設施。這種方法可以提高效率和可靠性。
Mermaid 圖表:Kubernetes 基本架構
graph LR A[Kubernetes Cluster] -->|包含|> B[Node] B -->|執行|> C[Pod] C -->|包含|> D[Container] A -->|管理|> E[Deployment] E -->|維持|> C A -->|提供|> F[Service] F -->|暴露|> C
此圖表展示了 Kubernetes 的基本架構。Kubernetes 叢集包含多個節點,節點執行 Pod,Pod 包含容器。Kubernetes 佈署負責維持 Pod 的執行狀態,而服務則提供了一種方式來暴露 Pod 內的容器給叢集內或外界。
建立生產基礎設施
在本章中,我們將探討如何使用基礎設施即程式碼(Infrastructure as Code, IaC)來建立生產基礎設施。基礎設施即程式碼是一種使用程式碼來定義和管理基礎設施的方法,可以幫助我們自動化基礎設施的建立和管理。
使用Terraform建立基礎設施
Terraform是一種流行的基礎設施即程式碼工具,允許我們使用程式碼來定義和建立基礎設施。它支援多種雲端平臺,包括AWS、Azure和Google Cloud Platform。
下載Terraform程式碼
要開始使用Terraform,您需要下載Terraform程式碼。您可以使用Git下載程式碼:
git clone https://github.com/terraform-aws-modules/terraform-aws-ec2-instance.git
建立基礎設施
使用Terraform建立基礎設施的過程如下:
- 安裝Terraform:您需要在您的電腦上安裝Terraform。
- 建立Terraform設定檔:您需要建立一個Terraform設定檔(
main.tf
)來定義您的基礎設施。 - 執行Terraform:您需要執行Terraform命令來建立您的基礎設施。
基礎設施即程式碼
基礎設施即程式碼是一種使用程式碼來定義和管理基礎設施的方法。它允許我們自動化基礎設施的建立和管理,並且可以幫助我們提高基礎設施的可靠性和安全性。
建立Kubernetes叢集
Kubernetes是一種容器協調系統,允許我們自動化容器的佈署和管理。使用Terraform建立Kubernetes叢集的過程如下:
- 建立Kubernetes設定檔:您需要建立一個Kubernetes設定檔(
kubernetes.tf
)來定義您的Kubernetes叢集。 - 執行Terraform:您需要執行Terraform命令來建立您的Kubernetes叢集。
Mermaid圖表
graph LR A[開發電腦] -->|執行Terraform|> B[Terraform] B -->|建立基礎設施|> C[雲端基礎設施] C -->|建立Kubernetes叢集|> D[Kubernetes叢集]
此圖表展示了使用Terraform建立基礎設施和Kubernetes叢集的過程。開發電腦執行Terraform命令,Terraform建立基礎設施,然後基礎設施建立Kubernetes叢集。
使用 Terraform 建立基礎設施
在本章中,我們將使用 Terraform 指令碼建立微服務應用程式的基礎設施。Terraform 是一個基礎設施即程式碼(Infrastructure as Code, IaC)工具,允許我們使用程式碼定義和管理基礎設施。
建立容器登記處
首先,我們需要建立一個容器登記處(Container Registry),用於儲存和管理我們的容器映像。這可以使用 Azure Container Registry(ACR)實作。
# 建立 Azure Container Registry
resource "azurerm_container_registry" "example" {
name = "exampleregistry"
resource_group_name = azurerm_resource_group.example.name
location = azurerm_resource_group.example.location
sku = "Basic"
}
建立 Kubernetes 叢集
接下來,我們需要建立一個 Kubernetes 叢集,用於佈署和管理我們的微服務應用程式。這可以使用 Azure Kubernetes Service(AKS)實作。
# 建立 Azure Kubernetes Service 叢集
resource "azurerm_kubernetes_cluster" "example" {
name = "examplecluster"
resource_group_name = azurerm_resource_group.example.name
location = azurerm_resource_group.example.location
dns_prefix = "example"
# 建立叢集的節點
default_node_pool {
name = "default"
node_count = 1
vm_size = "Standard_DS2_v2"
}
}
執行 Terraform 指令碼
在第 7 章的結尾,我們將使用 Terraform 指令碼建立一個 Kubernetes 叢集。這個過程涉及執行 Terraform 指令碼,建立基礎設施,並佈署微服務應用程式。
azurerm_container_registry
資源用於建立 Azure Container Registry。azurerm_kubernetes_cluster
資源用於建立 Azure Kubernetes Service 叢集。default_node_pool
區塊用於定義叢集的節點。
flowchart TD A[建立 Azure Container Registry] --> B[建立 Azure Kubernetes Service 叢集] B --> C[執行 Terraform 指令碼] C --> D[建立基礎設施] D --> E[佈署微服務應用程式]
在這個流程圖中,我們可以看到建立基礎設施的步驟,從建立 Azure Container Registry 到執行 Terraform 指令碼,建立基礎設施,並佈署微服務應用程式。
從商業價值視角來看,本章節介紹的 Azure Kubernetes Service (AKS) 佈署流程,能有效降低企業建置和管理 Kubernetes 基礎設施的成本。透過 Azure CLI 和 kubectl 等工具的整合,簡化了從程式碼到雲端佈署的流程,讓開發團隊能更專注於應用程式開發,而非基礎設施的維護。技術限制深析顯示,雖然 AKS 簡化了許多操作,但仍需理解 Kubernetes 的核心概念,例如 Pod、Deployment 和 Service 等,才能有效運用。此外,安全性設定,例如容器登入的連線與驗證,也需要謹慎處理,避免潛在風險。展望未來,隨著 Serverless Kubernetes 和 GitOps 等技術的發展,AKS 的佈署和管理流程將更加自動化和簡潔,進一步降低企業的營運成本,並提升開發效率。玄貓認為,對於尋求快速上雲且希望降低 Kubernetes 管理複雜度的企業而言,AKS 是一個值得評估的解決方案。