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

如何通过Kubernetes(k3s+Istio)暴露集群外的局域网应用?

解决方案:通过Istio直接暴露集群外应用

不需要额外部署HAProxy容器,Istio本身就能完成集群外服务的流量转发,以下是具体实现步骤:

1. 注册集群外服务到Kubernetes

首先需要创建Service和Endpoints资源,让Kubernetes和Istio感知到集群外的目标服务:

# external-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: external-home-app
  namespace: default # 可根据实际命名空间调整
spec:
  ports:
    - name: http
      port: 8123
      targetPort: 8123
---
apiVersion: v1
kind: Endpoints
metadata:
  name: external-home-app
  namespace: default
subsets:
  - addresses:
      - ip: 192.168.1.29
    ports:
      - port: 8123
        name: http

执行创建命令:

kubectl apply -f external-service.yaml

2. 配置Istio Gateway处理HTTPS流量

假设你已部署Istio Ingress网关,配置HTTPS监听并绑定你的公网证书:

# istio-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: external-app-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway # 匹配默认Istio Ingress网关标签
  servers:
    - port:
        number: 443
        name: https
        protocol: HTTPS
      tls:
        mode: SIMPLE
        credentialName: your-domain-cert # 替换为你的证书Secret名称
      hosts:
        - "your-public-domain.com" # 替换为你的公网域名

如果还未创建证书Secret,执行以下命令(需提前准备好tls.crt和tls.key文件):

kubectl create secret tls your-domain-cert --cert=tls.crt --key=tls.key -n istio-system

3. 配置Istio VirtualService转发流量

创建VirtualService,将Gateway接收的流量路由到注册的集群外服务:

# external-app-virtualservice.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: external-home-app-vs
  namespace: default
spec:
  hosts:
    - "your-public-domain.com"
  gateways:
    - istio-system/external-app-gateway # 关联上述Gateway
  http:
    - route:
        - destination:
            host: external-home-app.default.svc.cluster.local # 格式:服务名.命名空间.svc.cluster.local
            port:
              number: 8123

执行创建命令:

kubectl apply -f external-app-virtualservice.yaml

4. 路由器端口转发配置

在你的路由器上,将公网443端口的流量转发到Istio Ingress网关的局域网IP的443端口。获取网关IP的命令:

kubectl get svc istio-ingressgateway -n istio-system

找到EXTERNAL-IP列的地址,在路由器设置:外部443 → 该IP的443端口。

验证与排查

  1. 检查资源状态:
kubectl get gateways -n istio-system
kubectl get virtualservices -n default
kubectl get service external-home-app -n default
kubectl get endpoints external-home-app -n default
  1. 测试访问:通过https://your-public-domain.com访问目标应用,验证流量是否正常转发。
  2. 常见问题:
    • 超时:检查网关IP是否能在局域网内访问,路由器端口转发规则是否生效
    • TLS错误:检查证书Secret内容是否正确,Gateway的credentialName是否匹配
    • 流量无法转发:检查VirtualService的destination.host格式,Endpoints的IP/端口是否与目标应用一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:35:41