#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
Кроме того, к вашему сведению, несколько дополнительных моментов:
- Это всего лишь имитация части того, чего я пытаюсь достичь. Очевидно, что меня действительно не волнует подключение к HN или /. Это просто резервные модули для внешних сайтов в целом
- В долгосрочной перспективе цель состоит в том, чтобы поместить абстрактное имя перед внешней службой, которое может меняться в зависимости от фактического хоста в зависимости от развертывания. Например, если я разверну qa-deployment.yml, то «mongodatabase» фактически указывает на mongo.qa.mycompany.com , и если я разверну int-deployment.yml, «mongodatabase» указывает на mongo.int.mycompany.com , и так далее. Я думаю, что я могу выполнить эту часть с помощью службы ExternalName и / или ClusterIP, которая «плавает» и не указывает ни на какие модули, но предназначена только для разрешения DNS, поэтому VirtualService может запускаться.
- В конечном итоге я хочу, чтобы весь исходящий трафик проходил через exgressgateway. Но будет несколько «вещей», которые нужно пройти через это, отсюда и конкретный момент, на котором я застрял сейчас, который заставляет exgressgateway работать с несколькими хостами.
Комментарии:
1. Какая у вас версия istio? Кроме того,
curl www.slashdot.org
возвращает ли значение 503?2. Версия Istio 1.6.4. И да, скручивание любой конечной точки возвращает ту же ошибку.
3. Вы решили это?
4. Да, все заработало. Я хотел вернуться и опубликовать самостоятельный ответ, чтобы помочь всем, кто сталкивается с чем-либо из этого, но просто еще не было времени.
5. Я думаю, ошибка здесь в том, что вы являетесь своим выходом в качестве адресата в виртуальных службах, istio-egressgateway.istio-system.svc.cluster.local