Istio(七):ServiceEntry,sidecar,Envoy Filter
一.模块概览
使用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_INTERNAL 和 MESH_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 部分,我们指定代理可以访问运行在 default、istio-system 和 staging 命名空间的服务。要将资源仅应用于特定的工作负载,我们可以使用 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.default 或 default/*。在 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
Istio(七):ServiceEntry,sidecar,Envoy Filter的更多相关文章
- Istio 之ServiceEntry
使用服务条目资源(ServiceEntry)可以将条目添加到 Istio 内部维护的服务注册表中.添加服务条目后,Envoy 代理可以将流量发送到该服务,就好像该服务条目是网格中的服务一样.通过配置服 ...
- istio实现自动sidecar自动注入(k8s1.13.3+istio1.1.1)
一.自动注入的前提条件 自动注入功能需要kubernetes 1.9或更高版本: kubernetes环境需支持MutatingAdmissionWebhook: 二.在namespace中设置自动注 ...
- (七)学习CSS之filter属性
filter: alpha(opacity=,finishopacity=,style=)??? alpha是来设置透明度的,它的基本属性是filter:alpha(opacity,finishopa ...
- 第七章 过滤器基础 Filter
简介:SUN从Servlet2.3开始添加一项激动人心的功能,就是过滤器(Filter).WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图 ...
- 机器学习实战基础(十四):sklearn中的数据预处理和特征工程(七)特征选择 之 Filter过滤法(一) 方差过滤
Filter过滤法 过滤方法通常用作预处理步骤,特征选择完全独立于任何机器学习算法.它是根据各种统计检验中的分数以及相关性的各项指标来选择特征 1 方差过滤 1.1 VarianceThreshold ...
- 如何在 Istio 中支持 Dubbo、Thrift、Redis 以及任何七层协议?
赵化冰,腾讯云高级工程师,Istio Member,ServiceMesher管理委员,Istio 项目贡献者, Aerika 项目创建者 ,热衷于开源.网络和云计算.目前主要从事服务网格的开源和研发 ...
- Istio Ambient Mesh七层服务治理图文详解
摘要:本文主要集中剖析Ambient mesh七层服务治理相关内容. 本文分享自华为云社区<Istio Ambient Mesh七层服务治理图文详解>,作者:华为云云原生团队. 由于Amb ...
- 从微服务治理的角度看RSocket、. Envoy和. Istio
很多同学看到这个题目,一定会提这样的问题:RSocket是个协议,Envoy是一个 proxy,Istio是service mesh control plane + data plane. 这三种技术 ...
- istio sidecar流量处理机制及配置
sidecar 介绍 在istio的流量管理等功能,都需要通过下发的配置应用到应用运行环境执行后生效,负责执行配置规则的组件在service mesh中承载应用代理的实体被称为side-car Ist ...
- 注入 Istio sidecar
注入 Istio sidecar 网格中的每个 Pod 都必须伴随一个 Istio 兼容的 Sidecar 一同运行. 下文中将会介绍两种把 Sidecar 注入到 Pod 中的方法:使用 istio ...
随机推荐
- openGauss2.1.0在openEuler 20.03 LTS SP2 安装后,yum无法使用的问题解决
openGauss2.1.0 在 openEuler 20.03 LTS SP2 安装后,yum 无法使用的问题解决 一.环境描述 操作系统: openEuler 20.03 LTS openEule ...
- Node 中的 Stream ?应用场景?
一.是什么 流(Stream),是一种数据传输手段,是端到端信息交换的一种方式,是有顺序的,是逐块读取数据.处理内容,用于顺序读取输入或写入输出 在很多时候,流(Stream)是字节流(Byte St ...
- StarRocks 集群安装
当前按照官网上的提供的安装包方式安装,版本是 3.2.2,部署模式为存算一体,安装的操作系统是 Ubuntu 22.04,JDK 版本为 OpenJDK 11,这里选择 3 个节点进行安装,节点的 h ...
- easyx的使用,鼠标交互(3.0)
本文从B站学习,借鉴: 学习视频地址:鼠标操作(旧版)_哔哩哔哩_bilibili
- EasyNLP发布融合语言学和事实知识的中文预训练模型CKBERT
简介: 本⽂简要介绍CKBERT的技术解读,以及如何在EasyNLP框架.HuggingFace Models和阿里云机器学习平台PAI上使⽤CKBERT模型. 导读 预训练语言模型在NLP的各个应用 ...
- 云钉一体:EventBridge 联合钉钉连接器打通云钉生态
简介:今天,EventBridge 联合钉钉连接器,打通了钉钉生态和阿里云生态,钉钉的生态伙伴可以通过通道的能力驱动阿里云上海量的计算力. 作者:尘央 背景 "以事件集成阿里云,从 Eve ...
- [Go] 浅谈 gorm 执行 AutoMigrate 的两种时机
第一种就是直接在操作 model 的逻辑中,执行 db.AutoMigrate,模型没有更新时不会有 schema 相关的 sql 被执行. 第二种就是单独定义一个属于 main 包的 go 文件,专 ...
- [FAQ] Python list 的值是带有小括号的是什么意思 ?
python 中的 list 即列表,是用中括号 [ ] 表示的数组列表: dict 即字典,是用花括号 { } 表示的 json 对象: tuple 即元祖,是用小括号表示的序列: 见到它们之间的组 ...
- WPF dotnet 6 开启 PM v2 的 DPI 感知 导致触摸线程访问 UI 属性抛异常
本文记录一个 WPF 在 dotnet 6 的一个已知问题,且此问题我已修复提交给官方仓库.这是一个只有在 dotnet 6 框架下,非 dotnet 5 也非 .NET Core 3.1 也非 .N ...
- Ubuntu 通过本机代理修复 NuGet 还原 error NU1301 失败
在国内垃圾的网络环境下,我在虚拟机里面安装了 Ubuntu 系统,准备用来测试 MAUI 在 Linux 上的行为,然而使用 dotnet restore 构建时,提示 NU1301 失败.我通过配置 ...