K8s & K3s 集群中應用自動簽發 Https 證書


Cert Manager 簡介

隨着 HTTPS 不斷普及,越來越多的網站都在從 HTTP 升級到 HTTPS,使用 HTTPS 就需要向權威機構申請證書,需要付出一定的成本,如果需求數量多,也是一筆不小的開支。cert-manager 是 Kubernetes 上的全能證書管理工具,如果對安全級別和證書功能要求不高,可以利用 cert-manager 基於 ACME 協議與 Let’s Encrypt 來簽發免費證書並自動續期,實現永久免費使用證書。

Cert-Manager 是一個雲原生證書管理開源項目,用於在 Kubernetes 集群中提供 HTTPS 證書並自動續期,支持 Let’s Encrypt / HashiCorp / Vault 這些免費證書的簽發。在 Kubernetes 中,可以通過 Kubernetes Ingress 和 Let’s Encrypt 實現外部服務的自動化 HTTPS。

1 架構原理

解釋下幾個關鍵的資源:

  • Issuer/ClusterIssuer: 用於指示 cert-manager 用什么方式簽發證書,本文主要講解簽發免費證書的 ACME 方式。ClusterIssuer 與 Issuer 的唯一區別就是 Issuer 只能用來簽發自己所在 namespace 下的證書,ClusterIssuer 可以簽發任意 namespace 下的證書。
  • Certificate: 用於告訴 cert-manager 我們想要什么域名的證書以及簽發證書所需要的一些配置,包括對 Issuer/ClusterIssuer 的引用。

備注: 通過 helm3 安裝並配置 Cert-Manager。

認證系統

1 環境依賴

底座環境: K8s/K3s 環境 (K8s1.15+)
組件依賴: Helm3 & Git & treafik

2 安裝 Cert-Manager

# 創建 CustomResourceDefinition 用戶自定義資源
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.15.0/cert-manager.crds.yaml

# 創建命名空間
kubectl create namespace cluster-service

# 添加 Jetstack Helm 倉庫
helm repo add jetstack https://charts.jetstack.io
helm repo update

# helm 部署 Cert Manager
helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --version v0.15.0

3 Issuer 或 Clusterissuer 配置

Issuer 與 ClusterIssuer 的區別是 ClusterIssuer 可跨命名空間使用,而 Issuer 需在每個命名空間下配置后才可使用。我在此使用 ClusterIssuer,其類型選擇 Let‘s Encrypt

# 配置 staging 環境使用的 Let‘s Encrypt ClusterIssuer,並創建:
$cat cluster-issuer-letsencrypt-staging.yaml

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    # 務必將此處替換為你自己的郵箱, 否則會配置失敗。當證書快過期時 Let's Encrypt 會與你聯系
    email: user@example.com
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      # 將用來存儲 Private Key 的 Secret 資源
      name: letsencrypt-staging
    # Add a single challenge solver, HTTP01 using nginx
    solvers:
    - http01:
        ingress:
          class: nginx

$ kubectl create -f cluster-issuer-letsencrypt-staging.yaml

# 配置 production 環境使用的 Let‘s Encrypt ClusterIssuer,並創建:
$cat cluster-issuer-letsencrypt-prod.yaml

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: user@example.com
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
      - http01:
          ingress:
            class: nginx

$ kubectl create -f cluster-issuer-letsencrypt-prod.yaml

4 資源核查

[root@iZbp1dnzy9ygt2oosvzzzcZ cert-manager]# kubectl get clusterissuer
NAME                  READY   AGE
letsencrypt-prod      True    31m
letsencrypt-staging   True    27m

這里分別配置了測試環境與生產環境兩個 ClusterIssuer, 原因是 Let’s Encrypt 的生產環境有着非常嚴格的接口調用限制,最好是在測試環境測試通過后,再切換為生產環境。

測試驗證

假設已安裝好 Nginx Ingress Controller 或者 Treafik 並已存在一個 Ingress 對象,現在為它開啟 TLS 選項:

# quickstart-example.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kuard
  annotations:
    # 務必添加以下兩個注解, 指定 ingress 類型及使用哪個 cluster-issuer
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer:"letsencrypt-staging"

    # 如果你使用 issuer, 使用以下注解 
    # cert-manager.io/issuer: "letsencrypt-staging"

spec:
  tls:
  - hosts:
    - example.example.com                # TLS 域名
    secretName: quickstart-example-tls   # 用於存儲證書的 Secret 對象名字 
  rules:
  - host: example.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: kuard
          servicePort: 80
# 更新應用
kubectl create -f quickstart-example.yaml

# Cert-manager 會讀取注解並創建證書,使用以下命令查看
kubectl get certificate -A

# 當 Ready 為 True 時代表證書安裝成功若出現問題可使用 descirbe 命令查看具體出錯原因:
kubectl describe certificate -A

環境證書切換

當一切就緒后,將 Ingress 對象中的 cluster-issuer 注解改為 Let’s Encrypt 生產環境

# quickstart-example.yaml

cert-manager.io/cluster-issuer: "letsencrypt-prod"

更新 Ingress 后訪問你的網站,應該可以看到 HTTPS 證書配置

說明: 配置域名,然后進行服務訪問;

拓展閱讀

系統自簽名證書的生效,需要多關注下證書的部署版本信息,千萬不要隨便跟着互聯網的一些教程進行上手操作,可能會搞出來好多的烏龍呦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM