如何通过Ingress在Kubernetes中正确暴露多客户端应用
解答:Hetzner Kubernetes集群多子域名访问与SSL配置问题
1. 需求是否可行?
完全可行。这是Kubernetes Ingress的标准应用场景:
- 你已部署Hetzner Cloud Controller Manager,能正常关联集群与Hetzner负载均衡;
- 当前负载均衡的端口转发规则(443→30500、80→30379)适配Ingress Controller的NodePort暴露方式,流量可正常进入集群;
- 只需通过Ingress资源配置不同子域名与后端服务的路由映射,就能实现外部访问。
2. 是否需要配置*.cluster.example.com的DNS记录?
需要,推荐配置泛域名A记录:
- 将
*.cluster.example.com解析到Hetzner负载均衡的公网IP。这样所有clientN.cluster.example.com子域名都会指向同一负载均衡,流量统一进入集群; - 若仅需少量固定子域名,也可单独配置每个子域名的A记录,但泛域名更便于后续扩展,无需重复修改DNS。
3. SSL证书配置方法及工作机制
配置方法(用Cert-Manager自动化管理)
Cert-Manager是Kubernetes生态中用于SSL证书自动申请、续期的工具,适配Let's Encrypt等CA:
- 安装Cert-Manager
下载对应版本的Cert-Manager部署yaml文件,执行安装:kubectl apply -f cert-manager.yaml # 验证安装状态 kubectl get pods -n cert-manager - 配置ClusterIssuer(全局证书签发者)
创建ClusterIssuer用于对接Let's Encrypt,示例yaml:
执行创建命令: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: nginx # 替换为你的Ingress Controller的class(如nginx)kubectl apply -f cluster-issuer.yaml - 配置Ingress并关联证书
创建Ingress资源,指定子域名路由与TLS配置,示例yaml:
执行创建命令:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: client-app-ingress annotations: cert-manager.io/cluster-issuer: letsencrypt-prod # 关联上述ClusterIssuer spec: tls: - hosts: - client1.cluster.example.com - client2.cluster.example.com # 泛域名场景可替换为:- "*.cluster.example.com" secretName: client-app-tls # 证书将自动存储至此Secret rules: - host: client1.cluster.example.com http: paths: - path: / pathType: Prefix backend: service: name: client1-service # 替换为你的client1应用服务名 port: number: 80 - host: client2.cluster.example.com http: paths: - path: / pathType: Prefix backend: service: name: client2-service # 替换为你的client2应用服务名 port: number: 80kubectl apply -f client-ingress.yaml
工作机制
- Cert-Manager监听Ingress中的
tls配置,当检测到未配置证书的域名时,通过ClusterIssuer向Let's Encrypt发起证书申请; - Let's Encrypt通过HTTP-01挑战验证域名所有权:Cert-Manager临时创建Ingress和Pod,用于响应验证请求;若用泛域名证书,推荐用DNS-01挑战(直接通过DNS记录验证,适配所有子域名);
- 验证通过后,Let's Encrypt签发证书,Cert-Manager将证书存入指定的Secret;
- Ingress Controller读取Secret中的证书,在30500端口(负载均衡转发443至此)终止SSL连接,将解密后的HTTP流量转发至后端服务;
- Cert-Manager自动监控证书有效期,在过期前30天自动续期,无需手动操作。
内容的提问来源于stack exchange,提问作者DevCatOps
相关产品推荐
相关产品推荐

