Redis Fault инъекция с использованием istio и фильтра envoy

Я пытаюсь ввести задержку 2 секунды в экземпляр Redis (который не находится в кластере) с помощью istio. Итак, сначала я создаю службу ExternalName k8s, чтобы подключиться к внешнему redis, чтобы istio знала об этой службе. Это работает. Однако, когда я создаю EnvoyFilter для добавления ошибки, я не вижу redis_proxy фильтр в istioctl pc listeners <pod-name> -o json для модуля в том же пространстве имен. (а также задержка не вводится)

apiVersion: v1
kind: Namespace
metadata:
  name: chaos
  labels:
    istio-injection: enabled
---
apiVersion: v1
kind: Service
metadata:
  name: redis-proxy
  namespace: chaos
spec:
  type: ExternalName
  externalName: redis-external.bla
  ports:
    - name: tcp
      protocol: TCP
      port: 6379
---
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: redis-proxy-filter
  namespace: chaos
spec:
  configPatches:
    - applyTo: NETWORK_FILTER
      match:
        listener:
          portNumber: 6379
          filterChain:
            filter:
              name: "envoy.filters.network.redis_proxy"
      patch:
        operation: MERGE
        value:
          name: "envoy.filters.network.redis_proxy"
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.network.redis_proxy.v3.RedisProxy
            faults:
              - fault_type: DELAY
                fault_enabled:
                  default_value:
                    numerator: 100
                    denominator: HUNDRED
                delay: 2s

Может кто подскажет? Спасибо.


person Kumar Gaurav    schedule 04.04.2021    source источник
comment
Вы не объясняете себя. Это утверждение So, first I am creating an ExternalName k8s service in order to reach external redis so that istio knows about this service. совершенно неверно. ExternalName type Service является объектом k8s и не имеет ничего общего с Istio. ServiceEntry - это объект Istio для добавления внешних конечных точек в Istio rgistry. Я не знаю, что вы имеете в виду.   -  person suren    schedule 04.04.2021


Ответы (1)


Я пробовал ваш yaml в моем локальном istio 1.8.2. Вот несколько изменений, которые могут вам помочь

  • установить PILOT_ENABLE_REDIS_FILTER в istiod env var. в противном случае имя фильтра будет name: envoy.filters.network.tcp_proxy

  • добавить контекст соответствия

    match:
      context: SIDECAR_OUTBOUND
    
  • использовать протокол Redis

    ports:
      - name: redis-proxy
        port: 6379
        appProtocol: redis
    

Я вижу следующее

% istioctl pc listener nginx.chaos --port 6379 -o json
[
    {
        "name": "0.0.0.0_6379",
        "address": {
            "socketAddress": {
                "address": "0.0.0.0",
                "portValue": 6379
            }
        },
        "filterChains": [
            {
                "filters": [
                    {
                        "name": "envoy.filters.network.redis_proxy",
                        "typedConfig": {
                            "@type": "type.googleapis.com/envoy.extensions.filters.network.redis_proxy.v3.RedisProxy",
                            "statPrefix": "outbound|6379||redis-proxy.chaos.svc.cluster.local",
                            "settings": {
                                "opTimeout": "5s"
                            },
                            "latencyInMicros": true,
                            "prefixRoutes": {
                                "catchAllRoute": {
                                    "cluster": "outbound|6379||redis-proxy.chaos.svc.cluster.local"
                                }
                            },
                            "faults": [
                                {
                                    "faultEnabled": {
                                        "defaultValue": {
                                            "numerator": 100
                                        }
                                    },
                                    "delay": "2s"
                                }
                            ]
                        }
                    }
                ]
            }
        ],
        "deprecatedV1": {
            "bindToPort": false
        },
        "trafficDirection": "OUTBOUND"
    }
]
person hida    schedule 04.04.2021
comment
Спасибо, я попробовал все ваши предложения, кроме: appProtocol: redis, потому что текущая функция в нашем кластере не позволяет этого. Я могу видеть конфигурацию фильтра в слушателях json .. но есть некоторая проблема с подключением: root@redis-cli:/data# redis-cli -h redis-proxy.chaos.svc.cluster.local -p 6379 redis-proxy.chaos.svc.cluster.local:6379> ping PONG redis-proxy.chaos.svc.cluster.local:6379> dbsize (error) invalid request Также я думал, что фильтр redis будет добавлен только к модулям в том же пространстве имен .. но я также вижу фильтр redis во всех модулях в других пространствах имен тоже . Любые идеи? - person Kumar Gaurav; 05.04.2021
comment
Извините, у меня нет redis svc для сквозного тестирования. Вы можете попробовать добавить runtime-key, как указано в документации для посланников. и поиграйте со значениями. envoyproxy.io/docs/envoy/latest/configuration/listeners/ `` - задержка: 2 с fault_enabled: default_value: знаменатель: МИЛЛИОН числитель: 1000000 runtime_key: bogus_key fault_type: DELAY `` ` - person hida; 05.04.2021
comment
изменение имени порта службы с redis-proxy на tcp-proxy решает проблему с подключением, но затем конфигурация фильтра redis исчезает в прослушивателях прокси-конфигурации pod json, поэтому задержка не применяется. Проверено дважды, PILOT_ENABLE_REDIS_FILTER включен. Таким образом, соединение работает по протоколу tcp, но не по протоколу redis. - person Kumar Gaurav; 05.04.2021
comment
поскольку у меня нет службы redis снаружи, я протестировал диаграмму управления redis, установленную в моем локальном кластере. Я изменил службу k8s или redis-master на использование протокола redis. Я добавил задержку в 200 секунд. затем я запускаю redis-cli из клиентского модуля. Я могу делать пинг, а также получать задержку. redis-master: 6379 ›get abc (ошибка) отказ восходящего потока (199,77 с) redis-master: 6379› ping PONG PONG - person hida; 06.04.2021