简述

默认情况下,Istio服务Mesh中的Pod,由于其 iptables 将所有外发流量都透明的转发给了 Sidecar,所以这些集群内的服务无法访问集群之外的 URL,而只能处理集群内部的目标。本文主要介绍如何让Istio 集群中的服务访问外部的服务,即如何通过定义 ServiceEntry 来调用外部服务简单的对 Istio 进行配置,或要求其直接放行对特定 IP 范围的访问。

前提

  • 正确安装Istio
  • 安装实例程序sleep
  • 手动或自动注入sidecar
kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml)

YAML具体内容如下:

apiVersion: v1
kind: ServiceAccount
metadata:name: sleep
---
apiVersion: v1
kind: Service
metadata:name: sleeplabels:app: sleep
spec:ports:- port: 80name: httpselector:app: sleep
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: sleep
spec:replicas: 1template:metadata:labels:app: sleepspec:serviceAccountName: sleepcontainers:- name: sleepimage: pstauffer/curlcommand: ["/bin/sleep", "3650d"]imagePullPolicy: IfNotPresent
  • 将 SOURCE_POD 环境变量设置为已部署的 sleep pod:
export SOURCE_POD=$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})

在 Istio 中配置外部服务

通过配置 Istio ServiceEntry,可以从 Istio 集群中访问任何可公开外部的服务。 这里我们会使用 httpbin.org 以及 www.google.com 进行试验。

  • 配置外部服务

1.创建一个 ServiceEntry 对象,放行对一个外部 HTTP 服务的访问:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:name: httpbin-ext
spec:hosts:- httpbin.orgports:- number: 80name: httpprotocol: HTTPresolution: DNSlocation: MESH_EXTERNAL
EOF

2.进入具体的服务Pod:

kubectl exec -it $SOURCE_POD -c sleep sh

3.向外部 HTTP 服务发出请求。

curl http://httpbin.org/headers
  • 配置外部 HTTPS 服务

1.创建一个 ServiceEntry 以允许访问外部 HTTPS 服务。

对于 TLS 协议(包括 HTTPS),除了 ServiceEntry 之外,还需要 VirtualService。 没有 VirtualService, ServiceEntry 所暴露的服务将不被定义。VirtualService 必须在 match 子句中包含 tls 规则和 sni_hosts 以启用 SNI 路由。

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:name: google
spec:hosts:- www.google.comports:- number: 443name: httpsprotocol: HTTPSresolution: DNSlocation: MESH_EXTERNAL
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: google
spec:hosts:- www.google.comtls:- match:- port: 443sni_hosts:- www.google.comroute:- destination:host: www.google.comport:number: 443weight: 100
EOF

2.执行 sleep service 源 pod:

kubectl exec -it $SOURCE_POD -c sleep sh

3.向外部 HTTPS 服务发出请求:

curl https://www.google.com
  • 为外部服务设置路由规则

通过 ServiceEntry 访问外部服务的流量,和网格内流量类似,都可以进行 Istio 路由规则 的配置。下面我们使用 istioctl 为 httpbin.org 服务设置一个超时规则。在测试 Pod 内部,使用 curl 调用 httpbin.org 这一外部服务的 /delay 端点:

kubectl exec -it $SOURCE_POD -c sleep sh
time curl -o /dev/null -s -w "%{http_code}\n" http://httpbin.org/delay/5
200real    0m5.024s
user    0m0.003s
sys     0m0.003s

这个请求会在大概五秒钟左右返回一个内容为 200 (OK) 的响应。退出测试 Pod,使用 kubectl 为 httpbin.org 外部服务的访问设置一个 3 秒钟的超时:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: httpbin-ext
spec:hosts:- httpbin.orghttp:- timeout: 3sroute:- destination:host: httpbin.orgweight: 100
EOF

等待几秒钟之后,再次发起 curl 请求:

kubectl exec -it $SOURCE_POD -c sleep sh
time curl -o /dev/null -s -w "%{http_code}\n" http://httpbin.org/delay/5
504real    0m3.149s
user    0m0.004s
sys     0m0.004s

这一次会在 3 秒钟之后收到一个内容为 504 (Gateway Timeout) 的响应。虽然 httpbin.org 还在等待他的 5 秒钟,Istio 却在 3 秒钟的时候切断了请求。

直接调用外部服务

如果想要跳过 Istio直接访问某个 IP 范围内的外部服务,就需要对 Envoy sidecar 进行配置,阻止 Envoy 对外部请求的劫持。不推荐此方式,详细了解请自行查阅文档。

总结

控制Egress流量,可以使用两种方式从 Istio 服务Mesh内部来完成对外部服务的调用:

  • 使用 ServiceEntry (推荐方式)
  • 配置 Istio sidecar,从它的重定向 IP 表中排除外部服务的 IP 范围

第一种方式(ServiceEntry)中,Mesh内部的服务不论是访问内部还是外部的服务,都可以使用同样的 Istio 服务Mesh的特性。我们通过为外部服务访问设置超时规则的例子,来证实了这一优势。第二种方式越过了 Istio sidecar proxy,让服务直接访问到对应的外部地址。然而要进行这种配置,需要了解云供应商特定的知识和配置。

