V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fantasy55
V2EX  ›  Kubernetes

istio 在 bare metal 机器上怎么暴露服务公网访问

  •  
  •   fantasy55 · 136 天前 · 1221 次点击
    这是一个创建于 136 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在学习 k8s 相关的知识,遇到外部不能访问的问题

    机器环境: 甲骨文 ARM 机器,上面安装了 k3s(已关闭 servicelb 和 traefik), istio(1.22.3), MetalLB (配置如下), bitnami/kafka(最新版本)

    网络环境:甲骨文的机器有公网 IP ,关闭了防火墙, 域名 kafka.example.com 配置在 Cloudflare 上, kafka 集群默认使用的是 bitnami/kafka 的 helm 配置文件(helm install my-kafka bitnami/kafka --version 30.0.3),修改了 listener 的 protocol 为 PLAINTEXT, 使用默认的 kraft 模式

    listeners:
      client:
        protocol: PLAINTEXT
      controller:
        protocol: PLAINTEXT
      interbroker:
        protocol: PLAINTEXT
      external:
        protocol: PLAINTEXT
    

    infra 配置文件: istio 配置 gateway.yaml

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: kafka-gateway
    spec:
      selector:
        istio: ingressgateway
      servers:
        - port:
            number: 80
            name: http
            protocol: HTTP
          hosts:
            - "kafka.example.com"
        - port:
            number: 9092
            name: kafka-tcp
            protocol: TCP
          hosts:
            - "kafka.example.com" # 这是 cloud 上面的可用域名
    

    virtualservice.yaml

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: kafka-virtualservice
    spec:
      hosts:
        - "kafka.example.com"
      gateways:
        - kafka-gateway
      tcp:
        - match:
          - port: 9092
          route:
          - destination:
              host: my-kafka-controller-headless
              port:
                number: 9092
    

    MetalLB 配置

    apiVersion: metallb.io/v1beta1
    kind: IPAddressPool
    metadata:
      name: metallb-pool
      namespace: metallb-system
    spec:
      addresses:
       - xxx.xxx.xxx.xxx/32 # 这里使用的是甲骨文机器的 公网 ip
    

    service 配置

    apiVersion: v1
    kind: Service
    metadata:
      name: istio-ingressgateway
      namespace: istio-system
      annotations:
        metallb.universe.tf/allow-shared-ip: "true"
    spec:
      selector:
        istio: ingressgateway
      ports:
        - port: 9092
          targetPort: 9092
          name: kafka
      type: LoadBalancer
    

    目前的问题 使用上面的配置启动之后,istio-ingressgateway 的 external-ip 那个看到配置的公网 ip ,在 VM 上 curl -v kafka.example.com:9092 或者 curl -v public-ip:9092 也有结果,但是在其他机器上访问或者我自己电脑上访问不到( telnet xxx.xxx.xx.xxx 9092 也没有结果 telnet: Unable to connect to remote host: Connection refused ), 这个是正常的现象吗,还是必须要在 VM 上加一层反代才可以

    9 条回复    2024-09-05 17:43:53 +08:00
    defunct9
        1
    defunct9  
       136 天前
    MetalLB 是要配个池子,/32 单独一个 ip 不行吧。看看日志
    hyhnm
        3
    hyhnm  
       136 天前 via iPhone
    后续如何?
    fantasy55
        4
    fantasy55  
    OP
       136 天前
    @hyhnm 试了很多种办法,都没成功,目前是加了一层反代可以访问到
    naoying
        5
    naoying  
       136 天前
    防火墙?
    naoying
        6
    naoying  
       136 天前
    在主机抓包,看流量是否进入了 metallb 。
    serialt
        7
    serialt  
       135 天前
    metallb layer2 模式需要分配一个网段(包含单个 ip),这个 ip 会绑定到网卡上,云服务器不支持这种情况
    fantasy55
        8
    fantasy55  
    OP
       135 天前
    @serialt 确实是新建了一个 route ( vm 的公网 ip )到 kube-ipvs 网卡上,那就是说 vm 的这种情况网络是不通的? 只能本地使用吗?
    hyhnm
        9
    hyhnm  
       112 天前
    @fantasy55 #4 我尝试给了 ip 池,当时可以,过了几个星期后才 ssl timeout ,连不上
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4816 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:39 · PVG 13:39 · LAX 21:39 · JFK 00:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.