# K8s Airflow HA 測試環境 - 主機清單 **更新日期**: 2026-01-30 --- ## 📋 目錄 1. [測試環境概覽](#測試環境概覽) 2. [測試主機清單](#測試主機清單) - [虛擬 IP (VIP) - Keepalived](#虛擬-ip-vip---keepalived) - [Master 節點](#master-節點-control-plane) - [Worker 節點](#worker-節點) 4. [服務與埠號](#服務與埠號) 5. [連線方式](#連線方式) - [VIP 連線 (推薦)](#vip-連線-推薦) 6. [常用命令](#常用命令) 7. [故障排查](#故障排查) --- ## 📊 測試環境概覽 | 項目 | 詳情 | |:----------------------|:--------------------------| | **部署位置** | 單一實體 Server | | **虛擬機數量** | 7 台 (3 Master + 4 Worker) | | **OS** | Ubuntu 24.04 LTS | | **Container Runtime** | containerd | | **K8s 版本** | v1.30.14 | | **Airflow 版本** | 3.0.2 | | **部署方式** | Helm + kubeadm | | **Executor** | CeleryExecutor | --- ## 🖥️ 測試主機清單 ### 虛擬 IP (VIP) - Keepalived | 項目 | 詳情 | |:-----|:---| | **VIP 地址** | `10.10.0.83` | | **實現方式** | Keepalived + HAProxy | | **狀態** | ✅ 已部署 | | **優先級分配** | f01(100) > f02(90) > f03(80) | **VIP 服務轉發配置** (HAProxy): | 服務 | VIP 埠 | 後端目標 | 用途 | |:-----|:------|:--------|:-----| | **Kubernetes API** | 6444 | 10.10.0.85/87/89:6443 | K8s Control Plane 統一入口 | | **PostgreSQL (主寫)** | 5000 | 10.10.0.85/87/89:5432 | 資料庫讀寫連線 (主節點優先) | | **PostgreSQL (備讀)** | 5001 | 10.10.0.85/87/89:5432 | 資料庫唯讀連線 (副本負載均衡) | | **Airflow WebUI** | 8080 | 10.10.0.85/87/89:30080 | Airflow 網頁介面 | | **RabbitMQ 管理** | 15672 | 10.10.0.85/87/89:31672 | RabbitMQ 管理介面 | | **Doris MySQL** | 9031 | 10.10.0.85/87/89:9030 | Doris 前端節點存取 | | **監控統計** | 8404 | HAProxy | HAProxy 統計頁面 | --- ### Master 節點 (Control Plane) | Host | IP | 角色 | CPU | 記憶體 | 磁碟 | Keepalived | |:--------------|:-------------|:-----|:----|:------|:-----|:----------| | **doris-f01** | `10.10.0.85` | Master #1 (初始) | 8 核 | 15GB | 118GB | Master (100) | | **doris-f02** | `10.10.0.87` | Master #2 (副本) | 8 核 | 15GB | 118GB | Backup (90) | | **doris-f03** | `10.10.0.89` | Master #3 (副本) | 8 核 | 15GB | 118GB | Backup (80) | ### Worker 節點 | Host | IP | 角色 | CPU | 記憶體 | 磁碟 | |:--------------|:-------------|:-----|:----|:-----|:-----| | **doris-b01** | `10.10.0.93` | Worker #1 | 4 核 | 15GB | 118GB | | **doris-b02** | `10.10.0.94` | Worker #2 | 4 核 | 15GB | 118GB | | **doris-b03** | `10.10.0.95` | Worker #3 | 4 核 | 15GB | 118GB | | **doris-b04** | `10.10.0.96` | Worker #4 | 4 核 | 15GB | 118GB | --- ## 🔌 服務與埠號 ### Kubernetes 服務埠 | 服務 | 埠 | 節點 | 用途 | |:-----|:--|:-----|:-----| | **API Server** | 6443 | Master | kubectl 連線、API 呼叫 | | **Kubelet** | 10250 | 所有節點 | Node 狀態、Pod 管理 | | **Etcd** | 2379, 2380 | Master | K8s 內部狀態儲存 | | **Scheduler** | 10259 | Master | Pod 排程(內部用) | | **Controller Manager** | 10257 | Master | 控制器(內部用) | ### Airflow 應用埠 | 服務 | 埠 | 節點 | 用途 | |:-----|:--|:-----|:-----| | **Webserver** | 30080 | NodePort | Airflow UI 存取 | | **Flower (可選)** | 30555 | NodePort | Celery 監控 UI | ### PostgreSQL | 服務 | 埠 | 用途 | |:-----|:--|:-----| | **PostgreSQL** | 5432 | 資料庫連線 | ### RabbitMQ (若使用 CeleryExecutor) | 服務 | 埠 | 用途 | |:-----|:--|:-----| | **AMQP** | 5672 | 訊息佇列 | | **Management UI** | 15672 | 管理介面 | --- ## 🔐 連線方式 ### VIP 連線 (推薦) ```bash # ========== Kubernetes API Server (埠 6444) ========== # 使用 VIP 連線到 Kubernetes API Server kubectl --server=https://10.10.0.83:6444 get nodes --insecure-skip-tls-verify # 驗證 VIP 連通性 curl -k https://10.10.0.83:6444/version # ========== PostgreSQL (主寫 - 埠 5000) ========== # 連線到主資料庫進行讀寫 psql -h 10.10.0.83 -p 5000 -U postgres -d airflow_db # ========== PostgreSQL (備讀 - 埠 5001) ========== # 連線到副本資料庫進行唯讀查詢(負載均衡) psql -h 10.10.0.83 -p 5001 -U postgres -d airflow_db # ========== Airflow WebUI (埠 8080) ========== # 在瀏覽器中訪問 Airflow # http://10.10.0.83:8080 # ========== RabbitMQ 管理介面 (埠 15672) ========== # 訪問 RabbitMQ 管理控制臺 # http://10.10.0.83:15672 # 帳號/密碼: airflow/airflow # ========== Doris MySQL (埠 9031) ========== # 連線到 Doris 前端節點 mysql -h 10.10.0.83 -P 9031 -u root -p # ========== HAProxy 監控統計 (埠 8404) ========== # 查看 HAProxy 統計頁面 在瀏覽器中訪問: http://10.10.0.83:8404/stats ``` #### Airflow WebUI 存取 **使用 VIP (推薦) - HAProxy 埠 8080** ```bash # 在瀏覽器中訪問 Airflow (透過 VIP) http://10.10.0.83:8080 ``` #### PostgreSQL 連線 ```bash # ========== 主寫資料庫 (埠 5000) ========== # 連線到主資料庫進行讀寫 psql -h 10.10.0.83 -p 5000 -U postgres -d airflow_db # ========== 備讀資料庫 (埠 5001) ========== # 連線到副本資料庫進行唯讀查詢 (負載均衡) psql -h 10.10.0.83 -p 5001 -U postgres -d airflow_db ``` --- ## 🛠️ 常用命令 ### Kubernetes 基本命令 ```bash # 查看所有節點 kubectl get nodes -o wide # 查看所有 Pod kubectl get pods -A # 查看 Airflow namespace 的 Pod kubectl get pods -n airflow # 查看 Pod 詳細資訊 kubectl describe pod -n airflow # 查看 Pod 日誌 kubectl logs -n airflow # 進入 Pod kubectl exec -it -n airflow -- bash # 查看所有 Service kubectl get svc -A # 查看節點資源使用 kubectl top nodes kubectl top pods -n airflow ``` ### Airflow 特定命令 ```bash # 進入 Airflow scheduler kubectl exec -it -n airflow -- airflow scheduler list-dag # 進入 Airflow webserver Pod kubectl exec -it -n airflow -- bash # 查看 Airflow 日誌 kubectl logs -f deployment/airflow-scheduler -n airflow kubectl logs -f deployment/airflow-webserver -n airflow # 查看 Airflow DAG kubectl exec -it -n airflow -- airflow dags list ``` ### 診斷命令 ```bash # 查看 K8s 事件 kubectl get events -A # 查看節點詳細狀態 kubectl describe nodes # 檢查 DNS kubectl run -it --rm debug --image=busybox:1.28 --restart=Never -- nslookup kubernetes.default # 測試連通性 kubectl run -it --rm netshoot --image=nicolaka/netshoot --restart=Never -- bash ``` --- ## 🔧 故障排查 ### 節點無法加入集群 **症狀**: `kubeadm join` 執行失敗 ```bash # 檢查 kubelet 狀態 systemctl status kubelet journalctl -xe -u kubelet # 重置 kubeadm (若需要重新開始) sudo kubeadm reset sudo iptables -F sudo iptables -t nat -F sudo iptables -t mangle -F sudo ipvsadm --clear ``` ### Pod 無法啟動 ```bash # 查看 Pod 狀態 kubectl describe pod -n airflow # 查看 Pod 日誌 kubectl logs -n airflow # 常見原因: # - 記憶體不足 # - 磁碟空間不足 # - 映像拉取失敗 # - 資源請求超過節點配置 ``` ### 網路連通性問題 ```bash # 測試 Pod 間連通性 kubectl run -it --rm debug --image=busybox:1.28 --restart=Never -- ping # 檢查 Service 連通性 kubectl run -it --rm debug --image=busybox:1.28 --restart=Never -- nc -zv airflow-webserver.airflow 8080 # 查看 CNI 外掛狀態 kubectl get pods -n calico-system ``` ### 磁碟空間不足 ```bash # 檢查磁碟使用 df -h du -sh /var/lib/docker/* du -sh /var/lib/containerd/* # 清理未使用的 Pod 和容器 kubectl delete pod --field-selector status.phase=Failed -A kubectl delete pod --field-selector status.phase=Succeeded -A # 清理本地容器日誌 (Host Machine) sudo journalctl --vacuum=500M # 清理舊的 containerd 數據 sudo ctr images prune ``` ### 記憶體不足 ```bash # 檢查記憶體使用 free -h kubectl top nodes kubectl top pods -A --sort-by=memory # 檢查 Pod 限制配置 kubectl get pod -o yaml | grep -A 5 resources # 若 Master 記憶體不足,減少不必要的 Pod # 關閉監控、Addon 等非必要服務 ``` --- ## 📝 建議與注意事項 ### 初期部署建議 1. **從最小配置開始**: 先用 1 個 Master + 1 個 Worker 驗證功能 2. **逐步擴展**: 驗證通過後再添加更多節點 3. **資源監控**: 持續監控 CPU、記憶體、磁碟使用 4. **日誌收集**: 定期檢查日誌,及時發現問題 ### 常見坑點 - ❌ 忘記關閉 swap → K8s 無法啟動 - ❌ 主機名衝突 → 節點加入失敗 - ❌ 網路配置錯誤 → Pod 無法通訊 - ❌ 磁碟空間不足 → 容器無法啟動 - ❌ 記憶體不足 → Pod Eviction ### 後續優化 - [ ] 添加 VIP / Keepalived 進行 HA 測試 - [ ] 部署 PostgreSQL 進行完整功能測試 - [ ] 部署 RabbitMQ 測試 CeleryExecutor - [ ] 設定持久化儲存 (NFS 或 hostPath) - [ ] 配置監控 (Prometheus + Grafana) - [ ] 設定 DAG 自動部署 --- ## 📚 相關文檔 - [Kubernetes 官方文檔](https://kubernetes.io/docs/) - [Airflow Helm Chart](https://airflow.apache.org/docs/helm-chart/) - [Calico 官方文檔](https://docs.tigera.io/calico/) - [本專案安裝指南](infra/kubernetes/05-k8s-install-guide.md)