ingress-nginx证书管理:Let's Encrypt自动化

ingress-nginx证书管理:Let's Encrypt自动化

【免费下载链接】ingress-nginx Ingress-NGINX Controller for Kubernetes 【免费下载链接】ingress-nginx 项目地址: https://gitcode.com/GitHub_Trending/in/ingress-nginx

在Kubernetes集群中管理TLS证书一直是运维人员的痛点。手动创建、更新和轮换证书不仅繁琐,还容易出错。本文将详细介绍如何使用ingress-nginx结合cert-manager实现Let's Encrypt证书的自动化管理,让你的HTTPS服务永不过期。

为什么需要自动化证书管理?

传统证书管理面临的主要挑战:

挑战传统方案自动化方案
证书申请手动操作自动申请
证书更新手动续期自动续期
证书部署手动更新Secret自动同步
错误处理人工监控自动重试

架构概览

mermaid

环境准备

1. 安装ingress-nginx

首先确保已安装ingress-nginx控制器:

# 使用Helm安装
helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace

# 或者使用manifest文件
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml

2. 安装cert-manager

cert-manager是证书管理的核心组件:

# 添加jetstack仓库
helm repo add jetstack https://charts.jetstack.io
helm repo update

# 安装cert-manager
helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.8.0 \
  --set installCRDs=true

配置Let's Encrypt签发器

创建ClusterIssuer

ClusterIssuer是集群级别的证书签发器配置:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    email: admin@example.com
    accountKeySecretRef:
      name: letsencrypt-staging-account-key
    solvers:
    - http01:
        ingress:
          class: nginx
---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: admin@example.com
    accountKeySecretRef:
      name: letsencrypt-prod-account-key
    solvers:
    - http01:
        ingress:
          class: nginx

自动化证书申请配置

Ingress资源配置

在Ingress资源中添加cert-manager注解,实现自动化证书管理:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  annotations:
    # 指定cert-manager签发器
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    # 其他ingress-nginx注解
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - app.example.com
    secretName: app-example-com-tls  # cert-manager将自动创建此Secret
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-app-service
            port:
              number: 80

证书状态监控

查看证书状态

# 查看Certificate资源状态
kubectl get certificates

# 查看详细证书信息
kubectl describe certificate app-example-com-tls

# 查看CertificateRequest状态
kubectl get certificaterequests

# 查看Order状态(ACME订单)
kubectl get orders

常见状态说明

状态含义处理建议
Ready证书就绪正常状态
Pending等待处理检查网络或配置
Failed申请失败查看事件日志
Unknown状态未知检查cert-manager状态

高级配置选项

自定义证书参数

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: my-app-certificate
spec:
  secretName: my-app-tls-secret
  duration: 2160h # 90天
  renewBefore: 720h # 30天前开始续期
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  commonName: app.example.com
  dnsNames:
  - app.example.com
  - www.example.com
  usages:
  - server auth
  - client auth

多域名证书配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: multi-domain-ingress
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - app1.example.com
    - app2.example.com
    - api.example.com
    secretName: multi-domain-tls
  rules:
  - host: app1.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: app1-service
            port:
              number: 80
  - host: app2.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: app2-service
            port:
              number: 80

故障排除指南

常见问题及解决方案

  1. 证书申请失败

    # 查看cert-manager日志
    kubectl logs -n cert-manager deploy/cert-manager
    
    # 查看具体Order资源
    kubectl describe order <order-name>
    
  2. HTTP-01挑战失败

    • 检查ingress-nginx是否正常运行
    • 验证域名解析是否正确
    • 检查网络策略是否允许流量
  3. 证书未自动创建

    # 检查ClusterIssuer状态
    kubectl describe clusterissuer letsencrypt-prod
    
    # 检查RBAC权限
    kubectl auth can-i create secrets --as=system:serviceaccount:cert-manager:cert-manager
    

监控和告警配置

建议配置监控告警,及时发现证书问题:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: cert-manager-alerts
spec:
  groups:
  - name: cert-manager
    rules:
    - alert: CertificateExpiringSoon
      expr: certmanager_certificate_expiration_timestamp_seconds - time() < 86400 * 7
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "证书即将过期"
        description: "证书 {{ $labels.name }} 将在7天内过期"
    
    - alert: CertificateRequestFailed
      expr: rate(certmanager_certificate_request_errors_total[5m]) > 0
      for: 2m
      labels:
        severity: critical
      annotations:
        summary: "证书申请失败"
        description: "检测到证书申请失败"

最佳实践

  1. 分阶段部署

    • 先在staging环境测试
    • 验证通过后再切换到production环境
  2. 证书备份

    # 备份证书Secret
    kubectl get secret app-example-com-tls -o yaml > certificate-backup.yaml
    
  3. 定期审计

    # 检查即将过期的证书
    kubectl get certificates -o wide
    
    # 查看证书详细过期时间
    kubectl get certificates -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.notAfter}{"\n"}{end}'
    
  4. 资源清理

    # 清理旧的CertificateRequest
    kubectl delete certificaterequests --field-selector status.conditions[0].status==True
    

总结

通过ingress-nginx与cert-manager的集成,我们实现了Let's Encrypt证书的全自动化管理。这种方案不仅减少了运维负担,还提高了系统的安全性和可靠性。关键优势包括:

  • ✅ 自动证书申请和续期
  • ✅ 无需人工干预
  • ✅ 支持多域名和通配符证书
  • ✅ 完善的监控和告警机制
  • ✅ 符合安全最佳实践

现在,你的Kubernetes集群已经具备了企业级的证书管理能力,可以安心地部署生产环境的HTTPS服务了。

【免费下载链接】ingress-nginx Ingress-NGINX Controller for Kubernetes 【免费下载链接】ingress-nginx 项目地址: https://gitcode.com/GitHub_Trending/in/ingress-nginx

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值