# 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
```
