Есть несколько вещей, которые должны отличаться в случае предоставления приложения TCP с istio.
hosts:
должно быть "*"
, так как протокол TCP
работает только с IP:PORT
. В L4 нет заголовков.
Должен быть TCP
порт match
Ваш VirtualService
, который соответствует GateWay
. Я предлагаю назвать его уникальным образом и соответствовать Deployment
имени порта.
Я предлагаю избегать использования порта 80
, так как он уже используется в конфигурации входа по умолчанию, и это может привести к в конфликте портов, поэтому я изменил его на 11337
.
Так что ваш GateWay
должен выглядеть примерно так:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: redis-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 11337
name: redis-port
protocol: TCP
hosts:
- "*"
и ваш VirtualService
как это:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: redis-vs
spec:
hosts:
- "*"
gateways:
- redis-gateway
tcp:
- match:
- port: 11337
route:
- destination:
host: redis-svc
port:
number: 16379
Обратите внимание, что я удалил пространства имен для ясности.
Затем добавьте наш пользовательский порт к входному шлюзу по умолчанию, используя следующую команду:
kubectl edit svc istio-ingressgateway -n istio-system
И добавьте следующие следующие определения других портов:
- name: redis-port
nodePort: 31402
port: 11337
protocol: TCP
targetPort: 16379
Для доступа к уязвимому приложению используйте внешний IP-адрес шлюза istio и только что настроенный порт.
Кому получить внешний IP-адрес вашего шлюза, который вы можете использовать:
export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
redis-cli -h $INGRESS_HOST -p 11337
Если вашему istio-ingressgateway
не назначен внешний IP, используйте один из IP-адресов и портов вашего узла 31402
.
Надеюсь, это поможет.