首页 > 解决方案 > 使用 istio 和 envoy 过滤器进行 redis 故障注入

问题描述

我正在尝试使用 istio 向 redis 实例(不在集群中)注入 2s 延迟。因此,首先我创建了一个ExternalNamek8s 服务以访问外部 redis,以便 istio 了解该服务。这行得通。但是,当我创建EnvoyFilter添加故障时,我看不到同一命名空间中的 pod 的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

有人可以给出一个想法吗?谢谢。

标签: istioenvoyproxy

解决方案


我在本地 istio 1.8.2 中尝试了您的 yaml。以下是一些可能对您有所帮助的更改

  • 在 istiod env var 中设置 PILOT_ENABLE_REDIS_FILTER。否则,过滤器名称将为“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"
    }
]

推荐阅读