首页 > 其他分享 >Istio(七):ServiceEntry,sidecar,Envoy Filter

Istio(七):ServiceEntry,sidecar,Envoy Filter

时间:2022-10-29 21:57:30浏览次数:100  
标签:负载 ServiceEntry name Envoy istio Filter sidecar

目录

一.模块概览

使用ServiceEntry把服务添加到istio内部服务注册表,配置sidecar代理,使用Envoy Filter定制Envoy 配置。

使用ServiceEntry,sidecar,Envoy Filter的前提是已经安装好了istio,关于istio的安装部署,请查看博客《Istio(二):在Kubernetes(k8s)集群上安装部署istio1.14》https://www.cnblogs.com/renshengdezheli/p/16836404.html

二.系统环境

服务器版本 docker软件版本 Kubernetes(k8s)集群版本 Istio软件版本 CPU架构
CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 v1.21.9 Istio1.14 x86_64

Kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点

服务器 操作系统版本 CPU架构 进程 功能描述
k8scloude1/192.168.110.130 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico k8s master节点
k8scloude2/192.168.110.129 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kubelet,kube-proxy,calico k8s worker节点
k8scloude3/192.168.110.128 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kubelet,kube-proxy,calico k8s worker节点

三.ServiceEntry

通过 ServiceEntry 资源,我们可以向 Istio 的内部服务注册表添加额外的条目,使不属于我们网格的外部服务或内部服务看起来像是我们服务网格的一部分

当一个服务在服务注册表中时,我们就可以使用流量路由、故障注入和其他网格功能,就像我们对其他服务一样

下面是一个 ServiceEntry 资源的例子,它声明了一个可以通过 HTTPS 访问的外部 API(api.external-svc.com)。

 apiVersion: networking.istio.io/v1alpha3
 kind: ServiceEntry
 metadata:
   name: external-svc
 spec:
   hosts:
     - api.external-svc.com
   ports:
     - number: 443
       name: https
       protocol: TLS
   resolution: DNS
   location: MESH_EXTERNAL

hosts 字段可以包含多个外部 API,在这种情况下,Envoy sidecar 会根据下面的层次结构来进行检查。如果任何一项不能被检查,Envoy 就会转到层次结构中的下一项。

  • HTTP Authority 头(在HTTP/2中)和 Host 头(HTTP/1.1中)
  • SNI
  • IP 地址和端口

如果上述数值都无法检查,Envoy 会根据 Istio 的安装配置,盲目地转发请求或放弃该请求

与 WorkloadEntry 资源一起,我们可以处理虚拟机工作负载向 Kubernetes 迁移的问题。在 WorkloadEntry 中,我们可以指定在虚拟机上运行的工作负载的细节(名称、地址、标签),然后使用 ServiceEntry 中的 workloadSelector 字段,使虚拟机成为 Istio 内部服务注册表的一部分。

例如,假设 customers 的工作负载正在两个虚拟机上运行。此外,我们已经有在 Kubernetes 中运行的 Pod,其标签为 app: customers

让我们这样来定义 WorkloadEntry 资源:

 apiVersion: networking.istio.io/v1alpha3
 kind: WorkloadEntry
 metadata:
   name: customers-vm-1
 spec:
   serviceAccount: customers
   address: 1.0.0.0
   labels:
     app: customers
     instance-id: vm1
 ---
 apiVersion: networking.istio.io/v1alpha3
 kind: WorkloadEntry
 metadata:
   name: customers-vm-2
 spec:
   serviceAccount: customers
   address: 2.0.0.0
   labels:
     app: customers
     instance-id: vm2

现在我们可以创建一个 ServiceEntry 资源,该资源同时跨越 Kubernetes 中运行的工作负载和虚拟机:

 apiVersion: networking.istio.io/v1alpha3
 kind: ServiceEntry
 metadata:
   name: customers-svc
 spec:
   hosts:
   - customers.com
   location: MESH_INTERNAL
   ports:
   - number: 80
     name: http
     protocol: HTTP
   resolution: STATIC
   workloadSelector:
     labels:
       app: customers

