Control Egress Traffic task 演示了在服务网格内的应用如何访问外部(k8s集群外)的HTTP和HTTPS服务。快速提醒:默认情况下,启用Istio的应用不能访问集群外部的URL。为了启用这种访问,必须定义 ServiceEntry ,或者必须经过配置 direct access to external services (直接访问外部服务)。

TLS Origination for Egress Traffic task示范了如何允许应用在外部服务需要HTTPS的时候发送HTTP请求。

这个task展示如何配置Istio以通过被称为 Egress Gateway 的专用服务来引导egress流量。我们实现了与TLS Origination for Egress Traffic task中相同的功能,只是这次我们通过增加egress gateway来完成。

Use case

考虑一个组织有严格的安全需求。根据这些需求,离开服务网格的所有流量必须流经一组专用节点。这些节点将运行在专用机器上,与用于在集群中运行应用的其余节点分开运行。特殊节点将用于出口流量的策略执行,并且将比其他节点更加彻底地进行监控。

Istio 0.8引入了ingress和egress网关地概念( ingress and egress gateways)。Ingress网关允许你定义所有入站流量流经地服务网格的入口点。Egress 网关是一个对称的概念,它定义了网格的出口点。egress网关允许Istio功能(例如监控和路由规则)应用于网格的出站流量。

另一个用例是应用程序节点没有公共IPs的集群,因此运行在网格内的服务无法访问Internet。定义egress网关,引导所有出口流量通过egress网关,并将公网IP分配给出口网关节点,允许应用节点以受控方式访问外部服务。

Before you begin

  • 安装Istio
  • 启动 sleep 示例应用,作为外部调用的测试源。

如果你开启了自动注入sidecar,执行

kubectl apply -f samples/sleep/sleep.yaml

samples/sleep/sleep.yaml

否则,你不得不在部署sleep 应用前手动注入sidecar:

kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml)

注意: 任何你能 curl 和exec 的pod都可以。

  • 创建一个shell变量来保存将请求发送到外部服务的源pod的名称。如果我们使用sleep例子,我们运行:
export SOURCE_POD=$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})

Define an egress Gateway and direct HTTP traffic through it

首先让我们管理没有创建TLS的HTTP流量。

1.为 edition.cnn.com 创建一个egress Gateway ,端口80:

cat <<EOF | istioctl create -f -
kind: Gateway
metadata:name: istio-egressgateway
spec:selector:istio: egressgatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- "edition.cnn.com"
EOF

2.为 edition.cnn.com 定义一个ServiceEntry ,和一个管理通过egress网关流量的VirtualService

cat <<EOF | istioctl create -f -
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:name: cnn
spec:hosts:- edition.cnn.com
  ports:- number: 80
    name: http-portprotocol: HTTP- number: 443
    name: httpsprotocol: HTTPSresolution: DNS
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: direct-through-egress-gateway
spec:hosts:- edition.cnn.com
  gateways:- istio-egressgateway
  - mesh
  http:- match:
    - gateways:
      - mesh
      port: 80route:- destination:
        host: istio-egressgateway.istio-system.svc.cluster.localport:number: 80weight: 100- match:
    - gateways:
      - istio-egressgateway
      port: 80route:- destination:
        host: edition.cnn.comport:number: 80weight: 100
EOF

3.向 http://edition.cnn.com/politics 发送一个HTTP请求。

kubectl exec -it $SOURCE_POD -c sleep -- curl -sL -o /dev/null -D - http://edition.cnn.com/politics
HTTP/1.1 301 Moved Permanently
...
location: https://edition.cnn.com/politics
...HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
...
Content-Length: 151654
...

输出应该和 TLS Origination for Egress Traffic task中,没有创建TLS的输出相同。

4.检查 istio-egressgateway pod 的日志,看到与我们请求相对应的一行。如果istio部署在命名空间 istio-system 中,打印日志的命令是:

kubectl logs $(kubectl get pod -l istio=egressgateway -n istio-system -o jsonpath='{.items[0].metadata.name}') egressgateway -n istio-system | tail

我们应该看到和我们请求相关的一行,类似下面:

[2018-06-14T11:46:23.596Z] "GET /politics HTTP/1.1" 301 - 0 0 3 1 "172.30.146.87" "curl/7.35.0" "ab7be694-e367-94c5-83d1-086eca996dae" "edition.cnn.com" "151.101.193.67:80"

注意,我们只将端口80的流量重定向到egress网关,到端口看443的HTTPS流量直接进入了 edition.cnn.com

Let’s clean up

让我们在执行下一步前移除之前的定义:

