在 Kubernetes 里给 Ingress 配置 HTTPS,几乎是应用上线前的必做项。很多同学第一次接触 Rancher 时,都会有一个常见问题:
Ingress 的 HTTPS 证书,能不能直接在 Rancher 里生成?应该怎么做?
先说结论:
Rancher 本身通常不是证书签发者,它更像是一个管理入口。
在实际使用中,Ingress 的 HTTPS 证书一般有三种获取方式:
- 已经有现成证书,直接上传到 Kubernetes
- 使用
cert-manager自动申请和续期证书 - 生成自签名证书,用于测试或内网环境
如果是正式生产环境,最推荐的是:
cert-manager + Let's Encrypt + Ingress
这套方案自动化程度高,证书可自动续期,也是目前 Kubernetes 中最主流的做法。
一、先理解:Rancher 在这里扮演什么角色?
很多人会误以为 Rancher 会"生成" HTTPS 证书。实际上,Rancher 更常做的是:
- 帮你管理集群里的
Secret - 帮你创建和编辑
Ingress - 在 UI 里展示 TLS 相关资源
- 如果集群安装了
cert-manager,也可以帮你管理证书资源
也就是说,HTTPS 最终还是落在 Kubernetes 资源上,比如:
SecretIngressIssuerClusterIssuerCertificate
Rancher 只是把这些操作做得更可视化。
二、最常见的三种 HTTPS 证书方案
方案 1:上传已有证书
如果你已经从云厂商、CA 机构,或者公司内部 PKI 拿到了证书文件:
tls.crttls.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 原生资源集成好
- 生产环境使用广泛
整体流程
流程并不复杂:
- 在集群里安装
cert-manager - 创建
ClusterIssuer,配置 Let's Encrypt - 在 Ingress 上增加证书注解
- cert-manager 自动完成申请,并生成 TLS Secret
- 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-prodtls.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 中这样操作:
- 进入目标
Cluster - 进入对应的
Project / Namespace - 打开
Secrets - 创建一个
TLS Secret - 填入证书和私钥内容
- 编辑或创建
Ingress - 在 TLS 配置中选择刚才创建的 Secret
本质上,这和命令行执行 kubectl create secret tls 是同一件事。
场景 2:你使用 cert-manager
如果集群已经安装了 cert-manager,你可以:
- 在 Rancher 中创建
ClusterIssuer或Issuer - 创建或编辑 Ingress
- 给 Ingress 加上 cert-manager 的注解
- 指定
tls.secretName - 等待 cert-manager 自动签发
也就是说,Rancher UI 只是让你更方便地操作 Kubernetes 资源 ,但证书生成逻辑依然是由 cert-manager 完成的。
七、正式环境应该选哪种方式?
这件事其实不复杂,可以直接按场景选。
如果你是公网服务
选择:
cert-manager + Let's Encrypt
原因:
- 自动化程度高
- 免费
- 自动续期
- 社区成熟方案
如果你是企业内网服务
选择:
公司内部 CA / 企业 PKI / 已有证书上传
原因:
- 内网域名很多无法走公网 ACME 验证
- 企业通常有自己的信任体系
- 安全审计更容易统一管理
如果你只是临时测试
选择:
自签名证书
原因:
- 最快
- 零依赖
- 足够验证链路
八、实际部署中常见问题
1. Ingress 配了 TLS,但证书一直不生效
通常排查这几个点:
secretName是否存在Ingress和Secret是否在同一个命名空间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 接入流程,可以按下面这个顺序推进:
- 安装 Ingress Controller
- 安装 cert-manager
- 配置
ClusterIssuer - 给域名添加 DNS 解析
- 创建带 TLS 配置和 cert-manager 注解的 Ingress
- 验证 Secret、Certificate、HTTPS 是否生效
这就是目前 Rancher 管理 Kubernetes 集群中,最主流也最稳妥的做法。