Files
awoooi/docs/adr/ADR-026-coredns-gitops.md
OG T 0a9d94d82b feat(k8s): CoreDNS GitOps 架構 (ADR-026)
問題: DNS 配置沒有版本控制,手動修改易遺失

架構:
- k8s/k3s-system/coredns-custom.yaml: HelmChartConfig
- CD workflow: k3s-system 路徑偵測 + 自動 apply
- ADR-026: CoreDNS GitOps 管控架構

DNS 上游:
- 使用 8.8.8.8 + 1.1.1.1
- 禁止 /etc/resolv.conf (systemd-resolved)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 18:43:28 +08:00

143 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ADR-026: CoreDNS GitOps 管控架構
**狀態**: 批准
**日期**: 2026-03-26 (台北時區)
**決策者**: 統帥
**觸發**: DNS 解析問題 + NetworkPolicy 連鎖事故 (ADR-011)
## 問題陳述
```
事故時間線:
├── 2026-03-26: Telegram 告警失敗 → 發現 Pod 無法解析外部 DNS
├── 根因: CoreDNS forward 設定使用 /etc/resolv.conf
│ → 解析到 127.0.0.53 (systemd-resolved)
│ → 容器內無法使用宿主機 loopback
└── 修復後: 需要版本控制防止再次發生
```
**核心問題**:
1. CoreDNS 配置沒有版本控制
2. 手動修改容易遺失或被覆蓋
3. 與 K3s 內建 Helm Controller 衝突風險
---
## 決策K3s HelmChartConfig + GitOps
### 為什麼不用純 ArgoCD
| 方案 | 問題 |
|------|------|
| ArgoCD 管 kube-system | 與 K3s Helm Controller 衝突 |
| 直接 kubectl apply ConfigMap | K3s 會覆蓋手動修改 |
| **HelmChartConfig** | K3s 原生支援,不衝突 |
### 架構設計
```
┌─────────────────────────────────────────────────────────┐
│ CoreDNS GitOps 架構 │
├─────────────────────────────────────────────────────────┤
│ │
│ Git Repository (版本控制) │
│ └── k8s/k3s-system/coredns-custom.yaml │
│ │ │
│ ▼ │
│ CD Pipeline (GitHub Actions) │
│ └── kubectl apply -f k8s/k3s-system/ │
│ │ │
│ ▼ │
│ K3s Helm Controller │
│ └── 偵測 HelmChartConfig 變更 │
│ │ │
│ ▼ │
│ CoreDNS Deployment 更新 │
│ │
└─────────────────────────────────────────────────────────┘
```
---
## 實作細節
### 1. 配置檔案 (`k8s/k3s-system/coredns-custom.yaml`)
```yaml
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: coredns
namespace: kube-system
spec:
valuesContent: |-
servers:
- zones:
- zone: .
port: 53
plugins:
- name: forward
parameters: . 8.8.8.8 1.1.1.1 # 禁止使用 /etc/resolv.conf
```
### 2. CD 整合 (`.github/workflows/cd.yaml`)
```yaml
- name: Sync CoreDNS Config
if: needs.detect-changes.outputs.k3s-system == 'true'
run: kubectl apply -f k8s/k3s-system/coredns-custom.yaml
```
### 3. 路徑偵測
```yaml
k3s-system:
- 'k8s/k3s-system/**'
```
---
## DNS 上游選擇
| 優先順序 | DNS 伺服器 | 說明 |
|----------|-----------|------|
| 1 | 8.8.8.8 | Google Public DNS |
| 2 | 1.1.1.1 | Cloudflare DNS |
**禁止清單**:
- `127.0.0.53` - systemd-resolved (容器無法使用)
- `/etc/resolv.conf` - 可能指向宿主機 loopback
---
## 驗收標準
| 項目 | 狀態 |
|------|------|
| HelmChartConfig 建立 | ✅ |
| CD workflow 整合 | ✅ |
| 版本控制於 Git | ✅ |
| 禁止 systemd-resolved | ✅ |
---
## 關聯文件
- ADR-011: NetworkPolicy 變更治理架構
- ADR-025: CI/CD AI 整合架構
---
## 附錄:驗證指令
```bash
# 檢查 CoreDNS ConfigMap
kubectl get cm coredns -n kube-system -o yaml
# 測試 DNS 解析
kubectl run dns-test --rm -it --image=busybox --restart=Never -- nslookup google.com
# 檢查 HelmChartConfig 狀態
kubectl get helmchartconfig -n kube-system
```