Skip to content

ssl配置

OK,那我们可以在 Kubernetes 里给你的 CDN 边缘 Nginx 加上 HTTPS 支持,并且用 Let’s Encrypt 自动签发和续期证书。 在 K8s 里这通常是通过 cert-manager 来做的。


1. 原理概述

  • cert-manager 会在集群里自动申请/续期 Let’s Encrypt 证书
  • Nginx 直接挂载这个证书文件,就能跑 HTTPS
  • 证书存储在 Secret,由 cert-manager 维护,不需要你手动更新

2. 部署 cert-manager

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.15.1/cert-manager.yaml

3. 配置 Let’s Encrypt Issuer

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: your-email@example.com # 用你的邮箱
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: traefik

如果你用的是外部 LoadBalancer + NodePort 而不是 Ingress,需要改用 http01 + NodePort 的 solver 配置。


4. 为 CDN Nginx 申请证书

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: cdn-cert
  namespace: default
spec:
  secretName: cdn-tls
  duration: 2160h  # 90天
  renewBefore: 360h # 提前15天续期
  dnsNames:
  - cdn.example.com   # 你的 CDN 域名
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer

5. 修改 Nginx DaemonSet 使用证书

containers:
- name: nginx
  image: nginx:1.25
  ports:
    - containerPort: 443
  volumeMounts:
    - mountPath: /etc/nginx/conf.d
      name: nginx-conf
    - mountPath: /etc/letsencrypt/live
      name: tls-certs
      readOnly: true
volumes:
- name: nginx-conf
  configMap:
    name: nginx-config
- name: tls-certs
  secret:
    secretName: cdn-tls

6. Nginx 配置(支持 HTTPS)

server {
    listen 443 ssl;
    server_name cdn.example.com;

    ssl_certificate /etc/letsencrypt/live/tls.crt;
    ssl_certificate_key /etc/letsencrypt/live/tls.key;

    proxy_cache my_cache;
    proxy_pass http://origin-server;
    proxy_set_header Host $host;
}

✅ 这样做的好处

  • Let’s Encrypt 自动签发 & 续期
  • 无需手动操作证书文件
  • Nginx 重启后直接加载最新证书
  • 可结合 多个 DaemonSet 在每个节点多副本运行

我可以帮你直接把 “多 DaemonSet + 缓存 + 自动 HTTPS” 合成一份完整可运行的 YAML 配置, 你 apply 一下就能跑起来。

要我直接帮你生成这份一体化的可用版本吗?这样你就能直接部署你的 CDN 边缘节点了。