You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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:

  1. 安装Cert-Manager
    下载对应版本的Cert-Manager部署yaml文件,执行安装:
    kubectl apply -f cert-manager.yaml
    # 验证安装状态
    kubectl get pods -n cert-manager
    
  2. 配置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
    
  3. 配置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: 80
    
    执行创建命令:
    kubectl apply -f client-ingress.yaml
    

工作机制

  1. Cert-Manager监听Ingress中的tls配置,当检测到未配置证书的域名时,通过ClusterIssuer向Let's Encrypt发起证书申请;
  2. Let's Encrypt通过HTTP-01挑战验证域名所有权:Cert-Manager临时创建Ingress和Pod,用于响应验证请求;若用泛域名证书,推荐用DNS-01挑战(直接通过DNS记录验证,适配所有子域名);
  3. 验证通过后,Let's Encrypt签发证书,Cert-Manager将证书存入指定的Secret;
  4. Ingress Controller读取Secret中的证书,在30500端口(负载均衡转发443至此)终止SSL连接,将解密后的HTTP流量转发至后端服务;
  5. Cert-Manager自动监控证书有效期,在过期前30天自动续期,无需手动操作。

内容的提问来源于stack exchange,提问作者DevCatOps

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 23:27:38