metadata就是元数据信息,他提供了基于匹配的妙使 listeners, filter chains, routes and endpoints的 额外的输入参数到过滤器,他是用动一种map的格式,通常是态元filter的名字(反向dns格式)。过滤器元数据的数据键值对在请求处理和连接发生时会别合并,后面的篇学值会覆盖前面的值。元数据有一个名称空间的妙使概念,然后是用动键值对。比如提供额外数据给httpConnectionManager的态元元数据名称空间 envoy.http_connection_manager.access_log 。另一个例子是数据每个service使用的cluster的元数据信息,他可能被多个过滤器使用。篇学对于负载均衡来说,妙使元数据提供了一种方法,用动来子集端点信息。态元关联元数据的数据endpoint,亿华云计算路由一个特定的元数据来选择端点。元数据有四种类型,分别是request类型,route类型,cluster类型,host类型。 tracing customtag值得来源,路由元数据匹配,负载均衡子集决策,ratelimit 动作配置,基于元数据的权限控制,本地响应映射元数据过滤,等。 当使用grpc授权服务器时,当CheckResponse包含dynamic_metadata字段时,会产生动态元数据信息。 当使用http授权服务器时,当来自授权服务器的响应头匹配 dynamic_metadata_from_headers 的配置值会产生元数据信息。动态元数据的key是匹配的头,动态元数据的值是匹配头的值。 当使用grpc授权服务器时,当CheckResponse包含dynamic_metadata字段时,源码下载会产生动态元数据信息。 配置一些规则,每条规则有header或cookie,当配置的值存在或不存在时就会触发规则,用来设置动态元数据。 比如: 上面规则显示,当x-version头存在时设置envoy.lb名称空间的key为version元数据为x-version的值,当x-version不存在时,设置envoy.lb的名称空间的key为default的元数据的值为true。 可以配置 **payload_in_**metadata ,成功验证jwt payload会写到metadata中,名称空间是envoy.filters.http.jwt_authn,例子: 可以配置 **header_in_**metadata ,成功验证的头会写到metadata中,名称空间是envoy.filters.http.jwt_authn,例子: 当 emit_dynamic_metadata 为true时会产生metadata,格式如下 当发送到服务端的sql被解析后,会产生动态元数据信息,格式如下: 语句被解析后,会产生动态元数据,格式如下: 会产生如下元数据: 会产生如下元数据: 当每个消息被解析后,会产生如下元数据: 当ratelimit服务返回 RateLimitResponse 带有dynamic_metadata时,服务器租用会产生元数据信息。 metadata:自定义tag,值从metadata中获取 案例: mappers: filter: metadata_filter: matcher: value: string_match: body_format: ef-local_reply_config.yaml kubectl apply -f ef-local_reply_config.yaml -n istio-system 略,等讲cluster再看 request_rules: response_rules: on_header_present,on_header_missing: 本文转载自微信公众号「k8s实战」,可以通过以下二维码关注。转载本文请联系k8s实战公众号。1什么是篇学metadata
2metadata有什么作用
3metadata数据来源
3.1 envoy.filters.http.ext_authz
3.2 envoy.filters.network.ext_authz
3.3 envoy.filters.http.header_to_metadata
3.4 envoy.filters.http.jwt_authn
3.5 envoy.filters.network.mongo_proxy
3.6envoy.filters.network.mysql_proxy
3.7envoy.filters.network.postgres_proxy
3.8 envoy.filters.http.rbac
3.9 envoy.filters.network.rbac
3.10envoy.filters.network.zookeeper_proxy
3.11 envoy.filters.http.ratelimit
4metadata怎么使用
4.1type.tracing.v3.CustomTag
{ "tag": "...", "literal": "{ ...}", "environment": "{ ...}", "request_header": "{ ...}", "metadata": "{ ...}" } 4.2路由设置metadata
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: httpconnectionmanager spec: workloadSelector: labels: istio: ingressgateway configPatches: - applyTo: NETWORK_FILTER match: context: GATEWAY listener: portNumber: 8080 filterChain: filter: name: "envoy.filters.network.http_connection_manager" patch: operation: MERGE value: name: envoy.filters.network.http_connection_manager typedConfig: @type: type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager route_config: name: test virtual_hosts: - name: test domains: - "*" routes: - name: testroute match: prefix: / metadata: filter_metadata: "envoy.lb": canary: true direct_response: status: 200 body: inline_string: "prefix" 4.3local_reply_config
{ "mappers": [], "body_format": "{ ...}" } 4.4 envoy.filters.http.set_metadata
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: set spec: workloadSelector: labels: app: productpage configPatches: - applyTo: HTTP_FILTER match: context: SIDECAR_INBOUND listener: portNumber: 9080 filterChain: destinationPort: 9080 filter: name: "envoy.filters.network.http_connection_manager" subFilter: name: "envoy.filters.http.router" patch: operation: INSERT_BEFORE value: name: envoy.filters.http.set_metadata typedConfig: @type: type.googleapis.com/envoy.extensions.filters.http.set_metadata.v3.Config metadata_namespace: envoy.lb value: canary: "true" 4.5route match
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: httpconnectionmanager spec: workloadSelector: labels: istio: ingressgateway configPatches: - applyTo: NETWORK_FILTER match: context: GATEWAY listener: portNumber: 8080 filterChain: filter: name: "envoy.filters.network.http_connection_manager" patch: operation: MERGE value: name: envoy.filters.network.http_connection_manager typedConfig: @type: type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager route_config: name: test virtual_hosts: - name: test domains: - "*" routes: - name: testroute match: path: /tEst case_sensitive: false dynamic_metadata: filter: envoy.lb path: - key: canary value: "true" invert: false direct_response: status: 200 body: inline_string: "runtime_fraction" 4.6基于元数据的权限控制
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: apply-to spec: workloadSelector: labels: app: mysqldb configPatches: - applyTo: NETWORK_FILTER match: listener: portNumber: 3306 filterChain: filter: name: "envoy.filters.network.tcp_proxy" patch: operation: INSERT_BEFORE value: name: envoy.filters.network.mysql_proxy typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.mysql_proxy.v3.MySQLProxy stat_prefix: mysql - applyTo: NETWORK_FILTER match: listener: portNumber: 3306 filterChain: filter: name: "envoy.filters.network.tcp_proxy" patch: operation: INSERT_BEFORE value: name: envoy.filters.network.rbac typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.rbac.v3.RBAC stat_prefix: rbac rules: action: DENY policies: "product-viewer": permissions: - metadata: filter: envoy.filters.network.mysql_proxy path: - key: t1.test value: list_match: one_of: string_match: prefix: update principals: - any: true enforcement_type: CONTINUOUS 4.7负载均衡决策
4.8header-To-Metadata Filter
{ "request_rules": [], "response_rules": [] } 4.9ratelimit actions
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: httpconnectionmanager spec: workloadSelector: labels: istio: ingressgateway configPatches: - applyTo: NETWORK_FILTER match: context: GATEWAY listener: portNumber: 8080 filterChain: filter: name: "envoy.filters.network.http_connection_manager" patch: operation: MERGE value: name: envoy.filters.network.http_connection_manager typedConfig: @type: type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager route_config: name: test virtual_hosts: - name: test domains: - "*" routes: - name: testroute match: prefix: /product route: rate_limits: - stage: 0 disable_key: test actions: - metadata: descriptor_key: test default_value: test metadata_key: key: envoy.lb path: - key: canary source: DYNAMIC limit: dynamic_metadata: metadata_key: key: envoy.lb path: - key: canary weighted_clusters: clusters: - name: outbound|9080||productpage.istio.svc.cluster.local weight: 100 total_weight: 100 runtime_key_prefix: test