在此部落格中,你將了解如何為 Kubernetes Ingress 資源配置入口 TLS 證書。
本部落格基於使用公有 DNS 及其自簽名證書完成的實際演示。如果你沒有網域名稱,則可以使用工作站主機檔進行 DNS 解析或 curl resolve 命令。demo.mlopshub.com
註意:SSL和TLS是相同的。SSL 是舊名稱。TLS 是 SSL 的更新版本。不要混淆 🙂
先決條件和假設
對於本部落格,假設你有一個有效的 Ingress 控制器設定,並且你想為 Ingress 資源配置 TLS。
此部落格是 Kubernetes Ingress 系列的一部份。如果你沒有設定 Ingress 控制器或想詳細了解 Kubernetes Ingress 概念,請先閱讀以下部落格。
Kubernetes Ingress 教程 – 涵蓋所有 Ingress 概念
設定 Nginx Kubernetes Ingress 控制器 – 入口控制器詳細指南
獲取 Kubernetes 入口 SSL/TLS 證書
入口 TLS 的基本要求是 TLS/SSL 證書。你可以透過以下方式獲取這些證書。
自簽名證書:TLS 證書由我們自己的證書頒發機構建立和簽名。對於開發環境來說,這是一個很好的選擇,你可以在其中與團隊共享 rootCA,以便瀏覽器可以信任該證書。檢視建立自簽名證書部落格以建立自己的證書。
購買 SSL 證書:你需要從瀏覽器和作業系統信任的知名證書頒發機構購買SSL證書,用於生產用例。檢視頂級 SSL 提供商了解更多資訊。
使用 Letsencrpt 證書:Letsencrypt 是一個非營利性的受信任證書頒發機構,提供免費的 TLS 證書。
每個 SSL 證書都有一個到期日期。因此,你需要在證書過期之前輪換證書。例如,Letsecrypt 證書每三個月過期一次。我將在本文末尾討論自動證書輪換。
此外,如果你正在處理內部應用程式,則大多陣列織都有自己的 PKI 基礎設施,用於為內部應用程式提供 SSL 證書。你可以請求網路/安全團隊提供證書。
入口 TLS/SSL 如何工作?
將 TLS 添加到入口非常簡單。你所要做的就是:
使用證書和私有金鑰檔建立 Kubernetes 金鑰server.key。server.crt
將 TLS 塊添加到入口資源中,並使用用於生成與 TLS 證書匹配證書的證書的確切主機名。
SSL 由 Ingress 控制器處理,而不是 Ingress 資源。這意味著,當你將 TLS 證書作為 kubernetes 金鑰添加到入口資源時,入口控制器會存取它並將其作為其配置的一部份。
例如,在 Nginx 控制器中,SSL 證書由nginx.conf
ssl_certificate_by_lua_block {
certificate.call()
}
下圖顯示了高級入口 TLS 工作流程。
配置入口 TLS/SSL 證書
讓我們看看在入口中配置 TLS 的步驟。
部署測試應用程式
讓我們從部署一個範例應用程式開始。我們將使用此應用程式來測試我們的入口 TLS。
建立 dev 名稱空間。
kubectl create -n dev
將以下 YAML 另存為 .它有一個 deployment 和 service 物件。hello-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-app
namespace: dev
spec:
selector:
matchLabels:
app: hello
replicas: 2
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello
image: "gcr.io/google-samples/hello-app:2.0"
---
apiVersion: v1
kind: Service
metadata:
name: hello-service
namespace: dev
labels:
app: hello
spec:
type: ClusterIP
selector:
app: hello
ports:
- port: 80
targetPort: 8080
protocol: TCP
部署測試應用程式。
kubectl apply -f hello-app.yaml
建立 Kubernetes TLS 金鑰
註意:此處假設你擁有來自證書頒發機構或你的組織或自簽名的 SSL 檔。server.crtserver.key
SSL 證書應添加為 Kubernetes 金鑰。然後,它將被參照到入口資源 TLS 塊。
讓我們使用 and 檔(SSL 證書)建立一個 TLS 型別的 Kubernetes 金鑰。我們正在 dev 名稱空間中建立金鑰,我們在其中部署了你好應用程式。server.crtserver.key
從你擁有 和 金鑰檔的目錄執行以下 kubectl 命令,或提供檔的絕對路徑。 是任意名稱。server.crthello-app-tls
kubectl create secret tls hello-app-tls \
--namespace dev \
--key server.key \
--cert server.crt
以下是你必須在其中添加 crt 和金鑰檔內容的等效檔。YAML
apiVersion: v1
kind: Secret
metadata:
name: hello-app-tls
namespace: dev
type: kubernetes.io/tls
data:
server.crt: |
<crt contents here>
server.key: |
<private key contents here>
向 Ingress 物件添加 TLS 塊
使用 TLS 的入口資源必須在部署應用程式的同一名稱空間中建立。因此,我們在 namespace 中建立範例入口 TLS 資源。dev
將以下ingress.yaml另存為 demo.mlopshub.com替換為你的主機名。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-app-ingress
namespace: dev
spec:
ingress className: nginx
tls:
- hosts:
- demo.mlopshub.com
secretName: hello-app-tls
rules:
- host: "demo.mlopshub.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: hello-service
port:
number: 80
如你所見,我添加了帶有我們在上一步中建立的 hostname () 和 tls secret 的 TLS 塊。我已建立具有 domain 的自簽名 TLS 證書。demo.mlopshub.comemo.mlopshub.com
tls:
- hosts:
- demo.mlopshub.com
secretName: hello-app-tls
TLS 塊和 rules 塊中的主機應匹配。
🎉 恭喜,你已經使用 TLS 部署了 Ingress。
驗證入口 TLS
你可以使用 curl 命令和瀏覽器驗證入口 TLS。
在 CLI 中,使用你的網域名稱執行 curl 命令,如下所示。
curl https://demo.mlopshub.com -kv
在輸出中,在 server certificate (伺服器證書) 下,你可以驗證證書詳細資訊,如下所示。
在瀏覽器中,存取域並單擊 Lock 圖示以檢視證書詳細資訊。如果你擁有有效的證書,你將看到如下所示的資訊。
如果你沒有有效的證書或入口 TLS 配置錯誤,你將看到 「Your connection is not private」 安全警告,如果你檢查證書詳細資訊,你將看到證書名稱為 「Kubernetes Ingress Controller Fake Certificate」。
Kubernetes Ingress Controller Fake Certificate 是 Nginx Ingress Controller 附帶的預設 SSL 證書。如果檢查控制器,你將看到配置的預設證書,如下所示。nginx.conf of the Nginx
入口 SSL 終止
預設情況下,SSL 在控制器的入口處終止
因此,從控制器到 Pod 的所有流量都將沒有 TLS(解密流量)
如果你想要完整的 SSL,你可以透過你正在使用的 Ingress Controller 添加支持的註釋。例如,在 Nginx 入口控制器中,要允許 SSL 流量到達應用程式,你可以使用註釋。為此,你的應用程式應配置 SSL。 nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
結論
在這篇部落格中,我們學習了如何使用 kubernetes 入口 TLS 範例配置入口 TLS 證書
此外,你還可以使用註釋配置更多 TLS 參數。不同 Ingress 控制器之間的註釋不同。
此外,如果你正在學習 Kubernetes,你可以檢視我的 Kubernetes 初學者教程。