istioctl delete gateway istio-egressgateway
istioctl delete serviceentry cnn
istioctl delete virtualservice direct-through-egress-gateway

Perform TLS origination with the egress Gateway

让我们使用egress Gateway 执行创建TLS,和 TLS Origination for Egress Traffic task相同。注意在这个情况下,TLS创建将由egress网关服务器完成,而不是之前task中的sidecar进行。
1.为 edition.cnn.com 创建一个egress Gateway ,端口443:

cat <<EOF | istioctl create -f -
kind: Gateway
metadata:name: istio-egressgateway
spec:selector:istio: egressgatewayservers:- port:number: 443name: http-port-for-tls-originationprotocol: HTTPhosts:- "edition.cnn.com"
EOF

2.为 edition.cnn.com 定义一个ServiceEntry ,和一个管理通过egress网关流量的VirtualService

cat <<EOF | istioctl create -f -
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:name: cnn
spec:hosts:- edition.cnn.com
  ports:- number: 80
    name: http-portprotocol: HTTP- number: 443
    name: http-port-for-tls-originationprotocol: HTTPresolution: DNS
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: direct-through-egress-gateway
spec:hosts:- edition.cnn.com
  gateways:- istio-egressgateway
  - mesh
  http:- match:
    - gateways:
      - mesh
      port: 80route:- destination:
        host: istio-egressgateway.istio-system.svc.cluster.localport:number: 443weight: 100- match:
    - gateways:
      - istio-egressgateway
      port: 443route:- destination:
        host: edition.cnn.comport:number: 443weight: 100
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: originate-tls-for-edition-cnn-com
spec:host: edition.cnn.comtrafficPolicy:loadBalancer:simple: ROUND_ROBINportLevelSettings:- port:
        number: 443tls:mode: SIMPLE # initiates HTTPS for connections to edition.cnn.com
EOF

3.向 http://edition.cnn.com/politics 发送一个HTTP请求。

kubectl exec -it $SOURCE_POD -c sleep -- curl -sL -o /dev/null -D - http://edition.cnn.com/politics
HTTP/1.1 200 OK
...
content-length: 150793
...

输出应该和 TLS Origination for Egress Traffic task中,创建TLS的输出相同:没有 301 Moved Permanently 信息。

4.检查 istio-egressgateway pod 的日志,看到与我们请求相对应的一行。如果istio部署在命名空间 istio-system 中,打印日志的命令是:

kubectl logs $(kubectl get pod -l istio=egressgateway -n istio-system -o jsonpath='{.items[0].metadata.name}') egressgateway -n istio-system | tail

我们应该看到和我们请求相关的一行,类似下面:

"[2018-06-14T13:49:36.340Z] "GET /politics HTTP/1.1" 200 - 0 148528 5096 90 "172.30.146.87" "curl/7.35.0" "c6bfdfc3-07ec-9c30-8957-6904230fd037" "edition.cnn.com" "151.101.65.67:443"

Additional security considerations

注意,在Istio中定义egress网关本身并不会为egress网关服务运行的节点提供任何特殊处理。集群管理员或者云提供商需要在专用节点上部署egress网关,并引入其他安全措施,以使这些节点比网格中的其余部分更安全。

另外请注意,Istio本身并不能安全地强制所有egress流量实际上流经egress网关,Istio只能通过它的sidecar代理来实现这种流量控制。如果恶意应用会攻击附属于应用pod的sidecar代理,则它可能会绕过sidecar代理。绕过sidecar代理后,恶意应用可能尝试绕过egress网关离开服务网格,以逃避Istio的控制和监视。由集群管理员和云提供商强制确保没有流量绕过egress网关离开网格。这种强制性必须由Istio的外部机制执行。例如,防火墙可以拒绝来源不是egress网关的所有流量。 Kubernetes network policies 还可以禁止所有不属于egress网关的出口流量。另一种可能的安全措施涉及配置网络,使得应用节点无法访问互联网,这样就无需通过网关监控和控制出口流量。这种网络配置的例子是专门将公共IPs分配给网关。

Cleanup

1.移除我们之前创建的Istio配置记录:

istioctl delete gateway istio-egressgateway
istioctl delete serviceentry cnn
istioctl delete virtualservice rewrite-port-for-edition-cnn-com
istioctl delete destinationrule originate-tls-for-edition-cnn-com

2.关闭sleep服务:

kubectl delete -f samples/sleep/sleep.yaml

