如何在 Kubernetes 入口中指定自定义 Istio 入口网关

How to specify custom Istio ingress gateway in Kubernetes ingress

我部署了 Istio using the operator 并添加了一个只能从特定源范围(我们的 VPN)访问的自定义入口网关。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: ground-zero-ingressgateway
spec:
  profile: empty
  components:
    ingressGateways:
      - name: istio-ingressgateway
        enabled: true
      - name: istio-vpn-ingressgateway
        label:
          app: istio-vpn-ingressgateway
          istio: vpn-ingressgateway
        enabled: true
        k8s:
          serviceAnnotations:
            ...
          service:
            loadBalancerSourceRanges:
              - "x.x.x.x/x"

现在我想使用 Kubernetes Ingress resource 配置 Istio 以在服务网格集群之外公开服务。我使用 kubernetes.io/ingress.class 注释告诉 Istio 网关控制器它应该处理这个 Ingress.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.class: istio
spec:
   ...

现在使用哪个入口网关控制器(istio-ingressgatewayistio-vpn-ingressgateway)?有没有办法指定应该使用哪一个?

P.S。我知道我可以创建一个 VirtualService 并指定正确的网关,但我们希望通过使用注释指定正确的入口控制器来编写一个在没有 Istio 的情况下也能工作的清单。

您可以创建一个入口 class 来引用默认部署在 istio-system 命名空间中的入口控制器。这种带有入口的配置将起作用,但是据我目前所知,这仅用于向后兼容。如果你想使用 istio ingress 控制器功能,你应该改用 istio 网关和虚拟服务:

Using the Istio Gateway, rather than Ingress, is recommended to make use of the full feature set that Istio offers, such as rich traffic management and security features.

如果此解决方案不是您的最佳选择,您应该使用例如nginx ingress controller and you can still bind it with annotations (deprecated) or using IngressClass. To my present knowledge it is not possible to bind this ingress class with an additional ingress controller. If you need an explanation, documentation, you should create an issue on github.

总结:推荐的选项是使用带有虚拟服务的网关。另一种可能性是单独使用 nginx 入口和不同的 classes 以及它们的入口资源。