location 字段中设置 MESH_INTERNAL,这是说这个服务是网格的一部分这个值通常用于包括未管理的基础设施(VM)上的工作负载的情况。这个字段的另一个值,MESH_EXTERNAL,用于通过 API 消费的外部服务MESH_INTERNALMESH_EXTERNAL 设置控制了网格中的 sidecar 如何尝试与工作负载进行通信,包括它们是否会默认使用 Istio 双向TLS。

四.sidecar

4.1 Sidecar

默认情况下,在istio中,注入的 sidecar 代理接收所有端口的流量,并且在转发流量时可以到达网格中的任何服务

在某些情况下,你可能想改变这种配置,配置代理,所以它只能使用特定的端口和访问某些服务。要做到这一点,你可以在 Istio 中使用 Sidecar 资源。

Sidecar 资源可以被部署到 Kubernetes 集群内的一个或多个命名空间,但如果没有定义工作负载选择器,每个命名空间只能有一个 sidecar 资源。

Sidecar 资源由三部分组成,一个工作负载选择器、一个入口(ingress)监听器和一个出口(egress)监听器

4.2 工作负载选择器

工作负载选择器决定了哪些工作负载会受到 sidecar 配置的影响。你可以决定控制一个命名空间中的所有 sidecar,而不考虑工作负载,或者提供一个工作负载选择器,将配置只应用于特定的工作负载

例如,这个 YAML 适用于默认命名空间内的所有代理,因为没有定义选择器。

 apiVersion: networking.istio.io/v1alpha3
 kind: Sidecar
 metadata:
   name: default-sidecar
   namespace: default
 spec:
   egress:
   - hosts:
     - "default/*"
     - "istio-system/*"
     - "staging/*"

在 egress 部分,我们指定代理可以访问运行在 defaultistio-systemstaging 命名空间的服务。要将资源仅应用于特定的工作负载,我们可以使用 workloadSelector 字段。例如,将选择器设置为 version: v1 将只适用于有该标签设置的工作负载

 apiVersion: networking.istio.io/v1alpha3
 kind: Sidecar
 metadata:
   name: default-sidecar
   namespace: default
 spec:
   workloadSelector:
     labels:
       version: v1
   egress:
   - hosts:
     - "default/*"
     - "istio-system/*"
     - "staging/*"

4.3 入口和出口监听器

资源的入口(ingress)监听器部分定义了哪些入站流量被接受。同样地,通过出口(egress)监听器,你可以定义出站流量的属性

每个入口监听器都需要一个端口设置,以便接收流量(例如,下面的例子中的 3000)和一个默认的端点。默认端点可以是一个回环 IP 端点或 Unix 域套接字。端点配置了流量将被转发到哪里。

 ...
   ingress:
   - port:
       number: 3000
       protocol: HTTP
       name: somename
     defaultEndpoint: 127.0.0.1:8080
 ...

上面的片段将入口监听器配置为在端口 3000 上监听,并将流量转发到服务监听的端口 8080 上的回环 IP。此外,我们可以设置 bind 字段,以指定一个 IP 地址或域套接字,我们希望代理监听传入的流量。最后,字段 captureMode 可以用来配置如何以及是否捕获流量

