如何在 istio 中编写自定义入口网关?

How to write a custom ingressgateway in istio?

我是 istio 的新手,我有一个简单的测试 yaml 文件,它有点长。我想要做的是为我的网关编写一个自定义入口网关服务。经过测试,错误的部分是最上面的ingressgateway定义。完整的 yaml 如下:

apiVersion: v1
kind: Service
metadata:
  name: batman-ingressgateway
  labels:
    app: batman-ingressgateway
spec:
  type: LoadBalancer
  selector:
    app: batman-ingressgateway
  ports:
  - port: 80
    targetPort: 80
    nodePort: 31389
    name: http
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: batman-gateway
spec:
  selector:
    app: batman-ingressgateway
      #istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: batman
spec:
  hosts:
  - "*"
  gateways:
  - batman-gateway
  http:
    - match:
      route:
      - destination:
          host: batman
          port:
            number: 8000
          subset: v1
        weight: 80
      - destination:
          host: batman
          port:
            number: 8000
          subset: v2
        weight: 20
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: batman-destination
spec:
  host: batman
  subsets:
  - name: v1
    labels:
      version: v1
      run: batman
  - name: v2
    labels:
      version: v2
      run: batman

我想从浏览器访问我的应用程序,地址如下:http://my_host_ip:31389/article。现在的问题是入口网关不会将流量路由到我的网关。有没有人可以帮助我? 谢谢

有关 istio 网关路由的文档在此处 https://istio.io/docs/tasks/traffic-management/ingress/ingress-control/

如果您查看网关规范,他们有

selector:
    istio: ingressgateway # use Istio default gateway implementation

当你有

selector:
    app: batman-ingressgateway
      #istio: ingressgateway

关于 VirtualService 的定义你可以看这里https://istio.io/docs/reference/config/networking/v1alpha3/virtual-service/ 您可以尝试将对 /article 的请求路由到您的服务

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: article-route
spec:
  hosts:
  - *
  http:
  - match:
    - uri:
        prefix: "/article"
    route:
    - destination:
        host: <name of your service>