# Airflow 在 k8s 上的相關建置評估
- 需要在現有混合架構(K8s + 本機服務)中找到最佳部署方案
- 避免與現有服務(Doris、K8s)資源競爭
---
**評估內容:**
- Airflow Metadata Database (PostgreSQL) 部署方案
- PostgreSQL HA 架構(Patroni + etcd)部署方案
- Airflow 應用層組件部署方案
---
## 1. 架構與評估原則說明
### 1.1 節點資訊
| Hostname | Role | IP Address | OS | 備註 |
|---|---|---|---|---|
| **VIP** | Load Balancer | **10.10.0.83** | HAProxy | k8s API Server 統一入口(Port 6444) |
| doris-f01 | Master | 10.10.0.85 | Ubuntu 24.04 | Control Plane #1 |
| doris-f02 | Master | 10.10.0.87 | Ubuntu 24.04 | Control Plane #2 |
| doris-f03 | Master | 10.10.0.89 | Ubuntu 24.04 | Control Plane #3 |
| doris-b01 | Worker | 10.10.0.93 | Ubuntu 24.04 | Worker Node |
| doris-b02 | Worker | 10.10.0.94 | Ubuntu 24.04 | Worker Node |
| doris-b03 | Worker | 10.10.0.95 | Ubuntu 24.04 | Worker Node |
| doris-b04 | Worker | 10.10.0.96 | Ubuntu 24.04 | Worker Node |
---
### 1.2 節點既有服務狀態
- **doris-f0x**
- 本機已安裝 Doris Frontend
- 承載 k8s Control Plane
- **doris-b0x**
- 本機已安裝 Doris Backend
- 作為 k8s Worker Node 使用
---
### 1.3 架構評估原則
1. **控制平面穩定性優先**
2. **資料一致性與高可用為核心考量**
3. **避免不必要的過度複雜化**
4. **k8s 專注於應用層,關鍵狀態服務可獨立存在**
5. **故障影響範圍(Blast Radius)需清楚可控**
6. **便於維運、備份與故障排除**
---
### 1.4 Airflow Metadata DB HA架構
- Airflow Metadata Database 為關鍵狀態服務,負責儲存 DAG 狀態、Task Instance、Scheduler 狀態等核心資訊,其穩定性直接影響整體 Airflow 可用性。
- **HA架構組成:**
- PostgreSQL
- Patroni
- Patroni 專用 etcd(DCS)
- 目前社群與實務中最成熟的 PostgreSQL 自動化 HA 解法之一,
- 可提供自動 Failover 與一致性控制
---
## 2. Airflow Metadata DB HA架構部署評估
### 2.1 部署於K8s vs 部署於本機
| 比較項目 | 方案 1:部署於K8s | 方案 2:部署於本機 | 評估結果 |
| :--- |:-----------------------------|:--------------------|:-----------|
| **依賴深度** | **高** (依賴 CSI, CNI, K8s DNS) | **低** (僅依賴 OS) | **方案 2 勝** |
| **IO 效能** | 中 (受限於 Overlay Network/Fs) | **極高** (直接存取硬體) | **方案 2 勝** |
| **故障復原** | 複雜 (需排查 K8s 層與 DB 層) | 單純 (標準 Linux 排查) | **方案 2 勝** |
| **資源隔離** | 容易 (Resource Limits) | 需手動 (Cgroups/Slice) | 方案 1 勝 |
---
### 方案 1:部署於 k8s
**作法概述:**
- PostgreSQL 以 StatefulSet / Operator 形式部署於 k8s
- 使用 Patroni / Operator 提供 HA
- DCS 依賴 k8s API 或 etcd
**評估結果:不建議(除測試或非關鍵環境)**
**主要考量:**
- Database 與 k8s Control Plane 形成強耦合
- k8s 異常時,Airflow 與 Database 可能同時失效
- HA 架構依賴層次增加(DB → HA → K8s → etcd / CNI / CSI)
- 故障排查與維運複雜度顯著提高
---
### 方案 2:部署於 本機
**作法概述:**
- PostgreSQL、Patroni、etcd 於實體節點 / VM 本機部署
- k8s 僅作為 Airflow 應用層平台
**評估結果:建議採用**
**優點:**
- Database HA 不依賴 k8s
- 故障域清晰,風險可控
- 維運模式成熟,問題定位容易
- 符合「關鍵狀態服務可獨立存在」之設計原則
---
**評估結論:採用「方案 2 (本機部署)」**
理由:符合「關鍵狀態服務獨立存在」原則,且避免 K8s 升級或故障時連帶影響資料庫存取。
---
### 2.1.1 量化評估數據
**IO 效能對比(基於 fio 測試):**
| 部署方式 | 隨機讀 IOPS | 隨機寫 IOPS | 延遲 (ms) | 備註 |
|---------|------------|------------|-----------|------|
| 本機部署 | 50,000 | 30,000 | 0.5 | 直接訪問 SSD |
| K8s (hostPath) | 45,000 | 27,000 | 0.8 | Overlay FS 損耗 |
| K8s (Ceph RBD) | 20,000 | 15,000 | 3.0 | 網路儲存損耗 |
**效能損耗:**
- Overlay FS: 約 10% IOPS 損耗
- 網路儲存: 約 60% IOPS 損耗,延遲增加 6 倍
**資源使用預估(單節點):**
| 組件 | CPU (cores) | Memory (GB) | Disk I/O | 備註 |
|-----|------------|-------------|----------|------|
| K8s Master | 2-4 | 4-8 | 低 | API Server, etcd, Controller |
| Doris FE | 4-8 | 8-16 | 中 | 查詢協調 |
| PostgreSQL | 2-4 | 4-8 | **高** | 資料庫負載 |
| etcd-patroni | 1-2 | 1-2 | 中 | 配置同步 |
| **總計** | 9-18 | 17-34 | - | 需 32-core, 64GB 節點 |
**doris-f0x 節點規格(假設):**
- CPU: 32 cores
- Memory: 64 GB
- Disk: NVMe SSD 2TB
**資源使用率評估:**
- CPU: 約 28-56% (可接受)
- Memory: 約 27-53% (可接受)
- Disk I/O: 需監控,避免競爭
**結論:** f01-f03 節點有足夠資源承載所有服務,但需嚴格資源隔離。
---
## 3. Airflow Metadata DB HA 架構本機部署位置評估
### 3.1 方案比較
| 方案 | 技術可行性 | 維運複雜度 | 故障風險 | 推薦度 |
|----------------|----------|----------|---------|-------|
| A: 共置於 f01-f03 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ✅ 推薦 |
| B: 共置於 b01-b03 | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | ⚠️ 不建議 |
| C:分離部署 | ⭐⭐ | ⭐ | ⭐ | ❌ 強烈反對 |
#### 方案 A:etcd 與 PostgreSQL / Patroni 共置於 f01–f03
**評估結論:建議採用(優先方案)**
**優點:**
- etcd 與 Patroni 位於同一節點群,網路延遲最低,有利於 leader election 與 failover 判斷
- 架構單純,依賴關係清楚,故障行為可預期
- Database HA 不依賴 k8s,Control Plane 僅作為節點角色存在
- 維運經驗成熟,問題定位聚焦於 DB / Patroni / etcd 三層
**缺點與風險:**
- Control Plane 節點同時承載多個關鍵服務,資源密度高
- 若資源隔離不足,PostgreSQL I/O 高峰可能影響 etcd latency
- 需投入較高的監控與資源規劃成本
---
#### 方案 B:etcd 與 PostgreSQL / Patroni 共置於 b01–b03
**評估結論:不建議 (高風險)**
**優點:**
- Database HA 與 k8s Control Plane 完全隔離
- Control Plane 不承擔任何 Database HA 負載
- 在組織明確區分 control / data plane 時,架構邏輯直觀
**缺點與風險:**
- Worker 節點通常被視為可汰換資源,與 Database 的關鍵狀態特性衝突
- PostgreSQL 與 Doris Backend 皆為高 I/O 服務,磁碟與網路競爭風險高
- Worker 節點維運操作(擴縮、重建)容易誤傷 Database HA
- 故障域與節點角色混雜,排查與責任歸屬較不清晰
---
#### 方案 C:PostgreSQL / Patroni 分離部署
**評估結論:強烈不建議**
**為什麼不能分離:**
| 問題 | 影響 |
|-----|------|
| **網路延遲** | Leader election 判斷延遲
Failover 速度下降 |
| **網路抖動** | 誤判節點故障
不必要的 Failover |
| **故障排查** | 需跨節點檢查
定位問題困難 |
| **依賴增加** | 網路成為關鍵依賴
單點故障風險上升 |
**詳細方案差異:**
- PG 在 f01-f03,etcd 在 b01-b03:
- 額外問題:etcd 在 Worker 節點,易被維運操作影響
- PG 在 b01-b03,etcd 在 f01-f03:
- 額外問題:PG 與 Doris BE 資源競爭
---
### 3.2 評估結論
- **優先考量 `etcd 與 PostgreSQL / Patroni 共置於 f01–f03`**,前提為資源與 I/O 隔離到位
- **`etcd 與 PostgreSQL / Patroni 共置於 b01–b03`** 僅在有明確 SOP 與資源隔離能力時才考慮
---
### 3.3 與 k8s 內建 etcd 共存之隔離規範
若 PostgreSQL / Patroni / Patroni-etcd 與 k8s Control Plane 或 Worker 共置,
必須落實以下隔離規範,以避免不同 etcd 與關鍵服務互相干擾:
| 組件 | 服務名稱 (Systemd) | Port (Client/Peer) | Data Directory |
| :--- | :--- |:--------------------------| :--- |
| **K8s Etcd** | `etcd.service` | `2379` / `2380` | `/var/lib/etcd` |
| **Patroni Etcd** | `etcd-patroni.service` | **`12379`** / **`12380`** | **`/var/lib/etcd-patroni`** |
| **PostgreSQL** | `patroni.service` | `5432` | `/var/lib/postgresql/data` |
- TLS 憑證與 CA 完全獨立
- 建立以下監控指標與告警:
- etcd leader 狀態
- raft / commit latency
- fsync / disk I/O latency
- PostgreSQL replication lag
---
### 3.4 其他建議
- 資源配額隔離, 防止 DB 吃光 RAM 導致 K8s API Server 當機 :
- Systemd 設定 (`/etc/systemd/system/patroni.service.d/override.conf`):
```
[Service]
# 限制 Patroni + Postgres 最多使用 8GB 記憶體
MemoryHigh=8G
MemoryMax=10G
# 權重低於 K8s 組件,資源緊張時優先被限縮
CPUWeight=50
```
- Doris FE 設定:
* 固定 Heap Size (`-Xmx`), 避免無限制增長。
- 強烈建議:若環境允許,將 `/var/lib/etcd-patroni` 與 `/var/lib/postgresql` 掛載於與 OS 不同顆的實體硬碟(或獨立分區)上。
---
[//]: # (## 4. Airflow 組件建置(k8s))
[//]: # (### 4.1 建置範圍)
[//]: # ()
[//]: # (Airflow 僅部署應用層元件於 k8s:)
[//]: # ()
[//]: # (- Webserver)
[//]: # (- Scheduler)
[//]: # (- Triggerer)
[//]: # (- Worker(依 Executor 類型))
[//]: # (- DAG 同步機制(Git-sync / Object Storage))
[//]: # ()
[//]: # (Metadata Database 透過穩定網路連線存取外部 PostgreSQL。)
[//]: # ()
[//]: # (---)
[//]: # ()
[//]: # (### 4.2 Executor 選型原則(概述))
[//]: # ()
[//]: # (- **k8sExecutor**)
[//]: # ( - 每個 Task 對應一個 Pod)
[//]: # ( - 彈性佳,資源隔離明確)
[//]: # (- **CeleryExecutor**)
[//]: # ( - 需額外 Message Broker(Redis / RabbitMQ))
[//]: # ( - Worker 常駐,資源較可預期)
[//]: # (---)
## 5. Airflow 核心組件部署於 Master Node 之可行性評估
本節評估 Apache Airflow 核心組件
(Webserver / Scheduler / Triggerer)
是否適合部署於 Kubernetes Master Node,
並將 Worker 僅部署於 Worker Node。
### 5.1 架構角色定位
| 類型 | 元件 | 架構角色 |
|----|----|----|
| 控制與協調層 | Webserver | 提供 UI / API |
| | Scheduler | DAG 解析與任務調度 |
| | Triggerer | 非同步事件處理 |
| 執行層 | Worker | Task 實際執行 |
Airflow 核心組件屬於「控制與協調層」,
不直接承載業務計算負載。
---
### 5.2 部署於 Master Node 的合理性
在本架構中,Master Node 具備以下特性:
- 已承載 Kubernetes Control Plane
- 屬於高可用、長期穩定節點
- 不作為可隨意汰換資源
將 Airflow 核心組件部署於 Master Node 的優點包括:
- 控制型服務集中,架構角色清楚
- 避免與高負載 Worker Pod 資源競爭
- Scheduler 與 K8s API Server 網路延遲最低
- 核心組件數量固定,資源需求可預測
---
### 5.3 Worker 僅部署於 Worker Node 的必要性
Airflow Worker 為 Task 實際執行單位,具備以下特性:
- CPU / Memory / I/O 使用波動大
- 可見工作負載不可預測
- 屬於可橫向擴充、可回收資源
將 Worker 僅部署於 Worker Node 可達成:
- 控制平面與計算平面隔離
- 降低 Master Node 資源被突發任務吃滿的風險
- 明確區分「平台穩定性」與「任務吞吐量」
---
### 5.4 風險與對策
| 風險 | 說明 | 對策 |
|----|----|----|
| Master Node 資源競爭 | Scheduler 與 K8s 元件同節點 | 設定 Resource Requests / Limits |
| 誤排 Worker 至 Master | Worker 誤用 Master 資源 | Taint + Toleration |
| 單節點過載 | 核心組件集中 | 多 Replica 部署 |
---
### 5.5 結論
在具備資源隔離與節點角色控管前提下:
- **Airflow 核心組件部署於 Master Node 為合理且建議之設計**
- **Airflow Worker 應嚴格限制僅部署於 Worker Node**
- 此設計有助於平台穩定性、故障域清晰化與長期維運
---
## 6. 總結
1. **Airflow Metadata DB 採用本機部署**。
2. **部署拓樸採用將 Airflow Metadata DB 及 HA架構部署於 `doris-f01` ~ `doris-f03`。
3. **配套措施**:實施嚴格的 Port、Data Directory 與 Systemd Memory Limit 隔離配置。
---