Istio如何使用相同的端口访问网格外服务
1.1、背景
写这篇文章的目的是为了说明以下问题:如何使用TCP协议相同的端口访问网格外多个服务? 这是最近直播的时候有一个同学提出的,当时我没有完全明白,“访问多集群” 的意思。后来仔细思考了一下,问题应该就是Istio服务网格内如何通过相同的协议,端口访问不同的服务。
1.2、使用场景
肯定会有人回答,既然相同的端口不能使用,何不换一个端口呢,这样做也是一种解决方法。我在想有一些场景一定没法或者不方便绕过去。
1) 假如同一个网格内部署了生产,测试,开发三套环境,都需要通过3306端口访问对应环境的mysql数据库。
2) 假如同一个网格内部署了生产,测试,开发三套环境,都需要通过6379端口访问对应环境的redis。
在微服务盛行的今天,往往需要团队之间协作,没办法保证所有的微服务都运行在同一服务网格内。尤其是中间件服务,作为公司公共服务,一定是业务共享的。既然我们不可避免的需要使用相同的端口,访问外部服务,接下来告诉大家两种方案解决以上问题。
1.3、解决方案
通过相同的端口443访问 https://github.com 和 https://www.huaweicloud.com,从网格内访问外部服务,需要分别创建对应的ServiceEntentry:
1) www.huaweicloud.com
```
cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: hwcloud
spec:
hosts:
- www.huaweicloud.com
ports:
- number: 443
name: tcp
protocol: TCP
resolution: DNS
location: MESH_EXTERNAL
EOF
2) github.com
```
cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: github
spec:
hosts:
- github.com
ports:
- number: 443
name: tcp
protocol: TCP
resolution: DNS
location: MESH_EXTERNAL
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]
* Connection #0 to host www.huaweicloud.com left intact
```
```
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]
* Connection #0 to host github.com left intact
```
由此可见可以在网格内部访问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 <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: github
namespace: ns1
spec:
hosts:
- github.com
ports:
- number: 443
name: tcp
protocol: TCP
resolution: DNS
location: MESH_EXTERNAL
configScope: PRIVATE
EOF
cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: hwcloud
namespace: ns2
spec:
hosts:
- www.huaweicloud.com
ports:
- number: 443
name: tcp
protocol: TCP
resolution: DNS
location: MESH_EXTERNAL
configScope: PRIVATE
EOF
```
ConfigScope这种方式非常适合前面提到的场景:在同一个微服务网格内同时部署生产,测试环境, 并且生产,测试环境都需要调用对应环境的中间件服务(缓存,数据库,MQ等)。
1.4、小结
Istio服务网格内,端口冲突导致的服务连通性问题非常常见,但是千变万化都逃不过Listener - Route – Cluster – Endpoint, Envoy的所有功能归根到底都是通过这四种配置控制。社区提供的命令行工具:istioctl可以很方便的能够解析出Envoy的配置,便于快速定位问题。Ref:https://istio.io/help/ops/traffic-management/proxy-cmd/
Istio如何使用相同的端口访问网格外服务的更多相关文章
- Firewalld--02 端口访问/转发、服务访问、源地址管理
目录 防火墙端口访问/转发.服务访问.源地址管理 1. 防火墙端口访问策略 2. 防火墙服务访问策略 3.防火墙接口管理 4.防火墙源地址管理 5. 防火墙端口转发策略 防火墙端口访问/转发.服务访问 ...
- Windows Server 2012 R2下通过80端口访问Odoo ERP
背景 Odoo 9.0系统,安装于Windows Server 2012R2,同时与IIS并存.Odoo自带web服务器,使用端口8069.因客户需要用80端口访问,因此需要进一步设置,且8069端口 ...
- ubuntu14.10服务器版安装xampp,配置域名端口访问
1.从xampp下载下了xampp-linux-1.7.3a.tar这个包,然后ftp到我的linux虚拟机中, 2.复制到opt下,(可以直接解压的)到opt下面,tar xvfz xampp-li ...
- Nginx配置二级目录/路径 映射不同的反向代理和规避IP+端口访问
当配置Nginx来映射不同的服务器 可以通过二级路径来反向代理 来解决一个外网端口实现多个服务访问. 配置如下: server { listen ; server_name demo.domai ...
- vue2.5.2版本 :MAC设置应用在127.0.0.1:80端口访问; 并将127.0.0.1指向www.yours.com ;问题“ Invalid Host header”
0.设置自己的host文件,将127.0.0.1指向自己想要访问的域名 127.0.0.1 www.yours.com 1.MAC设置应用在127.0.0.1:80端口访问: config/index ...
- Linux服务器tomcat无法通过ip加端口访问
Linux服务器tomcat无法通过ip加端口访问 防火墙开放端口 # Firewall configuration written by system-config-firewall# Manual ...
- linux 用tcpdump查看80端口访问有哪些IP
linux 用tcpdump查看80端口访问有哪些IP: tcpdump -i eth0 -tnn dst port 80 -c 1000|awk -F"." '{print $1 ...
- Nginx高级配置,同1台机器部署多个tomcat、配置多个域名,每个域名指向某一个tomcat下的项目,共用Nginx80端口访问;
需求说明: 只有一台服务器和一个公网IP,多个项目部署在这台机器上面,且每个项目使用一个单独的域名访问,域名访问时都通过Nginx的80端口访问.(如下图所示) 配置过程: 一.tomcat的serv ...
- Linux通过端口转发来访问内网服务(端口转发访问阿里云Redis数据库等服务)
# 安装rinetd wget http://www.boutell.com/rinetd/http/rinetd.tar.gz&&tar -xvf rinetd.tar.gz& ...
随机推荐
- 使用AndroidStudio上传忽略文件至SVN Server的解决措施
在同组项目进行共享时,容易把本地的配置文件比如*.iml等文件上传至共享服务器,这样会对队友造成巨大的麻烦,为了解决这个问题,可以使用下面方法解决,下面以上传到服务器的app.iml文件为例. 一.在 ...
- 【项目 · Wonderland】预则立 && 他山之石
[软 工 实 践 · 团 队 作 业] 预则立&&他山之石 标签:WonderLand Part 0 · 简要目录 Part 1 · 团队计划 Part 2 · 团队访谈 Part 3 ...
- UML学生成绩管理系统需求分析
学生成绩管理系统工作室高校教育工作的一项重要内容.教务管理工作是指学校管理人员按照一定的教育方针,运用先进的管理手段,组织.协调.指挥并指导各用户活动,一边高效率.高质量地完成各项教学任务,完成国家所 ...
- CountUp.js用法 让数字动起来的插件
CountUp.js 无依赖的.轻量级的 JavaScript 类,可以用来快速创建以一种更有趣的动画方式显示数值数据.尽管它的名字叫 countUp,但其实可以在两个方向进行变化,这是根据你传递的 ...
- swift语言的特征:类型系统与函数式编程:swift是面向类型和面向函数编程的语言
swift语言的特征: 类型系统:值类型与引用类型.泛型.协议类型 函数式编程:
- BZOJ4766:文艺计算姬(矩阵树定理)
Description "奋战三星期,造台计算机".小W响应号召,花了三星期造了台文艺计算姬.文艺计算姬比普通计算机有更多的艺术细胞. 普通计算机能计算一个带标号完全图的生成树个数 ...
- header头
<?php header('HTTP/1.1 200 OK'); // ok 正常访问 header('HTTP/1.1 404 Not Found'); //通知浏览器 页面不存在 heade ...
- 包、继承、Super、方法重写
1 包_继承 1.1 包 包(package) 用于管理程序中的类,主要用于解决类的同名问题.包可以看出目录. 包的作用 [1] 防止命名冲突. [2] 允许类组成一个单元(模块),便于管理和维护 [ ...
- TDD&BDD
BDD行为驱动开发的一种敏捷开发技术 TDD测试驱动开发
- WorldWind源码剖析系列:影像存储类ImageStore、Nlt影像存储类NltImageStore和WMS影像存储类WmsImageStore
影像存储类ImageStore 影像存储类ImageStore提供了计算本地影像路径和远程影像影像URL访问的各种接口,是WmsImageStore类和NltImageStore类的基类.当划分完层次 ...