K8s 中 Ingress 的 HTTPS 证书 如何生成?

在 Kubernetes 里给 Ingress 配置 HTTPS,几乎是应用上线前的必做项。很多同学第一次接触 Rancher 时,都会有一个常见问题:

Ingress 的 HTTPS 证书,能不能直接在 Rancher 里生成?应该怎么做?

先说结论:

Rancher 本身通常不是证书签发者,它更像是一个管理入口。

在实际使用中,Ingress 的 HTTPS 证书一般有三种获取方式:

  1. 已经有现成证书,直接上传到 Kubernetes
  2. 使用 cert-manager 自动申请和续期证书
  3. 生成自签名证书,用于测试或内网环境

如果是正式生产环境,最推荐的是:

cert-manager + Let's Encrypt + Ingress

这套方案自动化程度高,证书可自动续期,也是目前 Kubernetes 中最主流的做法。


一、先理解:Rancher 在这里扮演什么角色?

很多人会误以为 Rancher 会"生成" HTTPS 证书。实际上,Rancher 更常做的是:

  • 帮你管理集群里的 Secret
  • 帮你创建和编辑 Ingress
  • 在 UI 里展示 TLS 相关资源
  • 如果集群安装了 cert-manager,也可以帮你管理证书资源

也就是说,HTTPS 最终还是落在 Kubernetes 资源上,比如:

  • Secret
  • Ingress
  • Issuer
  • ClusterIssuer
  • Certificate

Rancher 只是把这些操作做得更可视化。


二、最常见的三种 HTTPS 证书方案

方案 1:上传已有证书

如果你已经从云厂商、CA 机构,或者公司内部 PKI 拿到了证书文件:

  • tls.crt
  • tls.key

那么最简单的方式,就是把它们创建成 Kubernetes 的 TLS Secret。

创建 TLS Secret

bash 复制代码
kubectl create secret tls my-tls \
  --cert=tls.crt \
  --key=tls.key \
  -n your-namespace

在 Ingress 中引用

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app
  namespace: your-namespace
spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - app.example.com
      secretName: my-tls
  rules:
    - host: app.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-service
                port:
                  number: 80

适用场景

  • 企业已经统一采购证书
  • 公司有内部 CA
  • 证书由安全团队统一发放
  • 只想快速接入 HTTPS,不引入额外组件

这是最直接 的方式,但缺点也很明显:

证书续期要人工处理。


三、推荐方案:使用 cert-manager 自动申请 HTTPS 证书

如果你的服务对外提供访问,并且域名已经能正确解析到 Ingress 出口,那么最推荐使用 cert-manager

它的优点非常明显:

  • 自动签发证书
  • 自动续期
  • 和 Kubernetes 原生资源集成好
  • 生产环境使用广泛

整体流程

流程并不复杂:

  1. 在集群里安装 cert-manager
  2. 创建 ClusterIssuer,配置 Let's Encrypt
  3. 在 Ingress 上增加证书注解
  4. cert-manager 自动完成申请,并生成 TLS Secret
  5. Ingress 自动启用 HTTPS

四、如何在 Rancher 管理的集群中使用 cert-manager

1. 安装 cert-manager

你可以通过 Helm 安装,也可以通过 Rancher 应用市场安装。

无论哪种方式,目标都是在集群中部署 cert-manager 相关组件。

如果使用 Helm,常见安装方式如下:

bash 复制代码
helm repo add jetstack https://charts.jetstack.io
helm repo update

helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --set crds.enabled=true

安装完成后,可以检查 Pod 是否正常:

bash 复制代码
kubectl get pods -n cert-manager

2. 创建 Let's Encrypt 的 ClusterIssuer

下面是一个生产环境可用的 ClusterIssuer 示例:

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

这里有两个关键点:

email

用于接收证书到期提醒,建议填写真实邮箱。

class: nginx

这里必须和你实际使用的 Ingress Controller 一致。

如果你用的是 NGINX Ingress Controller,填 nginx;如果是别的控制器,要对应修改。

应用配置:

bash 复制代码
kubectl apply -f clusterissuer.yaml

查看是否创建成功:

bash 复制代码
kubectl get clusterissuer

3. 在 Ingress 中开启自动签发

接下来,在你的 Ingress 中增加 cert-manager 注解:

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app
  namespace: your-namespace
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - app.example.com
      secretName: app-example-com-tls
  rules:
    - host: app.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-service
                port:
                  number: 80

这里最关键的是这两个配置:

  • cert-manager.io/cluster-issuer: letsencrypt-prod
  • tls.secretName: app-example-com-tls

cert-manager 会自动去申请证书,并把证书存到 app-example-com-tls 这个 Secret 中。

应用之后,检查资源状态:

bash 复制代码
kubectl apply -f ingress.yaml
kubectl get certificate -n your-namespace
kubectl get secret -n your-namespace

如果一切正常,浏览器访问 https://app.example.com 时,就能看到有效证书。


五、如果只是测试环境,可以用自签名证书

如果你只是本地测试、内网联调,或者临时验证 HTTPS 能不能通,那么完全可以使用自签名证书。

生成自签名证书

bash 复制代码
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout tls.key \
  -out tls.crt \
  -subj "/CN=app.example.com/O=app.example.com"

然后创建 Kubernetes Secret:

bash 复制代码
kubectl create secret tls my-tls \
  --cert=tls.crt \
  --key=tls.key \
  -n your-namespace