第十七部分 Istio控制 Egress 流量相关推荐

  1. 控制 Egress 流量

    原文链接:控制 Egress 流量 本文主要内容来自 Istio 官方文档,并对其进行了大量扩展和补充. 缺省情况下,Istio 服务网格内的 Pod,由于其 iptables 将所有外发流量都透明的 ...

  2. 【云驻共创】华为云云原生之Istio控制面架构深度剖析

    文章目录 前言 一.Istio的基本概念 1.Istio诞生背景 2.Istio的定义 3.Istio优势 二.Istio整体架构及工作原理 1.Istio整体架构 1.1 控制面Istiod 1.1 ...

  3. 【品高云技巧】002.通过弹性IP控制网络流量(QoS)

    1.场景 与内网应用不同,当企业使用租用的互联网带宽对外部提供服务时,需要考虑各个应用的实际带宽占用,不能让宝贵的公网带宽资源被无限制占用,从而影响业务运行. 2.解决思路 BingoCloudOS提 ...

  4. OpenShift 4 之Istio-Tutorial (11) 控制Egress访问

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.6环境中验证 Istio缺省是不限制服务网格中的服务对外部访问的,不过我们可以对Egress进行控制 ...

  5. 用tc(traffic control)控制网络流量

    1.用TC控制网络延时.具体来说就是控制本机处理一个数据报文的时延,也就是rtt. sudo tc qdisc add dev eth0 root netem delay 1000ms //设置1秒的 ...

  6. linux 控制网卡流量,如何管理和控制多网卡 Linux 虚拟机的流量走向

    如何管理和控制多网卡 Linux 虚拟机的流量走向 02/28/2018 本文内容 现象描述 多网卡虚拟机默认会使用主网卡跟外界进行通信,其他的辅网卡默认是不会被用来跟外界通信,可以使用本文介绍的方法 ...

  7. 怎样用Netfilter/IPtables控制P2P流量

    今年4月,看到一则报道说尽管某宽带公司现有技术可以容纳的网络用户容量为400至600万用户,可是目前,在容纳了45万用户的情况下,网络已经拥挤不堪,时常出现断网情况,一到上网高峰,网速就会急剧下降. ...

  8. 交换机、路由器网络监控平台,准入控制、流量监控

    交换机作为局域网中的核心设备之一,它的工作性能直接决定着网络的数据传输性能.可是,在长时间工作之后,交换机难免会遇到这样或那样的故障现象:为了及时解决故障现象,管理人员就需要一款简单易用的交换机管理软 ...

  9. 使用TC的htb队列控制网络流量

    起因,放在公司内的部分服务器对外提供服务,而且是很重要的服务,但由于公司员工上网也要占据很大的流量,往往导致服务器抢不到带宽,严重影响服务器的对外服务,于是考虑限制公司员工上网的带宽,确保服务器对外提 ...

最新文章

  1. c语言排序教学过程,C语言中冒泡排序算法教学设计
  2. Java实战应用50篇(一)-Java并发编程:volatile关键字解析
  3. SEO那些事:一句代码一键分享网站
  4. Mysql(4)——数据库相关操作
  5. java 参数返回_Java基础---Java中带参数返回值方法的使用(四十)
  6. 深度CTR预估模型中的特征自动组合机制演化简史
  7. 脆弱的是生命 不脆弱的是精神 雅安 挺住!
  8. css根据屏幕大小切换样式
  9. ajax请求上传数组
  10. RadComboBox的用法
  11. java springboot宠物医院管理系统(毕业设计)
  12. 6.1色彩的概念和对比和调和
  13. 单工,半双工,全双工区别以及TDD和FDD区别
  14. 2022最新显卡天梯图,2022显卡天梯排行榜
  15. ping命令显示的TTL是什么意思
  16. Dr.com 新版 Ver 5.2.0 本地 密码 读取 查看 破解
  17. java中获取当前时间的代码
  18. java 仿qq登陆界面
  19. 培训演讲的小技巧,你知道多少?
  20. 艰难的SIC自我救赎之路(无导师指导自救记录,共勉)

热门文章

  1. 小学三年级计算机导学案,小学三年级下册科学导学案
  2. 手持式水质监测仪在污水处理中的应用
  3. kbhit linux windows通用,_kbhit() for Linux
  4. 个人怎么创建微信公众号?
  5. PM应该了解的九大项目管理问题
  6. Human-in-the-Loop Optimization of Exoskeleton Assistance Via Online Simulation of Metabolic Cost
  7. 系统集成项目管理工程师 下午 真题 及考点(2022年四套卷)
  8. RT-Thread柿饼的控件简介
  9. 达梦数据库DM8 DCA认证学习笔记
  10. 五路循迹传感器的优点_对于安装五路循迹传感器的机器人来说,如果五个传感器都遇到黑线,说明机器人的状态是()。...