Kubernetes TCP场景下主机与服务Ingress映射配置问题
基于Nginx Ingress控制器暴露TCP服务的解决方案
故障根因确认
你之前使用的标准Ingress资源是Kubernetes原生定义的七层HTTP/HTTPS流量路由规则,仅能识别HTTP请求头中的Host字段实现子域名分发,无法处理SQL Server这类TCP协议的四层流量,配置不生效符合预期。
具体操作步骤
你使用的Nginx Ingress控制器本身支持TCP/UDP服务暴露,可按以下步骤配置:
调整Nginx Ingress控制器启动参数
确认Nginx Ingress控制器的启动命令中已添加--tcp-services-configmap参数,指定存储TCP路由规则的ConfigMap地址,格式为<命名空间>/<configmap名称>,通用配置为--tcp-services-configmap=ingress-nginx/tcp-services。创建TCP路由规则ConfigMap
在Nginx Ingress控制器所在命名空间下,创建名为tcp-services的ConfigMap,示例配置如下:
apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: ingress-nginx data: # 键为Ingress控制器监听端口,值格式为<服务命名空间>/<服务名>:<服务端口> 1433: "ingress-basic/mssql-linux:1433"
- 开放Ingress Service对应端口
修改Nginx Ingress关联的LoadBalancer类型Service配置,新增1433端口的暴露规则,让集群负载均衡IP开放该端口接收流量:
spec: ports: - name: http port: 80 targetPort: http protocol: TCP - name: https port: 443 targetPort: https protocol: TCP # 新增SQL Server端口暴露配置 - name: mssql port: 1433 targetPort: 1433 protocol: TCP
子域名复用说明
TCP协议本身没有类似HTTP Host字段的域名标识,无法在同一个端口上通过不同三级子域名区分不同TCP服务,多个TCP服务复用同一个负载均衡IP时,需要为每个服务分配独立的监听端口。
你可以将microname3.subdomain.domain.com的DNS解析指向现有负载均衡IP,客户端通过microname3.subdomain.domain.com:1433即可访问SQL Server服务,实现域名复用的效果。
内容的提问来源于stack exchange,提问作者Stavros Koureas
相关产品推荐
相关产品推荐

