能否使用ingress-nginx将流量路由至非Kubernetes基础设施节点?
可行!用ingress-nginx路由流量到K8s外部机器的实现方案
当然可行!我自己在生产环境中就用过ingress-nginx把流量转发到集群外的虚拟机和物理机,核心思路是通过Kubernetes的Service和Endpoints资源把外部机器“接入”到集群的服务发现体系中,再让Ingress规则指向这些Service即可。下面给你详细拆解两种常用的实现方法:
方法一:使用ExternalName Service(适合有域名的外部服务)
如果你的外部机器可以通过域名访问,这种方法最简单,直接创建ExternalName类型的Service来映射外部域名:
- 创建ExternalName Service
apiVersion: v1 kind: Service metadata: name: external-machine-service spec: type: ExternalName externalName: vm-01.your-domain.com # 替换成外部机器的域名 ports: - port: 80 # Service暴露的端口 targetPort: 8080 # 外部机器上服务实际监听的端口
- 创建指向该Service的Ingress规则
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: external-ingress annotations: nginx.ingress.kubernetes.io/backend-protocol: "HTTP" # 外部服务是HTTPS的话改成HTTPS spec: ingressClassName: nginx # 确保和你的ingress-nginx控制器的className一致 rules: - host: external.your-domain.com # 用来访问外部服务的域名 http: paths: - path: / pathType: Prefix backend: service: name: external-machine-service port: number: 80
方法二:使用ClusterIP Service + Endpoints(适合直接指定IP的外部机器)
如果外部机器只有IP没有域名,或者你不想依赖DNS解析,这种方法更灵活,直接通过Endpoints绑定外部IP,再用ClusterIP Service关联:
- 创建Endpoints资源(注意name要和后续的Service名称完全一致)
apiVersion: v1 kind: Endpoints metadata: name: external-machine-ip-service subsets: - addresses: - ip: 192.168.1.100 # 替换成外部机器的实际IP # 可以添加多个ip实现简单负载均衡: # - ip: 192.168.1.101 ports: - port: 8080 # 外部机器上服务的监听端口
- 创建ClusterIP Service(不指定selector,自动关联上面的Endpoints)
apiVersion: v1 kind: Service metadata: name: external-machine-ip-service spec: type: ClusterIP ports: - port: 80 # Service暴露的端口 targetPort: 8080 # 和Endpoints里的端口一致
- 创建Ingress规则(和方法一类似,只需把service.name改成
external-machine-ip-service即可)
关键注意事项
- 网络连通性检查:确保ingress-nginx控制器所在的Node节点能ping通外部机器,并且外部机器的服务端口(比如8080)没有被防火墙、安全组拦截。
- HTTPS服务适配:如果外部服务是HTTPS,需要调整Ingress的annotation:
如果外部机器用的是自签名证书,还可以添加nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"nginx.ingress.kubernetes.io/ssl-verify-client: "off"来跳过证书验证(生产环境不建议,最好导入可信证书)。 - 负载均衡扩展:如果有多个外部机器,只需在Endpoints里添加多个IP,ingress-nginx会自动以轮询的方式转发流量。
- 测试验证:可以在集群内部的Pod里执行
curl http://external.your-domain.com,或者从外部访问该域名,确认流量是否成功转发到外部机器。
内容的提问来源于stack exchange,提问作者yee379
相关产品推荐
相关产品推荐

