内容简介:1.1、背景写这篇文章的目的是为了说明以下问题:如何使用TCP协议相同的端口访问网格外多个服务? 这是最近直播的时候有一个同学提出的,当时我没有完全明白,“访问多集群” 的意思。后来仔细思考了一下,问题应该就是Istio服务网格内如何通过相同的协议,端口访问不同的服务。1.2、使用场景
1.1、背景
写这篇文章的目的是为了说明以下问题:如何使用TCP协议相同的端口访问网格外多个服务? 这是最近直播的时候有一个同学提出的,当时我没有完全明白,“访问多集群” 的意思。后来仔细思考了一下,问题应该就是Istio服务网格内如何通过相同的协议,端口访问不同的服务。
1.2、使用场景
肯定会有人回答,既然相同的端口不能使用,何不换一个端口呢,这样做也是一种解决方法。我在想有一些场景一定没法或者不方便绕过去。
1) 假如同一个网格内部署了生产,测试,开发三套环境,都需要通过3306端口访问对应环境的 mysql 数据库。
2) 假如同一个网格内部署了生产,测试,开发三套环境,都需要通过6379端口访问对应环境的redis。
在微服务盛行的今天,往往需要团队之间协作,没办法保证所有的微服务都运行在同一服务网格内。尤其是中间件服务,作为公司公共服务,一定是业务共享的。既然我们不可避免的需要使用相同的端口,访问外部服务,接下来告诉大家两种方案解决以上问题。
1.3、解决方案
通过相同的端口443访问 https://github.com 和 https://www.huaweicloud.com ,从网格内访问外部服务,需要分别创建对应的ServiceEntentry:
cat < apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: hwcloud spec: hosts: EOF 2) github.com cat < apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: github spec: hosts: EOF 两条规则建好之后,等待pilot将新的配置下发到所有的proxy,我们通过sleep pod验证连通性 $ kubectl exec sleep-754684654f-trpt2 -- curl -sL -o /dev/null https://www.huaweicloud.com –v … < HTTP/1.1 200 OK < Server: NWSs < Date: Fri, 21 Dec 2018 02:23:11 GMT < Content-Type: text/html;charset=utf-8 < Content-Length: 703122 < Connection: keep-alive < Cache-Control: public, max-age=600 < Expires: Fri, 21 Dec 2018 02:33:10 GMT < Last-Modified: Thu, 20 Dec 2018 10:30:00 GMT < X-NWS-LOG-UUID: 0d13017f-8767-4399-a509-6c11b2a9f3d0 < Access-Control-Allow-Origin: * < dl-from: qcloud < X-Cache-Lookup: Hit From Disktank3 < X-Via: LIANTONG-HENAN_171(200:hit) < { [15930 bytes data] kubectl exec sleep-754684654f-trpt2 -- curl -sL -o /dev/null https://github.com –v -k … < HTTP/1.1 404 Not Found < Server: NWSs < Date: Fri, 21 Dec 2018 02:29:26 GMT < Content-Type: text/html < Content-Length: 52 < Connection: keep-alive < X-NWS-LOG-UUID: b283fee3-89e0-48bc-8d6e-0c3a68ecc4bf < X-Via: LIANTONG-HENAN_25(404:hit) < { [52 bytes data] 由此可见可以在网格内部访问 https://www.huaweicloud.com ,但是不可以访问 https://github.com. 这里有一个原因是istio会将ServiceEntry规则按照创建时间排序,创建时间较早的优先级高,所以先创建的 hwcloud ServiceEntry生效。 可以查看sleep pod上的配置来确认:listener配置只有到华为云的cluster"outbound|443|| www.huaweicloud.com" $ istioctl pc listener sleep-754684654f-trpt2 --address=0.0.0.0 --port=443 -ojson [ { "name": "0.0.0.0_443", "address": { "socketAddress": { "address": "0.0.0.0", "portValue": 443 } }, "filterChains": [ { "filters": [ { "name": "mixer", … }, { "name": "envoy.tcp_proxy", "config": { "access_log": [ { … } ], "cluster": "outbound|443|| www.huaweicloud.com" , "stat_prefix": "outbound|443|| www.huaweicloud.com" } } ] } ], … } ] 为了同时访问两者,这里我提供两种方法: 1.3.1创建ServiceEntry时指定Address 查询 www.huaweicloud.com 域名绑定的ip地址,选择一个或者多个更新hwcloud ServiceEntry 同样的方法更新 github 验证 https://www.huaweicloud.com 和 https://github.com 均可以从网格内访问,因为指定了spec.addresses 后,pilot生成listener使就会使用指定的ip地址代替‘0.0.0.0’的全匹配方式。 虽然着这种方式一定程度上可以解决同一端口访问外部服务的需求。但是由于需要提前设置ip地址,所以在ip经常变动的场景下缺少灵活性。下面提供一种更灵活的方法。 1.3.2 指定ServiceEntry的作用域 Istio社区最近实现了网络的配置作用域特性: https://github.com/istio/istio/pull/10287 , 允许用户设置相应规则的作用域范围。 目前 ServiceEntry,VirtualService,Gateway, DestinationRule等都可以通过spec.configScope设置作用范围。ConfigScope 可以设置为"PUBLIC","PRIVATE"类型。 "PUBLIC" 表示规则对网格内所有的工作负载可见,这也是默认值。 "PRIVATE" 表示规则仅对同一namespace下面的工作负载可见。 因此可以利用ConfigScope将github以及hwcloud都设置成PRIVATE,分别创建在两个不同的namespace下面。这样也可以做到ns1内的工作负载访问 https://github.com , ns2内的工作负载访问 https://www.huaweicloud.com . cat < apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: github namespace: ns1 spec: hosts: EOF cat < apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: hwcloud namespace: ns2 spec: hosts: EOF ConfigScope这种方式非常适合前面提到的场景:在同一个微服务网格内同时部署生产,测试环境, 并且生产,测试环境都需要调用对应环境的中间件服务(缓存,数据库,MQ等)。 1.4、小结 Istio服务网格内,端口冲突导致的服务连通性问题非常常见,但是千变万化都逃不过Listener - Route – Cluster – Endpoint, Envoy的所有功能归根到底都是通过这四种配置控制。社区提供的命令行工具:istioctl可以很方便的能够解析出Envoy的配置,便于快速定位问题。Ref: https://istio.io/help/ops/traf ... -cmd/
ports:
name: tcp
protocol: TCP
resolution: DNS
location: MESH_EXTERNAL
ports:
name: tcp
protocol: TCP
resolution: DNS
location: MESH_EXTERNAL
ports:
name: tcp
protocol: TCP
resolution: DNS
location: MESH_EXTERNAL
configScope: PRIVATE
ports:
name: tcp
protocol: TCP
resolution: DNS
location: MESH_EXTERNAL
configScope: PRIVATE
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Nginx+Tomcat实现80端口转发8080端口
- [Grid 网格布局教程]显式网格和隐式网格之间的区别
- 猎鹰网络安全工具新功能:主机端口扫描可以自定义端口范围
- nginx代理其他端口到80端口-低调小熊猫的技术小黑屋
- 精彩的无服务器时代:不仅有服务网格,还有事件网格
- 服务网格重蹈ESB的覆辙?为什么需要SMI服务网格接口? - samnewman
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
逆向工程核心原理
[韩] 李承远 / 武传海 / 人民邮电出版社 / 2014-4-25 / 109.00元
本书十分详尽地介绍了代码逆向分析的核心原理。作者在Ahnlab 研究所工作多年,书中不仅包括其以此经验为基础亲自编写的大量代码,还包含了逆向工程研究人员必须了解的各种技术和技巧。彻底理解并切实掌握逆向工程这门技术,就能在众多IT 相关领域进行拓展运用,这本书就是通向逆向工程大门的捷径。 想成为逆向工程研究员的读者或正在从事逆向开发工作的开发人员一定会通过本书获得很大帮助。同时,想成为安全领域......一起来看看 《逆向工程核心原理》 这本书的介绍吧!