再在 Ingress 中引用这个 Secret 即可。

自签名证书的特点

优点:

  • 不依赖外部 CA
  • 内网测试方便

缺点:

  • 浏览器会提示"不受信任"
  • 不适合生产环境
  • 需要客户端手动信任证书

所以它更适合:

  • 开发环境
  • 测试环境
  • 内网系统
  • 临时验证 HTTPS 流程

六、在 Rancher UI 中怎么操作?

如果你希望尽量通过 Rancher 页面完成配置,思路也一样。

场景 1:你已经有证书

可以在 Rancher 中这样操作:

  1. 进入目标 Cluster
  2. 进入对应的 Project / Namespace
  3. 打开 Secrets
  4. 创建一个 TLS Secret
  5. 填入证书和私钥内容
  6. 编辑或创建 Ingress
  7. 在 TLS 配置中选择刚才创建的 Secret

本质上,这和命令行执行 kubectl create secret tls 是同一件事。


场景 2:你使用 cert-manager

如果集群已经安装了 cert-manager,你可以:

  1. 在 Rancher 中创建 ClusterIssuerIssuer
  2. 创建或编辑 Ingress
  3. 给 Ingress 加上 cert-manager 的注解
  4. 指定 tls.secretName
  5. 等待 cert-manager 自动签发

也就是说,Rancher UI 只是让你更方便地操作 Kubernetes 资源 ,但证书生成逻辑依然是由 cert-manager 完成的。


七、正式环境应该选哪种方式?

这件事其实不复杂,可以直接按场景选。

如果你是公网服务

选择:

cert-manager + Let's Encrypt

原因:

  • 自动化程度高
  • 免费
  • 自动续期
  • 社区成熟方案

如果你是企业内网服务

选择:

公司内部 CA / 企业 PKI / 已有证书上传

原因:

  • 内网域名很多无法走公网 ACME 验证
  • 企业通常有自己的信任体系
  • 安全审计更容易统一管理

如果你只是临时测试

选择:

自签名证书

原因:

  • 最快
  • 零依赖
  • 足够验证链路

八、实际部署中常见问题

1. Ingress 配了 TLS,但证书一直不生效

通常排查这几个点:

  • secretName 是否存在
  • IngressSecret 是否在同一个命名空间
  • host 是否和证书中的域名一致
  • ingressClassName 是否正确
  • Ingress Controller 是否正常工作

2. cert-manager 一直申请失败

常见原因:

  • 域名没有正确解析到 Ingress 出口 IP
  • 80 端口没有开放,HTTP-01 验证失败
  • ClusterIssuer 配置错误
  • Ingress Class 不匹配
  • Let's Encrypt 访问频率限制

3. 为什么 Rancher 里看得到 Ingress,但证书没自动生成?

因为 Rancher 只是管理入口,不会替你自动签发证书

如果没有安装 cert-manager,或者没有正确配置 Issuer/ClusterIssuer,那证书自然不会出现。


九、总结

如果你问的是:

"K8s 中 Ingress 的 HTTPS 证书,在 Rancher 中如何生成?"

更准确的答案应该是:

证书通常不是由 Rancher 直接生成,而是由 Kubernetes 中的 Secret 或 cert-manager 来提供,Rancher 负责管理和配置这些资源。

可以这样理解:

  • 已有证书:上传到 Secret,Ingress 直接引用
  • 公网生产环境 :用 cert-manager + Let's Encrypt 自动生成
  • 测试环境:用自签名证书快速验证

如果只能给一个建议,那就是:

生产环境优先使用 cert-manager,Rancher 负责配置和可视化管理。


十、附:一个完整的生产可用思路

如果你要做一套标准的 HTTPS 接入流程,可以按下面这个顺序推进:

  1. 安装 Ingress Controller
  2. 安装 cert-manager
  3. 配置 ClusterIssuer
  4. 给域名添加 DNS 解析
  5. 创建带 TLS 配置和 cert-manager 注解的 Ingress
  6. 验证 Secret、Certificate、HTTPS 是否生效

这就是目前 Rancher 管理 Kubernetes 集群中,最主流也最稳妥的做法。

相关推荐
开发者联盟league1 小时前
使用Jenkins整合Sonarqube/Gitlab/Harbor/Kubernetes的Demo工程
kubernetes·gitlab·jenkins
Patrick_Wilson1 小时前
Node.js SSR 内存治理:为什么 --max-old-space-size 不等于进程内存
kubernetes·node.js·v8
开发者联盟league1 小时前
使用k8s安装Jenkins
容器·kubernetes·jenkins
曲幽2 小时前
写爬虫时用了代理还被封?Python 代理的那些隐藏坑,我替你踩明白了
python·http·https·proxy·socks·requests·socks5·proxies
正经教主2 小时前
【docker基础】 第七课:Docker Compose 多容器实战
运维·docker·容器
正经教主2 小时前
【docker基础】Redis的docker部署
redis·docker·容器
成为你的宁宁2 小时前
【基于 Prometheus Operator 实现 K8s 环境下 Redis Cluster 集群监控部署】
redis·kubernetes·prometheus
是一个Bug3 小时前
Docker 与 Kubernetes:从“集装箱”到“远洋舰队”
docker·容器·kubernetes
java_cj3 小时前
阅读 k8s 源码的准备工作
云原生·容器·kubernetes