跳至主要内容

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 配置