Kubernetes 內網存取架構(Cloudflare 託管 DNS)
本文件說明如何在僅內網存取 Kubernetes 的情況下,仍使用 Cloudflare 託管 DNS 子網域,並解析到 RKE2 叢集的內網 VIP 或 Worker Node。
本架構不公開對外、不使用 Cloudflare Proxy、也不需要 Cloudflare Tunnel。
1. 架構概述
此架構允許你:
- 在 Cloudflare 註冊與管理子網域(subdomain)
- 但網站僅能在內網存取(例如 lab 或 home lab)
- 不需公網 IP、不需 Port Forward、不需要 Tunnel
- 內網使用者能透過 domain → VIP → Ingress Controller 存取服務
架構圖
Cloudflare DNS
-------------------------------------
| subdomain.lab.example.com → A → 192.168.1.100 |
-------------------------------------
|
| (DNS lookup only)
v
Home / Office LAN (192.168.1.0/24)
|
-------------------------------------
| |
RKE2 Control Plane RKE2 Worker Node
| |
| Ingress Controller
| |
-------------------------> VIP: 192.168.1.100
2. Cloudflare 設定
2.1 設定 DNS A 記錄(不使用代理)
在 Cloudflare 後台 → DNS → 新增:
Type: A
Name: subdomain
IPv4: 192.168.1.100 # 你的 RKE2 VIP 或 Worker IP
Proxy status: OFF # 灰雲(必須關閉 Proxy)
Cloudflare 在此情境下 僅作 DNS 託管,不做 Proxy、CDN、SSL、WAF 等功能。
3. 內網 DNS 解析方式
由於 Cloudflare 回傳的是內網 IP(例如 192.168.1.100),
外網無法訪問,因此你必須確保內網的 DNS 能解析此記錄。
你可以使用下列其中一種方法。
方法 A:Router DNS Override(推薦)
若你使用:
- ASUS Router / Merlin
- Synology Router
- UniFi Dream Machine
- OPNSense / pfSense
- Mikrotik
可以設定自訂 DNS:
subdomain.lab.example.com → 192.168.1.100
所有內網設備即可正確解析。
方法 B:/etc/hosts(簡單快速)
在內網每台電腦加入:
192.168.1.100 subdomain.lab.example.com
適合少量設備的 lab 環境。
方法 C:內網 DNS(例如 Pi-hole)
如果你希望更企業化:
Local DNS → override → subdomain.lab.example.com = 192.168.1.100
內網所有機器皆可解析到你的 Kubernetes Ingress。
4. Kubernetes 設定
4.1 內網 Ingress(HTTP 版本)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp
spec:
ingressClassName: nginx
rules:
- host: subdomain.lab.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp
port:
number: 80
4.2 內網 HTTPS(Self-Signed 或 Private CA)
建立 Issuer:
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: self-signed
spec:
selfSigned: {}
建立憑證:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: myapp-cert
spec:
commonName: subdomain.lab.example.com
dnsNames:
- subdomain.lab.example.com
issuerRef:
name: self-signed
secretName: myapp-tls
Ingress:
tls:
- hosts:
- subdomain.lab.example.com
secretName: myapp-tls
5. 流量流程
Client (LAN)
↓ DNS resolve
Cloudflare DNS
↓ 回傳 192.168.1.100
Home LAN
↓ 直接連到 VIP
Ingress Controller
↓
Service → Pod
6. 適用場景
- Home lab
- Kubernetes 開發環境
- 只讓內網使用的服務
- 有多個家用設備,需要固定 domain
- 想用 Cloudflare 管理 domain,但不公開服務
7. 不適用場景(請改用 Cloudflare Tunnel)
- 若你需要公開展示 Lab
- 從外網直接存取你的 K8s Ingress
- 沒公網 IP
- 不能做 Port Forward
請改用 Cloudflare Tunnel。
8. 總結
| 問題 | 回答 |
|---|---|
| Cloudflare 可以託管內網 domain 嗎? | 可以 |
| 需要 Cloudflare Proxy 嗎? | ❌ 不需要 |
| 需要 Cloudflare Tunnel 嗎? | ❌ 不需要 |
| 必須讓內網 DNS 能解析嗎? | 必須 |
| Kubernetes Ingress 是否需要特殊設定? | 一般 HTTP/HTTPS 即可 |
此架構是 最乾淨、最低成本、與實際生產最接近的內網 lab 配置。