Istio Ingress结合cert-manager实现多主机TLS passthrough配置咨询
方案实现步骤
PASSTHROUGH模式下Istio Ingress Gateway不会处理TLS终止,仅通过SNI字段匹配路由规则,加密流量会直接透传给后端服务,因此证书由后端服务自行持有即可,结合cert-manager的配置逻辑非常简便,步骤如下:
- 第一步:通过cert-manager统一签发证书
为每个后端服务(或一组同域名后缀的服务)申请对应域名的证书,支持单域名、多SAN域名、通配符域名三种形式,cert-manager会自动将签发后的证书存储为Kubernetes Secret,只需保证Secret和后端服务在同一Namespace下即可。 - 第二步:后端服务挂载证书
- 普通服务:将cert-manager生成的Secret直接挂载到Pod的指定路径,服务端程序从对应路径读取证书文件完成TLS配置。
- Strimzi管理的Kafka集群:直接在Kafka自定义资源的
spec.listeners配置段中,给需要对外暴露的TLS监听器配置certManagerRef字段关联cert-manager生成的Secret,Strimzi会自动完成证书挂载、Kafka服务端TLS配置,无需手动操作。
- 第三步:配置Istio路由规则
无需在网关侧配置任何证书相关参数,仅需通过Gateway和VirtualService定义SNI匹配规则即可,多主机场景直接在hosts字段添加对应域名即可:
Gateway示例配置:
单域名路由VirtualService示例:apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: passthrough-gateway spec: selector: istio: ingressgateway # 对应你的Istio Ingress Gateway标签 servers: - port: number: 443 name: tls-passthrough protocol: TLS tls: mode: PASSTHROUGH hosts: - kafka1.example.com - kafka2.example.com - other-app.example.comapiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: kafka1-passthrough-vs spec: hosts: - kafka1.example.com gateways: - passthrough-gateway tls: - match: - port: 443 sniHosts: - kafka1.example.com route: - destination: host: kafka-bootstrap-service # 对应后端Kafka的服务名 port: number: 9093 # 对应后端Kafka TLS监听器端口
优化建议
如果对外暴露的域名数量较多,可以按业务线拆分多个Gateway资源分别管理不同域名组,避免单Gateway配置过长难以维护;同一一级域名下的子域名可以统一使用cert-manager签发通配符证书,减少证书申请、维护的工作量。
内容的提问来源于stack exchange,提问作者astrak
相关产品推荐
相关产品推荐