Configure an Egress Gateway(0.8)相关推荐

  1. Istio Egress Gateway出口流量管理

    缺省状态下,Istio服务网格内的Pod,由于其iptables将所有外发流量都透明的转发给了sidecar,所以这些集群内的服务无法访问集群之外的 URL,而只能处理集群内部的目标. 控制出口流量描 ...

  2. Control Egress Traffic(0.8)

    默认情况下,启用Istio的服务无法访问集群外的URL,因为在pod中使用iptables将所有出站流量透明地重定向到仅处理集群内目的地的sidecar代理. 这个task描述如何配置Istio向启用 ...

  3. TLS Origination for Egress Traffic(0.8)

    Control Egress Traffic task 演示了在服务网格内的应用如何访问外部(k8s集群外)的HTTP和HTTPS服务.快速提醒:默认情况下,启用Istio的应用不能访问集群外部的UR ...

  4. Istio官方文档翻译

    本来是有翻译好的文档的,但是当时没打开,不巧是今天给打开了...但是我花了两天的时间翻译了不少,没办法,为了尊重自己的劳动成果,还是贴过来吧... 还是建议大家直接去Istio官方文档中文版. 我只翻 ...

  5. Istio的Ingress与Egress网关

    一.认识Ingress 在Istio的流量控制中,Ingress可以理解为前端应用的一个代理网格,当被转发到代理容器的流量到达服务前,会先经过该服务的Ingress Gateway,之后:再有Ingr ...

  6. 20-【istio】-【流量管理】-【Ingress gateway】Istio ingress gateway

    这里以istio 1.6.0为例 不同版本的istio安装步骤参考官网:Istio / Ingress Gateways 注:这里只给出相关步骤参考,在实践时,结合该博客.官网一起看. istio i ...

  7. linux下能用qt5.0,qt5.0移植

    qt5.0 release版终于在2012/12/19出来了 看了下源码,模块化做得很不错,很多东西都从原来的qtbase里抽出来,变成单独模块,依赖关系变得很明确 然后就抽了点时间(到年底了,事情也 ...

  8. 计算机网络实验:VLAN Practice Lab Setup in Packet Tracer and Configure DHCP Server for multiple VLAN

    实验教程原文地址:1.VLAN Practice Lab Setup in Packet Tracer和2.Configure DHCP Server for multiple VLANs on th ...

  9. 编译的 Ruby 2.3.0 缺少 openssl 支持的解决方法 (已解决)

    我的系统是centos 7.5,已离线安装ruby-2.3.0,openssl-1.0.2l,rubygems-2.7.4 如下图: 但是在  gem sources -a http://gems.r ...

最新文章

  1. ecshop入门第一步,替换ecshop模板的显示图片
  2. 【原】使用Json作为Python和C#混合编程时对象转换的中间文件
  3. Windows下oracle RMAN备份脚本
  4. Servlet页面间对象传递的方法
  5. python argparse模块详解_python学习之argparse模块
  6. 微软向丰田授权专利 欲成为车联网技术关键供应商
  7. rest api如何创建_创建一个安全的Spring REST API
  8. bi 存储过程方案_BI 系统中容易被忽视的数据源功能
  9. 三维重建中旋转矩阵与平移矩阵思想误区(转载)
  10. 网络管理不简单 需化被动为主动
  11. 介绍两个Ubuntu上的桌面小工具
  12. 【数据分享】滤泡性淋巴瘤研究数据集
  13. YACC (Yet Another Compiler Compiler)
  14. Atitit常见的标准化组织与规范数量jcp ecma iso
  15. 2017计算机夏令营汇总
  16. RK3568-ANDROID11-降频DDR
  17. html网页的框架标记分别有,新手入门前端,应该知道HTML框架排版标记标签大全...
  18. 华为鸿蒙魔法闪投大小屏幕互动,「老熊科普」魔法闪投,荣耀智慧屏就是你的“超级大手机”...
  19. 如何选型PLM软件?PLM选型时注意哪些事项呢?
  20. 无人驾驶频频碰壁,AI产品落地之路为何走的如此糟心?

热门文章

  1. excel如何提取单元格中的数字
  2. android系统升级实现,疯狂升级的Android系统
  3. linux 虚拟ip 作用,linux-高可用之虚拟ip地址(VIP)
  4. DELL T7600工作站重新安装WIN7系统
  5. 详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作
  6. 教师语言表达-语言互动
  7. 安卓手机玩游戏卡顿怎么解决_安卓手机卡顿如何解决?教你四招,流畅度立刻飙升!...
  8. android保存播放进度,Android MediaPlayer控制进度播放音频
  9. 密西西比河谷州立大学:Android应用程序开发(三)
  10. 餐桌 (Standard IO)