Как настроить Istio EgressGateway с несколькими хостами?

#kubernetes #istio

#kubernetes #istio

Вопрос:

Я работаю над настройкой выходного шлюза. У меня есть простой, который обрабатывает трафик для одного хоста, настроенный на основе документов Istio, так что эта часть в порядке. Но когда я смотрю на то, как обрабатывать несколько хостов, я нахожу это словоблудие:

Чтобы направить несколько хостов через выходной шлюз, вы можете включить список хостов или использовать * для сопоставления всех в шлюзе. Поле subset в DestinationRule следует повторно использовать для дополнительных хостов.

На этой странице документов Istio.

К сожалению, я понятия не имею, что на самом деле означает вторая часть этого: «Поле подмножества в DestinationRule следует повторно использовать для дополнительных хостов». Честно говоря, я не совсем понимаю, как DR работает с EgressGateway в целом. Я больше привык к DR, который указывает набор модулей в качестве целевого в поле «подмножество». Итак, я не совсем понимаю, как DR подключает конкретный хост к шлюзу. Я попробовал следующее, но это не работает:

egress-gateway.yml

 apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: istio-egressgateway
  namespace: env-specific-egress-experiments
spec:
  selector:
    istio: egressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
     - news.ycombinator.com
     - www.slashdot.org
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: env-specific-egressgateway-dr
  namespace: env-specific-egress-experiments
spec:
  host: istio-egressgateway.istio-system.svc.cluster.local
  subsets:
  - name: hn
  - name: slashdot
  
 

service-entries.yml

 apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: news-ycombinator-com
  namespace: env-specific-egress-experiments
spec:
  hosts:
  - news.ycombinator.com
  ports:
  - number: 80
    name: http-port-hn
    protocol: HTTP
  - number: 443
    name: https-port-hn
    protocol: HTTPS
  resolution: DNS

---

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: www-slashdot-org
  namespace: env-specific-egress-experiments
spec:
  hosts:
  - www.slashdot.org
  ports:
  - number: 80
    name: http-port-slashdot
    protocol: HTTP
  - number: 443
    name: https-port-slashdot
    protocol: HTTPS
  resolution: DNS
 

virtual-service.yml

 apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: external-service-vs-hn
  namespace: env-specific-egress-experiments
spec:
  hosts:
  - news.ycombinator.com
  gateways:
   - istio-egressgateway
   - mesh
  http:
  - match:
    - gateways:
      - mesh
    - port: 80
    route:
    - destination:
       host: istio-egressgateway.istio-system.svc.cluster.local
       subset: hn
       port:
         number: 80
    rewrite:
      authority: news.ycombinator.com
  - match:
    - gateways:
      - istio-egressgateway
      port: 80        
    route:
    - destination:
        host: news.ycombinator.com
        port:
          number: 80
      weight: 100
    rewrite:
      authority: news.ycombinator.com
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: external-service-vs-slash
  namespace: env-specific-egress-experiments
spec:
  hosts:
  - www.slashdot.org
  gateways:
   - istio-egressgateway
   - mesh
  http:
  - match:
    - gateways:
      - mesh
    - port: 80
    route:
    - destination:
       host: istio-egressgateway.istio-system.svc.cluster.local
       subset: slashdot
       port:
         number: 80
    rewrite:
      authority: www.slashdot.org
  - match:
    - gateways:
      - istio-egressgateway
      port: 80        
    route:
    - destination:
        host: www.slashdot.org
        port:
          number: 80
      weight: 100
    rewrite:
      authority: www.slashdot.org
 

Если я попытаюсь свернуть один из хостов с этой конфигурацией, я получу

 / # curl http://news.ycombinator.com
/ # curl -SsL -D - http://news.ycombinator.com
HTTP/1.1 503 Service Unavailable
date: Tue, 23 Feb 2021 19:27:49 GMT
server: envoy
x-envoy-upstream-service-time: 45
content-length: 0
 

Кроме того, к вашему сведению, несколько дополнительных моментов:

  1. Это всего лишь имитация части того, чего я пытаюсь достичь. Очевидно, что меня действительно не волнует подключение к HN или /. Это просто резервные модули для внешних сайтов в целом
  2. В долгосрочной перспективе цель состоит в том, чтобы поместить абстрактное имя перед внешней службой, которое может меняться в зависимости от фактического хоста в зависимости от развертывания. Например, если я разверну qa-deployment.yml, то «mongodatabase» фактически указывает на mongo.qa.mycompany.com , и если я разверну int-deployment.yml, «mongodatabase» указывает на mongo.int.mycompany.com , и так далее. Я думаю, что я могу выполнить эту часть с помощью службы ExternalName и / или ClusterIP, которая «плавает» и не указывает ни на какие модули, но предназначена только для разрешения DNS, поэтому VirtualService может запускаться.
  3. В конечном итоге я хочу, чтобы весь исходящий трафик проходил через exgressgateway. Но будет несколько «вещей», которые нужно пройти через это, отсюда и конкретный момент, на котором я застрял сейчас, который заставляет exgressgateway работать с несколькими хостами.

Комментарии:

1. Какая у вас версия istio? Кроме того, curl www.slashdot.org возвращает ли значение 503?

2. Версия Istio 1.6.4. И да, скручивание любой конечной точки возвращает ту же ошибку.

3. Вы решили это?

4. Да, все заработало. Я хотел вернуться и опубликовать самостоятельный ответ, чтобы помочь всем, кто сталкивается с чем-либо из этого, но просто еще не было времени.

5. Я думаю, ошибка здесь в том, что вы являетесь своим выходом в качестве адресата в виртуальных службах, istio-egressgateway.istio-system.svc.cluster.local