出口监听器有类似的字段,但增加了hosts 字段。通过 hosts 字段,你可以用 namespace/dnsName 的格式指定服务主机。例如, myservice.defaultdefault/*。在 hosts 字段中指定的服务可以是来自网格注册表的实际服务、外部服务(用 ServiceEntry 定义),或虚拟服务。

   egress:
   - port:
       number: 8080
       protocol: HTTP
     hosts:
     - "staging/*"

通过上面的 YAML文件,sidecar 代理了运行在 staging 命名空间的服务的 8080 端口的流量。

五.Envoy Filter

5.1 Envoy Filter

EnvoyFilter 资源允许你定制由 Istio Pilot 生成的 Envoy 配置。使用该资源,你可以更新数值,添加特定的过滤器,甚至添加新的监听器、集群等等。小心使用这个功能,因为不正确的定制可能会破坏整个网格的稳定性

过滤器是叠加应用的,这意味着对于特定命名空间中的特定工作负载,可以有任何数量的过滤器根命名空间(例如 istio-system)中的过滤器首先被应用,然后是工作负载命名空间中的所有匹配过滤器

下面是一个 EnvoyFilter 的例子,它在请求中添加了一个名为 api-version 的头。

 apiVersion: networking.istio.io/v1alpha3
 kind: EnvoyFilter
 metadata:
   name: api-header-filter
   namespace: default
 spec:
   workloadSelector:
     labels:
       app: web-frontend
   configPatches:
   - applyTo: HTTP_FILTER
     match:
       context: SIDECAR_INBOUND
       listener:
         portNumber: 8080
         filterChain:
           filter:
             name: "envoy.http_connection_manager"
             subFilter:
               name: "envoy.router"
     patch:
       operation: INSERT_BEFORE
       value:
         name: envoy.lua
         typed_config:
           "@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"
           inlineCode: |
             function envoy_on_response(response_handle)
               response_handle:headers():add("api-version", "v1")
             end

如果你向 $GATEWAY_URL 发送一个请求,你可以注意到 api-version 头被添加了,如下所示:

 $ curl -s -I -X HEAD  http://$GATEWAY_URL
 HTTP/1.1 200 OK
 x-powered-by: Express
 content-type: text/html; charset=utf-8
 content-length: 2471
 etag: W/"9a7-hEXE7lJW5CDgD+e2FypGgChcgho"
 date: Tue, 17 Nov 2020 00:40:16 GMT
 x-envoy-upstream-service-time: 32
 api-version: v1
 server: istio-envoy

标签:负载,ServiceEntry,name,Envoy,istio,Filter,sidecar
From: https://www.cnblogs.com/renshengdezheli/p/16839960.html

相关文章

  • 【Vue】问题:TypeError: vite.createFilter is not a function
    问题内容➜vite-vue3npmrundev>[email protected]>vitefailedtoloadconfigfrom/vite-vue3/vite.config.tserrorwhenstartingdevserver:TypeError:vite.c......
  • 1_js中过滤器filter简单实现
    filterAPI自实现我感觉这个API我用起来不是很顺畅我自己写一个看看分析这是api参考手册设计思路抛开其他的不谈,filter本质上就是原型Array上的一个函数==ap......
  • 【RocketMQ入门到精通】— RocketMQ初级特性能力 | Message Filter消息过滤,可不是web
    名言警句任何先进的技术均与魔法无异追本溯源【​​经历了6个月的失踪,我将带着干货终究归来!【RocketMQ入门到精通】​​】什么是消息过滤MessageFilter,可不是web容器的过滤......
  • Istio envoy filter
    EnvoyFilterCREnvoyFilter EnvoyFilterCR提供了自定义SidecarEnvoy配置的接口,其支持的配置功能包括修改指定字段的值、添加特定的过滤器甚至是新增Listener和Clus......
  • Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系
    在我们日常的开发中,我们经常会用到Filter和Interceptor。有时同一个功能。Filter可以做,Interceptor也可以做。有时就需要考虑使用哪一个比较好。这篇文章主要介绍一下,二者......
  • Istio ServiceEntry
    ServiceEntry介绍ServiceEntry用于将未能自动添加至网格中的服务,以手动形式添加至网格中,以使得网格内的自动发现机制能够访问或路由到这些服务未能自动添加至网格中的......
  • js中数组过滤filter的使用理解(小白级别)
    js中数组过滤filter的使用理解​​filter方法的介绍​​​​详细解读​​filter方法的介绍数组的filter方法用于过滤数组中不符合条件的元素,这个方法不会修改原数组。如何使......
  • 使用Prometheus和Grafana监控Envoy Mesh
    环境说明宿主机地址为:192,.168.174.103envoy:FrontProxy,地址为172.31.10.2webserver01:第一个后端服务webserver01-sidecar:第一个后端服务的SidecarProxy,地址为172.31.10.......
  • Envoy 分布式追踪
    追踪概述分布式跟踪允许开发人员在大型面向服务的架构中获得调用流的可视化。它对于理解序列化、并行性和延迟来源非常重要。Envoy支持与系统范围跟踪相关的三个功能:请求I......
  • Envoy部署
    部署Envoy的常用方法镜像方式部署Envoy项目为多种平台(例如amd64和arm64等)维护有相应的DockerImage,我们可按需猎取相应镜像后以容器形式运行Envoy,而且它们存在以下几种变化......