【问题标题】:redis fault injection using istio and envoy filter使用 istio 和 envoy 过滤器进行 redis 故障注入
【发布时间】:2021-04-04 12:51:16
【问题描述】:

我正在尝试使用 istio 向 redis 实例(不在集群中)注入 2s 延迟。 因此,首先我创建了一个ExternalName k8s 服务,以便访问外部 redis,以便 istio 了解该服务。这行得通。但是,当我创建 EnvoyFilter 以添加故障时,我在 istioctl pc listeners <pod-name> -o json 中看不到 redis_proxy 过滤器用于同一命名空间中的 pod。 (也没有引入延迟)

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

谁能给个主意?谢谢。

【问题讨论】:

  • 你没有解释自己。这句话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。我不知道你是不是这个意思。

标签: istio envoyproxy


【解决方案1】:

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

  • 在 istiod 环境变量中设置 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"
    }
]

【讨论】:

  • 谢谢,我尝试了您的所有建议,除了: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 过滤器将仅添加到同一命名空间中的 pod.. 但我可以在其他所有 pod 中看到 redis 过滤器命名空间也是。有什么想法吗?
  • 对不起,我没有 redis svc 来测试端到端。您可能想尝试添加特使文档中提到的运行时密钥。并玩弄这些价值观。 @ 987654321@ ``` - 延迟:2s fault_enabled:default_value:分母:MILLION 分子:1000000 runtime_key:bogus_key fault_type:DELAY ```
  • 将服务端口名称从 redis-proxy 更改为 tcp-proxy 解决了连接问题,但 redis 过滤器配置在 pod proxy-config listeners json 中消失了,因此不会应用延迟。仔细检查,PILOT_ENABLE_REDIS_FILTER 已启用。所以连接适用于tcp 协议,但不适用于redis 协议。
  • 因为我外面没有redis服务,所以我测试了本地集群中安装的redis helm chart。我将 k8s 服务或 redis-master 更改为使用 redis 协议。我添加了 200 秒的延迟。然后我从客户端 pod 运行 redis-cli。我可以做 ping 以及延迟。 redis-master:6379> get abc (error) upstream failure (199.77s) redis-master:6379> ping PONG PONG
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 2016-03-12
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 2018-02-24
相关资源
最近更新 更多