當前位置: 妍妍網 > 碼農

【運維幹貨分享】如何在 Kubernetes 中配置入口 TLS/SSL 證書

2024-09-02碼農


在此部落格中,你將了解如何為 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 初學者教程。