Не работает маршрутизация трафика с взвешенным значением Istio

#kubernetes #istio #istio-kiali

#kubernetes #istio #istio-kiali

Вопрос:

Мы пытаемся выполнить взвешенную маршрутизацию трафика для нашего приложения с помощью Istio. Но по какой-то причине разделение трафика работает не так, как предполагалось. Когда мы говорим, что хотим, чтобы 100% трафика доходило до версии 2 нашего приложения, оно по-прежнему отправляет запросы и на версию v1. Я что-то здесь упускаю?

У нас есть внешний трафик, перенаправляемый через модуль Nginx на серверный svc.

java-серверная часть-svc.yaml

 apiVersion: v1
kind: Service
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"java-backend","service":"java-backend"},"name":"java-backend","namespace":"eve"},"spec":{"ports":[{"name":"http-javabackend","port":8080,"protocol":"TCP","targetPort":8080}],"selector":{"io.kompose.service":"java-backend"}}}
  creationTimestamp: "2020-11-28T08:22:22Z"
  labels:
    app: java-backend
    service: java-backend
  name: java-backend
  namespace: eve
  resourceVersion: "1770680"
  selfLink: /api/v1/namespaces/eve/services/java-backend
  uid: bd4ca848-827b-4901-858d-bda57133ff8a
spec:
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: java-backend
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}
 

java-серверная часть -v1.yaml

 apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
    kompose.cmd: kompose convert
    kompose.version: 1.1.0 (36652f6)    
  creationTimestamp: "2020-12-01T18:22:14Z"
  generation: 1
  labels:
    app: java-backend
    version: v1
  name: java-backend
  namespace: eve
  resourceVersion: "1766086"
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: java-backend
      version: v1
  strategy:
    type: Recreate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: java-backend
        version: v1
    spec:
      containers:
      - args:
        - catalina.sh
        - run
        image: backend:eve-v1
        imagePullPolicy: Always
        name: java-backend
        ports:
        - containerPort: 8080
          protocol: TCP
        resources:
          limits:
            cpu: "1"
            memory: 4000Mi
          requests:
            cpu: "1"
            memory: 4000Mi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /usr/local/logs/
          name: java-backend-volume
      dnsConfig:
        options:
        - name: ndots
          value: "1"
        - name: timeout
          value: "2"
        - name: attempts
          value: "5"
        - name: single-request-reopen
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - hostPath:
          path: /usr/local/konotor/logs/eve/java-backend/
          type: DirectoryOrCreate
        name: java-backend-volume
 

java-серверная часть-v2.yaml

 apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
    kompose.cmd: kompose convert
    kompose.version: 1.1.0 (36652f6)
  creationTimestamp: "2020-12-01T18:40:01Z"
  generation: 1
  labels:
    app: java-backend
    version: v2
  name: java-backend-new
  namespace: eve
  resourceVersion: "1769437"
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: java-backend
      version: v2
  strategy:
    type: Recreate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: java-backend
        version: v2
    spec:
      containers:
      - args:
        - catalina.sh
        - run
        image: backend:eve-dev
        imagePullPolicy: Always
        name: java-backend
        ports:
        - containerPort: 8080
          protocol: TCP
        resources:
          limits:
            cpu: "1"
            memory: 4000Mi
          requests:
            cpu: "1"
            memory: 4000Mi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /usr/local/logs/
          name: java-backend-volume
      dnsConfig:
        options:
        - name: ndots
          value: "1"
        - name: timeout
          value: "2"
        - name: attempts
          value: "5"
        - name: single-request-reopen
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - hostPath:
          path: /usr/local/logs/eve/java-backend/
          type: DirectoryOrCreate
        name: java-backend-volume
 

Virtualservice

 apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: java-backend
spec:
  hosts:
    - java-backend
  http:
  - route:
    - destination:
        host: java-backend
        subset: v1
      weight: 0
    - destination:
        host: java-backend
        subset: v2
      weight: 100
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: java-backend
spec:
  host: java-backend
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
 

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

1. Вы хотите настроить входной шлюз? если это так, вы не указываете это в виртуальной службе

2. Как выглядит ваш сервер nginx? Является ли это частью сетки? Я предполагаю, что ваш трафик не проходит через сетку istio, а маршрутизируется через логику kubernetes. Следовательно, виртуальная служба и подмножество игнорируются.

3. Вы внедрили в свое развертывание istio sidecar? Ваша виртуальная служба и правило назначения развернуты в default пространстве имен, когда ваше развертывание и служба находятся в eve пространстве имен, если вы хотите, чтобы это работало, вам нужно либо сменить хост с java-backend на java-backend.eve.svc.cluster.local , либо развернуть ваше правило назначения и виртуальную службу в пространстве имен eve. Не могли бы вы попробовать с этим?