与虚拟服务一样,目标规则也是istio流量路由功能的关键部分。你可以将虚拟服务视为将流量如何路由到给定目标地址,然后使用目标规则来配置该目标的流量。在评估虚拟服务路由规则之后,目标规则将应用于流量的“真实”目标地址,还可以使用目标规则来指定命名的服务子集,例如按版本为所有给定服务的实例分组。然后可以在虚拟服务的路由规则中使用这些服务子集来控制到服务不同实例的流量。目标规则还允许在调用整个目的地服务或特定服务子集时定制Envoy的流量策略,比如负载均衡模型、TLS安全模式或熔断器设置。
apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: external-svc-https spec: hosts: - www.baidu.com - www.taobao.com - www.jd.com location: MESH_EXTERNAL ports: - number: 443 name: https protocol: TLS resolution: DNS
[root@istio istio]# vim ServiceEntry1.yaml [root@istio istio]# kubectl apply -f ServiceEntry1.yaml serviceentry.networking.istio.io/external-svc-https created [root@istio istio]# kubectl get serviceentries.networking.istio.io NAME HOSTS LOCATION RESOLUTION AGE external-svc-https ["www.baidu.com","www.taobao.com","www.jd.com"] MESH_EXTERNAL DNS 11s
[root@istio ~]# kubectl run test -it --rm --image=busybox:1.28.3 If you don't see a command prompt, try pressing enter. / # wget -q -O- www.baidu.com <!DOCTYPE html>...</html>
ServiceEntry 允许在 Istio 的内部服务注册表中添加额外的条目。
字段 | 类型 | 描述 | 必需的 |
---|---|---|---|
hosts | string[] | 与 ServiceEntry 关联的主机。可以是带有通配符前缀的 DNS 名称。 1、hosts 字段用于在 VirtualServices 和 DestinationRules 中选择匹配的主机。 2、对于 HTTP 流量,HTTP Host/Authority 标头将与 hosts 字段匹配。 3、对于包含服务器名称指示 (SNI) 的 HTTP 或 TLS 流量,SNI 值将与主机字段匹配。 请注意,当解析设置为类型 DNS 且未指定端点时,主机字段将用作端点的 DNS 名称以将流量路由到。 | 是的 |
addresses | string[] | 与服务关联的虚拟 IP 地址。可能是 CIDR 前缀。对于 HTTP 流量,生成的路由配置将包括 httpaddresses 和hosts 字段值和目的地将根据 HTTP Host/Authority 标头进行标识。如果指定了一个或多个 IP 地址,并且目标 IP 与地址字段中指定的 IP/CIDR 匹配,则传入流量将被识别为属于该服务。如果地址字段为空,则将仅根据目标端口识别流量。在这种情况下,访问服务的端口不得与网格中的任何其他服务共享。换句话说,sidecar 将充当一个简单的 TCP 代理,将指定端口上的传入流量转发到指定的目标端点 IP/主机。此字段不支持 Unix 域套接字地址。 | 不 |
ports | Port | 与外部服务关联的端口。如果端点是 Unix 域套接字地址,则必须只有一个端口。 | 是的 |
location | Location | 指定服务应被视为网格外部还是网格的一部分。 | 不 |
resolution | Resolution | 主机的服务发现模式。对于没有附带 IP 地址的 TCP 端口,将解析模式设置为 NONE 时必须小心。在这种情况下,将允许到所述端口上的任何 IP 的流量(即 0.0.0.0:). | 是的 |
endpoints | Endpoint | 与服务关联的一个或多个端点。 | 不 |
exportTo | string[] | 此服务导出到的命名空间列表。导出服务允许它被其他命名空间中定义的 sidecar、网关和虚拟服务使用。此功能为服务所有者和网格管理员提供了一种机制,以控制跨命名空间边界的服务可见性。 如果未指定命名空间,则默认情况下将服务导出到所有命名空间。 价值 ”。” 保留并定义导出到声明服务的同一命名空间。类似地,值“”被保留并定义到所有命名空间的导出。 对于 Kubernetes Service,可以通过将注解“networking.istio.io/exportTo”设置为以逗号分隔的命名空间名称列表来实现等效效果。 注意:在当前版本中,该exportTo值仅限于“.”。或“”(即当前命名空间或所有命名空间)。 | |
subjectAltNames | string[] | 允许用于实现此服务的工作负载实例的主题备用名称列表。此信息用于强制执行 安全命名。如果指定,代理将验证服务器证书的主题备用名称是否与指定值之一匹配。 | 不 |
端点定义了与网格服务关联的网络地址(IP 或主机名)
字段 | 类型 | 描述 | 是否必需 |
---|---|---|---|
address | string | 与没有端口的网络端点关联的地址。当且仅当解析设置为 DNS 时才能使用域名,并且必须是完全限定的,没有通配符。对 Unix 域套接字端点使用 unix:///absolute/path/to/socket 形式。 | 是的 |
ports | map<string,uint32> | 与端点关联的端口集。端口必须与声明为服务一部分的端口名称相关联。不要用于unix:// 地址。 | 不 |
labels | map<string,string> | 与端点关联的一个或多个标签。 | 不 |
network | string | 网络使 Istio 能够对驻留在同一 L3 域/网络中的端点进行分组。假设同一网络中的所有端点都可以直接从另一个端点到达。当不同网络中的端点无法直接相互访问时,可以使用 Istio 网关来建立连接(通常在网关服务器中使用 AUTO_PASSTHROUGH 模式)。这是一种高级配置,通常用于跨越多个集群的 Istio 网格。 | 不 |
locality | string | 与端点关联的位置。一个地点对应一个故障域(例如,国家/地区/地区)。任意故障域层次结构可以通过用 / 分隔每个封装故障域来表示。例如,端点在美国、US-East-1 区域、可用性区域 az-1、数据中心机架 r11 中的位置可以表示为 us/us-east-1/az-1/r11。Istio 将配置 sidecar 以路由到与 sidecar 位于同一位置的端点。如果本地没有端点可用,则将选择端点父本地(但在同一网络 ID 内)。例如,如果在同一网络中有两个端点(networkID“n1”),假设 e1 的位置为 us/us-east-1/az-1/r11 和 e2 的位置为 us/us-east-1/az-2 /r12, 来自 us/us-east-1/az-1/r11 地点的边车将更喜欢来自同一地点的 e1 而不是来自不同地点的 e2。端点 e2 可以是与网关(桥接网络 n1 和 n2)关联的 IP,也可以是与标准服务端点关联的 IP。 | 不 |
weight | uint32 | 与端点关联的负载平衡权重。具有较高权重的端点将按比例接收更高的流量。 | 不 |
Location 指定服务是 Istio 网格的一部分还是网格之外。
值 | 描述 |
---|---|
MESH_EXTERNAL | 表示服务在网格外部。通常用于指示通过 API 使用的外部服务。 |
MESH_INTERNAL | 表示服务是网格的一部分。通常用于指示作为扩展服务网格的一部分显式添加的服务,以包括非托管基础设施(例如,添加到基于 Kubernetes 的服务网格的 VM)。 |
解析决定了代理将如何解析与服务关联的网络端点的 IP 地址,以便它可以路由到其中之一。
值 | 描述 |
---|---|
NONE | 假设传入连接已被解析(到特定目标 IP 地址)。此类连接通常使用 IP 表 REDIRECT/eBPF 等机制通过代理进行路由。执行任何与路由相关的转换后,代理会将连接转发到连接绑定到的 IP 地址。 |
STATIC | 使用端点中指定的静态 IP 地址(见下文)作为与服务关联的支持实例。 |
DNS | 在请求处理期间,尝试通过查询环境 DNS 来解析 IP 地址。如果没有指定端点,如果不使用通配符,代理将解析主机字段中指定的 DNS 地址。如果指定了端点,则将解析端点中指定的 DNS 地址以确定目标 IP 地址。DNS 解析不能与 Unix 域套接字端点一起使用。 |