Kubernetes 叢集的雲端託管服務能簡化 PaaS 平台建構,提供負載平衡器和網路磁碟等必要功能。本文假設已具備 Kubernetes 叢集且 kube-config 已設定,並已安裝 kubectl 和 HelmWave 工具。首先,利用 HelmWave 佈署 Envoy Gateway 作為平台閘道器,並建立 GatewayClass 以支援 Envoy Gateway 的流量管理。透過 Helm 圖表定義 Gateway、HTTPRoute 和 TCPRoute 等資源,設定流量路由規則。後續將整合 PaaS UI,並以 PostgreSQL 服務為例,說明如何建立服務模組、設定 TemplateStore,最終佈署 PostgreSQL 應用程式到平台上。

Kubernetes開發PaaS:零程式碼開發之最大可能性 (第一部)

Kubernetes不只是容器協調器,更是整合工具的生態系,能輕鬆建構無需編碼的PaaS平台。Helm、ArgoCD、Crossplane、Knative等工具簡化應用程式和基礎架構管理,讓開發自有平台變成設定而非程式設計的工作。我是台灣資深軟體工程師,在VK Tech團隊擔任技術主管,負責根據Kubernetes開發PaaS平台以簡化資料處理。本系列文章將逐步解說如何利用Kubernetes及其生態系建構PaaS。

要將Kubernetes轉變為PaaS,需要先有Kubernetes叢集。但本文目標不在於從零開始佈署Kubernetes,而是展示如何將其轉變成好用的PaaS。因此,建議您從雲端供應商取得託管式叢集。這能提供現成的解決方案,節省時間和精力:

  • 負載平衡器 (Load Balancer): 將外部流量導向叢集內部。建立服務後取得IP位址即可存取。
  • 網路磁碟: 永續性儲存空間 (Persistent Volumes) 已內建於基礎架構中。連線到Pod即可使用,無需額外設定NFS。

此方法能快速建立可運作的基礎,讓您可以專注於PaaS建構,而非調整裸機叢集。後續只需在基礎上新增PaaS元件即可。

準備工作

假設您的叢集已設定完成,且kube-config位於您的家目錄中,準備開始作業。首先,確認並安裝必要的工具 (若尚未安裝):

  • kubectl: Kubernetes管理的關鍵工具,如同叢集的萬用工具刀,可用於執行指令、檢查Pod狀態、佈署資源等。不可或缺。
  • Helmwave: 方便管理Helm圖表並將其佈署到叢集的工具。我一開始考慮使用Terraform,但它在處理自訂資源 (CRD) 時會遇到問題,因為它並非總是能識別CRD,且速度也明顯較慢。Helmwave處理CRD更乾淨快速。

有了這些工具,我們可以繼續在叢集上構建平台。下圖顯示平台的主要組成元件:

此圖顯示

此圖將我們的平台劃分為三個主要區塊,以展現各部分的協同運作方式:

1. PaaS 系統: 平台基礎,包含所有使用者所需的核心元件:

  • Gateway:負責將外部流量路由至叢集,所有服務請求皆由此進入。
  • IAM:身份驗證與授權系統,決定使用者許可權。
  • 可觀察性 (Observability):監控和分析工具群組:
    • 儀錶板 (Dashboard):資料視覺化。
    • 日誌 (Logs):收集和分析日誌,用於稽核和除錯。
    • 指標 (Metrics):效能指標。 2. PaaS 運算元 (Operator): Kubernetes運算元所在位置,自動化資源和自訂物件的管理。圖中顯示三個運算元 (Operator 1, 2, 3),每個負責特定型別的應用程式。 3. 使用者 1 (Tenant-1): 特定使用者或團隊 (租戶) 的空間範例:
    • PaaS 使用者介面 (UI):簡潔的使用者介面,讓使用者無需使用終端機即可管理應用程式。
    • 應用程式 1 和 2 (App 1 和 App 2):租戶執行的應用程式或服務,例如ETL管道或資料儀錶板。

Gateway

我選擇使用Envoy Gateway 作為平台的Gateway,原因如下:

  1. 想嘗試看看。對最新的Kubernetes Gateway API和Envoy的功能感到好奇,之前沒用過。
  2. Kubernetes Gateway API (Envoy Gateway的最新標準) 是新版Kubernetes Gateway API (預計於2023年達到GA 1.0版本) 最佳實作之一,用於取代舊版的Ingress。這為我們的平台提供了彈性的宣告式路由和流量管理。

使用Helmwave安裝Envoy Gateway

在工作目錄中建立helmwave.yml檔案,並加入Envoy Gateway圖表的描述:

helmwave.yaml

project: kube-paas
version: "0.41.8"

registries:
  - host: docker.io

.options-system: &options-system
  namespace: paas-system
  create_namespace: true
  wait: true
  timeout: 1m
  max_history: 3

releases:
  - name: "eg"
    chart:
      name: oci://docker.io/envoyproxy/gateway-helm
    <<: *options-system
    tags: [eg]

執行以下指令:

helmwave up -t eg --build --kubedog

此指令會建置 ( --build 旗標) 並套用 ( up 指令) 清單到叢集。說明如下:

  • -t 選項允許只執行指定的釋出。
  • --kubedog 旗標允許在安裝釋出期間追蹤 Job、Pod、Deployment 等的狀態。

新增GatewayClass以支援Envoy Gateway

為了新增Gateway資源並透過Envoy Gateway管理流量路由,需要設定GatewayClass。我們將建立Helm圖表PaaS-system,並加入gateway.yaml範本:

  1. 建立Helm圖表PaaS-system
helm create paas-system
  1. paas-system/templates資料夾中建立gateway.yaml檔案,內容為Envoy Gateway的GatewayClass描述:
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: envoy-gateway-class
spec:
  controllerName: gateway.envoyproxy.io/gatewaycontroller

此GatewayClass指定Envoy Gateway將管理我們的閘道。gateway.envoyproxy.io/gatewaycontroller控制器將其與已安裝的Envoy Gateway連結。

  1. 將此圖表加入helmwave.yml,讓Helmwave將其佈署到叢集:
release:
  ...
  - name: "system"
    chart:
      name: "./paas-system"
    <<: *options-system
    tags: [system]
  1. 執行以下指令:
helmwave up -t system --build

為定義如何將流量導向叢集內部,我們將建立一個專屬的Helm圖表。此圖表將新增Gateway進行路由、HTTPRoute用於存取PaaS UI,以及TCPRoute用於連線到已佈署的服務。

(以下內容因篇幅限制,將簡化並重點呈現後續步驟,詳細程式碼請參考原文)

後續章節將說明如何選擇並整合PaaS UI (例如Cyclops UI)、建立PostgreSQL服務模組、設定TemplateStore以及最終佈署PostgreSQL應用程式等步驟。 每個步驟都會包含必要的Helm chart組態以及#### 內容解密:的程式碼說明。

總結: 本文詳細闡述了利用Kubernetes以及相關工具(Helm, Envoy Gateway, Cyclops UI等) 建立PaaS平台的第一步,著重於架構設計和核心元件的佈署與組態,為後續的IAM整合以及更多服務的加入奠定了堅實的基礎。 後續文章將繼續探討平台的擴充套件和最佳化。