K3s + NGINX Ingress Controller + Cert-Manager 最佳实践:从 HTTPS 头疼到自动化

最近在K3s 集群内搭建服务的时候,我深刻体会到一个问题:新增、管理和维护 HTTPS 证书真的是一件让人头疼的事情。尤其是当集群里有多个服务,有些服务需要独立域名和证书时,阿里云上手动申请下载证书,在集群内手动创建以及后续续期的替换,这个过程很折磨。

为了彻底解决这个问题,我总结了自己在 K3s 上使用 NGINX Ingress Controller + Cert-Manager 的实践经验,希望能帮你少踩坑、快速上手。


一、为什么要用 NGINX + Cert-Manager?

官方最佳实践:https://cert-manager.io/docs/tutorials/acme/nginx-ingress

NGINX Ingress Controller 透明、可控,配合 Cert-Manager,可以做到:

  1. 自动申请和续期 Let’s Encrypt 证书

  2. 统一管理 TLS 配置

换句话说,就是把手动 HTTPS 的“头疼”问题彻底交给 Kubernetes 和 Cert-Manager 自动化完成。


二、k3s集群部署

安装 k3s 并禁用 Traefik:

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC="--disable=traefik" sh -

三、部署 NGINX Ingress Controller

我选择 Helm 安装 NGINX,因为:

  • 可维护性高

  • 支持多副本高可用

  • 支持各种自定义资源配置

默认安装:

# 添加仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

# 拉取chart
helm fetch ingress-nginx/ingress-nginx --untar

# 部署ng控制器
helm install ingress-nginx ingress-nginx -n kube-system

四、部署 Cert-Manager 并自动化 HTTPS

Cert-Manager 是我解决 HTTPS “头疼”的关键。它可以:

  • 自动向 Let’s Encrypt 申请证书

  • 自动续期

安装步骤:

# 部署cert-manager
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.19.2/cert-manager.yaml

配置 ClusterIssuer

这是我在生产环境里常用的配置:

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

五、Ingress 配置示例

我通常用如下 Ingress 规范,既清晰又方便扩展:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: home
  namespace: dev
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
      - gengbo.top
    secretName: gengbo.top-tls
  rules:
  - host: gengbo.top
    http:
      paths:
      - path: /
        pathType: ImplementationSpecific
        backend:
          service:
            name: home
            port:
              number: 80

应用后,Cert-Manager 会自动去申请证书,生成 gengbo.top-tls Secret。


六、总结

从最开始“新增 HTTPS 服务很头疼”,到现在 K3s + NGINX + Cert-Manager 自动化管理证书,整个流程大大简化:

  • 新增服务:只需要写一个 Ingress

  • 自动 HTTPS:Cert-Manager 自动申请和续期

  • 运维方便:统一管理证书、日志可查