Ingress TLS Easy setup
在上一篇文章中,我們介紹了 Kubernetes Ingress 與 Nginx Ingress Controller 的基本使用方法。本篇文章將進一步說明如何為 Ingress 配置 TLS(HTTPS),讓服務可以透過加密的 HTTPS 協議安全地提供外部訪問。
目錄
1. Ingress TLS 簡介
當 Kubernetes Ingress 需要支援 HTTPS,我們必須配置 TLS 憑證。通常有兩種方式:
使用真實 CA(Certificate Authority)簽發的證書
使用自簽證書(Self-Signed Certificate)(適用於本地測試環境)
這篇文章會使用 自簽證書 來演示如何啟用 TLS,並將其綁定到 AP 服務(app.caster.com) 及 MySQL 服務(mysql.caster.com)。
2. 建立與生成自簽證書(Local 測試)
我們將使用 openssl
生成自簽證書,並設定 域名 caster.com
。
步驟 1:生成私鑰與證書
執行以下指令來生成一個 2048-bit RSA 私鑰:
步驟 2:驗證憑證
確認 caster_com.key
和 caster_com.crt
是否成功生成:
3. 建立 Kubernetes Secret
現在我們需要將 憑證 和 私鑰 轉換為 Kubernetes Secret,讓 Ingress Controller 可以使用它們。
執行以下命令來創建 Secret(名稱為 caster-tls
):
檢查 Secret 是否成功建立:
輸出應該類似:
4. 更新 Ingress 資源,啟用 TLS
接下來,我們需要修改 Ingress 配置,新增 TLS 設定,並綁定剛剛創建的 Secret。 記得先把之前的 ingress.yml 停用,建立新的 tls-ingress.yaml
編輯 tls-ingress.yaml
:
套用 Ingress 配置:
5. 測試 HTTPS 訪問
步驟 1:應用新的 Ingress
步驟 2:修改 /etc/hosts
/etc/hosts
因為 app.caster.com
不是一個真實域名,我們需要手動將其解析到 Ingress Controller 的 IP:
windows 位置: C:\Windows\System32\drivers\etc\hosts
步驟 3:使用 curl
測試 HTTPS
curl
測試 HTTPS
-k
參數 允許curl
忽略自簽證書的安全警告。
如果一切正常,應該能夠看到來自 normal-project
的回應。
※額外測試 mysql.caste.com 連線至DB (這部分測試僅限再本機環境才會達成)
🚀 問題分析
你透過 Ingress 設定
mysql.caster.com
,但 Ingress 只處理 HTTP/HTTPS,並不適用於 MySQL(TCP 服務)Ingress Controller(如 ingress-nginx)主要負責 HTTP 流量,不支援 MySQL 這類 TCP 服務的轉發。
你的 MySQL 服務跑在 TCP 3309,所以 Ingress Controller 根本不會處理這個請求。
Service Type 設定影響 MySQL 的可達性
NodePort
模式:你應該直接連接
NodeIP:NodePort
(而不是mysql.caster.com:3309
)。NodePort
會在每個 Kubernetes 節點上開一個高位元的 Port(例如32023
)。但 Ingress 不會轉發 TCP 連線到
NodePort
,所以你的mysql.caster.com:3309
連線失敗。
LoadBalancer
模式:如果你在 雲端環境(AWS, GCP, Azure),Kubernetes 會為 MySQL 申請一個外部 LoadBalancer IP,讓
mysql.caster.com:3309
直接連到 MySQL。在本機(如 Minikube, Kind),
LoadBalancer
會自動綁定localhost
,讓mysql.caster.com:3309
連線成功。
🚨 重要結論
Ingress 不能處理 MySQL(TCP)流量,不能靠它轉發 MySQL 服務!
如果用
NodePort
,請連NodeIP:NodePort
,而不是mysql.caster.com:3309
如果用
LoadBalancer
,可以直接連mysql.caster.com:3309
(但本機環境可能不支援真正的 LoadBalancer)
所以我使用 Intellij database tool 連線成功,完全是亂用這個機制,也是因為我的 hosts 檔案修改才會有這樣的結果,當然本機環境本來就是拿來測試使用的,就...亂用...
可以確定這樣的做法,完全不能算是使用SSL連線,上網查了一下,還有一大堆設定要搞,痾.... 我沒有那們多的時間玩這個,這部分就先這樣,後續有時間再搞了...
6. 總結
在本文中,我們介紹了如何在 Kubernetes Nginx Ingress Controller 上啟用 TLS/HTTPS,主要步驟如下:
使用
openssl
生成 自簽證書(適用於 Local 測試)。創建 Kubernetes Secret,存儲憑證和私鑰。
更新
Ingress
資源,添加tls
設定並綁定 Secret。測試 HTTPS 訪問。
這種方式適合 本地開發和測試環境,如果是 正式環境,建議使用 Let's Encrypt 或 CA 簽發的 SSL 憑證 來實現更安全的 HTTPS 部署。
💡 進階閱讀
Last updated