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

37 天前
 fantasy55

最近在学习 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 上加一层反代才可以

912 次点击
所在节点    Kubernetes
9 条回复
defunct9
37 天前
MetalLB 是要配个池子,/32 单独一个 ip 不行吧。看看日志
fantasy55
37 天前
hyhnm
37 天前
后续如何?
fantasy55
37 天前
@hyhnm 试了很多种办法,都没成功,目前是加了一层反代可以访问到
naoying
36 天前
防火墙?
naoying
36 天前
在主机抓包,看流量是否进入了 metallb 。
serialt
36 天前
metallb layer2 模式需要分配一个网段(包含单个 ip),这个 ip 会绑定到网卡上,云服务器不支持这种情况
fantasy55
35 天前
@serialt 确实是新建了一个 route ( vm 的公网 ip )到 kube-ipvs 网卡上,那就是说 vm 的这种情况网络是不通的? 只能本地使用吗?
hyhnm
13 天前
@fantasy55 #4 我尝试给了 ip 池,当时可以,过了几个星期后才 ssl timeout ,连不上

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1064388

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX