Хотите указать правила в файле VirtualService, где две или более служб имеют одинаковые правила - PullRequest
0 голосов
/ 20 января 2020

Я развернул восемь служб в Кубернетес с впрыском коляски Istio. Я хочу настроить правила маршрутизации в VirtualService, где три службы имеют одинаковое правило. Правила: -

  - match:
    - headers:
        location:
          exact: pune
      uri:
        prefix: /wagholi
    route:
    - destination:
        host: wagholi
        port:
          number: 8080
      uri:
        prefix: /yerwada
    route:
    - destination:
        host: yerwada
        port:
          number: 8080
      uri:
        prefix: /hadapsar
    route:
    - destination:
        host: hadapsar
        port:
          number: 8080
  - match:
    - headers:
        location: 
          exact: mumbai
      uri:
        prefix: /chatraparishivajiterminal
    route:
    - destination:
        host: chatraparishivajiterminal
        port:
          number: 8080
      uri:
        prefix: /kalyan
    route:
    - destination:
        host: kalyan
        port:
          number: 8080
  - match:
    - headers:
        location: 
          exact: Pimpari
      uri:
        prefix: /akurdi
    route:
    - destination:
        host: akurdi
        port:
          number: 8080
      uri:
        prefix: /ravet
    route:
    - destination:
        host: ravet
        port:
          number: 8080

В этом сценарии, если я установлю pune местоположения в заголовках, а затем попытаюсь вызвать службу с именем wagholi, она должна вызвать wagholi, и если я нажму hadapsar, то hadapsar. Если я установлю местоположение как Pimpri и вызову ravet, то он должен вызывать только ravet. Есть ли сценарий для этого !!!!!

1 Ответ

0 голосов
/ 21 января 2020

Я сделал репродукцию вашего вопроса с 3 простыми nginx пакетами, проблема в том, что я не смог заставить его работать только с 1 заголовком и 3 URI.

Так что я сделал это по-другому, каждый матч виртуального сервиса имеет свой собственный заголовок и URI.

Проверьте приведенный ниже пример.

У нас есть 3 модуля -> 3 службы -> виртуальный сервис -> шлюз -> ingressgateway

Развертывание 1

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx1
spec:
  selector:
    matchLabels:
      run: nginx1
  replicas: 1
  template:
    metadata:
      labels:
        run: nginx1
        app: frontend
    spec:
      containers:
      - name: nginx1
        image: nginx
        ports:
        - containerPort: 80
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh", "-c", "echo Hello nginx1 > /usr/share/nginx/html/index.html"]

Развертывание 2

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx2
spec:
  selector:
    matchLabels:
      run: nginx2
  replicas: 1
  template:
    metadata:
      labels:
        run: nginx2
        app: frontend2
    spec:
      containers:
      - name: nginx2
        image: nginx
        ports:
        - containerPort: 80
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh", "-c", "echo Hello nginx2 > /usr/share/nginx/html/index.html"]

Развертывание 3

piVersion: apps/v1
kind: Deployment
metadata:
  name: nginx3
spec:
  selector:
    matchLabels:
      run: nginx3
  replicas: 1
  template:
    metadata:
      labels:
        run: nginx3
        app: frontend3
    spec:
      containers:
      - name: nginx3
        image: nginx
        ports:
        - containerPort: 80
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh", "-c", "echo Hello nginx3 > /usr/share/nginx/html/index.html"]

Сервис 1

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: frontend
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
  selector:
    app: frontend

Сервис 2

apiVersion: v1
kind: Service
metadata:
  name: nginx2
  labels:
    app: frontend2
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    app: frontend2

Сервис 3

apiVersion: v1
kind: Service
metadata:
  name: nginx3
  labels:
    app: frontend3
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    app: frontend3

Виртуальная служба

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nginxvirt
spec:
  gateways:
  - mesh # traffic inside cluster
  - comp-ingress-gateway # traffic from outside cluster
  hosts:
  - nginx.default.svc.cluster.local
  - nginx.com # outside cluster
  - nginx3.default.svc.cluster.local
  - nginx2.default.svc.cluster.local
  http:
  - name: a
    match:
    - uri:
        prefix: /wagholi
      headers:
        location:
          exact: pune
    rewrite:
      uri: /
    route:
    - destination:
        host: nginx.default.svc.cluster.local
        port:
          number: 80
  - name: b
    match:
    - uri:
        prefix: /yerwada
      headers:
        location:
          exact: pune
    rewrite:
      uri: /
    route:
    - destination:
        host: nginx2.default.svc.cluster.local
        port:
          number: 80
  - name: c
    match:
    - uri:
       prefix: /hadasapar
      headers:
        location:
          exact: pune
    rewrite:
      uri: /
    route:
    - destination:
        host: nginx3.default.svc.cluster.local
        port:
          number: 80

Шлюз

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: comp-ingress-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - '*'
    port:
      name: http
      number: 80
      protocol: HTTP
  - hosts:
    - '*'
    port:
      name: https
      number: 443
      protocol: HTTPS
    tls:
      mode: SIMPLE
      privateKey: /etc/istio/ingressgateway-certs/tls.key
      serverCertificate: /etc/istio/ingressgateway-certs/tls.crt

Некоторые Ubuntu pod для тест внутри траффи c

apiVersion: v1
kind: Pod
metadata:
  name: ubu1
spec:
  containers:
  - name: ubu1
    image: ubuntu
    command: ["/bin/sh"]
    args: ["-c", "apt-get update && apt-get install curl -y && sleep 3000"]

И результаты:

Внутри :

root@ubu1:/# curl -H "location: pune" nginx/wagholi
Hello nginx1
root@ubu1:/# curl -H "location: pune" nginx/hadasapar
Hello nginx3
root@ubu1:/# curl -H "location: pune" nginx/yerwada  
Hello nginx2

Снаружи :

curl -H "location: pune" -H "host: nginx.com" ingress_gateway_ip/hadasapar
Hello nginx3
curl -H "location: pune" -H "host: nginx.com" ingress_gateway_ip/wagholi
Hello nginx1
curl -H "location: pune" -H "host: nginx.com" ingress_gateway_ip/yerwada
Hello nginx2

РЕДАКТИРОВАТЬ

Как я могу найти ingress_gateway_ip?

Вы можете использовать

kubectl get svc istio-ingressgateway -n istio-system

И это istio-ingressgateway EXTERNAL-IP

Если значение EXTERNAL-IP Если в вашей среде есть внешний балансировщик нагрузки, который вы можете использовать для входного шлюза. Если значение EXTERNAL-IP равно (или постоянно), ваша среда не предоставляет внешний балансировщик нагрузки для входного шлюза. В этом случае вы можете получить доступ к шлюзу, используя порт узла службы .


Могу ли я по-разному выполнить Ingress для каждой службы и затем сопоставить ее с VirtualService.

Я не уверен в этом, но думаю, что это возможно. Проверьте ниже ссылки

Надеюсь, это поможет Вам. Дайте мне знать, если у вас есть еще вопросы.

...