istio.io/archive/v1.0/zh/blog/2018/egress-https/index.html

59 lines
36 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html><html lang=zh itemscope itemtype=https://schema.org/WebPage><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=theme-color content="#466BB0"><meta name=title content="使用外部 Web 服务"><meta name=description content="描述基于 Istio Bookinfo 示例的简单场景。"><meta name=author content="Vadim Eisenberg"><meta name=keywords content="microservices,services,mesh,流量管理,egress,https"><meta property="og:title" content="使用外部 Web 服务"><meta property="og:type" content="website"><meta property="og:description" content="描述基于 Istio Bookinfo 示例的简单场景。"><meta property="og:url" content="/v1.0/zh/blog/2018/egress-https/"><meta property="og:image" content="/v1.0/img/istio-logo-blue-background.svg"><meta property="og:image:alt" content="Istio Logo"><meta property="og:image:width" content="112"><meta property="og:image:height" content="150"><meta property="og:site_name" content="Istio"><meta name=twitter:card content="summary"><meta name=twitter:site content="@IstioMesh"><title>Istioldie 1.0 / 使用外部 Web 服务</title><script async src="https://www.googletagmanager.com/gtag/js?id=UA-98480406-2"></script><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}
gtag('js',new Date());gtag('config','UA-98480406-2');</script><script>var branchName="release-1.0";var docTitle="使用外部 Web 服务";</script><link rel=alternate type=application/rss+xml title="Istio Blog" href=/v1.0/feed.xml><link rel="shortcut icon" href=/v1.0/favicons/favicon.ico><link rel=apple-touch-icon href=/v1.0/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/v1.0/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/v1.0/favicons/favicon-32x32.png sizes=32x32><link rel=icon type=image/png href=/v1.0/favicons/android-36x36.png sizes=36x36><link rel=icon type=image/png href=/v1.0/favicons/android-48x48.png sizes=48x48><link rel=icon type=image/png href=/v1.0/favicons/android-72x72.png sizes=72x72><link rel=icon type=image/png href=/v1.0/favicons/android-96x196.png sizes=96x196><link rel=icon type=image/png href=/v1.0/favicons/android-144x144.png sizes=144x144><link rel=icon type=image/png href=/v1.0/favicons/android-192x192.png sizes=192x192><link rel=manifest href=/v1.0/manifest.json><meta name=apple-mobile-web-app-title content="Istio"><meta name=application-name content="Istio"><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Chivo:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic"><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Work Sans:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic"><link rel=stylesheet href=https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css integrity=sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm crossorigin=anonymous><link rel=stylesheet href=https://use.fontawesome.com/releases/v5.0.6/css/all.css><link rel=stylesheet href=/v1.0/css/light_theme_archive.css title=light><link rel="alternate stylesheet" href=/v1.0/css/dark_theme_archive.css title=dark><script src=/v1.0/js/styleSwitcher.min.js></script></head><body class=language-unknown><header><nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark justify-content-between"><a class=navbar-brand href=/v1.0/zh/><span class=logo><svg viewBox="0 0 300 300"><circle cx="150" cy="150" r="150" stroke-width="2" /><polygon points="65,240 225,240 125,270"/><polygon points="65,230 125,220 125,110"/><polygon points="135,220 225,230 135,30"/></svg></span><span class=brand-name>Istioldie 1.0</span></a>
<button class=navbar-toggler type=button data-toggle=collapse data-target=#navbarCollapse aria-controls=navbarCollapse aria-expanded=false aria-label="Toggle navigation">
<span class=navbar-toggler-icon></span></button><div class="collapse navbar-collapse justify-content-end" id=navbarCollapse><ul id=navbar-links class="navbar-nav active"><li class=nav-item><a class=nav-link title="了解如何部署、使用和运维 Istio。" href=/v1.0/zh/docs/>文档</a></li><li class=nav-item><a class="nav-link active" title="关于使用 Istio 的博客文章。" href=/v1.0/zh/blog/2018/announcing-1.0/>博客</a></li><li class=nav-item><a class=nav-link title="一堆帮助您部署、配置和使用 Istio 的资源。" href=/v1.0/zh/help/>帮助</a></li><li class=nav-item><a class=nav-link title=关于Istio的说明。 href=/v1.0/zh/about/>关于</a></li><li class="nav-item dropdown" id=gearDropdown style=white-space:nowrap><a title=选项和设置 href class=nav-link data-toggle=dropdown aria-label=Tools aria-haspopup=true aria-expanded=false><i style=width:1em class="fa fa-lg fa-cog"></i></a><div class="dropdown-menu dropdown-menu-right" aria-labelledby=gearDropdown><a class=dropdown-item id=light-theme-item href onclick="setActiveStyleSheet('light');return false;">亮主题</a>
<a class=dropdown-item id=dark-theme-item href onclick="setActiveStyleSheet('dark');return false;">暗主题</a><div class=dropdown-divider></div><h6 class=dropdown-header>本站的其它版本</h6><a href=https://istio.io class=dropdown-item>当前版本</a>
<a href=https://preliminary.istio.io class=dropdown-item>下个版本</a>
<a href=https://archive.istio.io class=dropdown-item>旧版本</a></div></li><li class=nav-item><a id=search_show class=nav-link href title=搜索istio.io aria-label=Search><i style=width:1em class="fa fa-lg fa-search"></i></a></li></ul><form name=cse id=search_form class="form-inline mr-sm-2" role=search><input type=hidden name=cx value=013699703217164175118:iwwf17ikgf4>
<input type=hidden name=ie value=utf-8>
<input type=hidden name=hl value=en>
<input type=hidden id=search_page_url value=/v1.0/search.html>
<input id=search_textbox class=form-control name=q type=text aria-label="Search this site">
<button id=search_close type=reset aria-label="Cancel Search"><i class="far fa-lg fa-times-circle"></i></button></form></div></nav></header><div class=blog><div class=container-fluid><div class="row row-offcanvas"><div class="col-0 col-md-3 col-xl-2 sidebar-offcanvas"><nav class="sidebar d-print-none"><div class=spacer></div><div class=directory role=tablist><div class=card><div class=card-header role=tab id=header0><a data-toggle=collapse href=#collapse0 title="2017 年的博客文章。" role=button aria-controls=collapse0><div><img src=/v1.0/img/blog.svg alt=Icon class=page_icon>
2017 年的博客文章</div></a></div><div id=collapse0 class=collapse data-parent=#sidebar role=tabpanel aria-labelledby=header0><div class=card-body><ul class=tree><li><a title=提高可用,降低延迟。 href=/v1.0/zh/blog/2017/mixer-spof-myth/>Mixer 和 SPOF 神话</a></li><li><a title="概要说明 Mixer 的插件架构。" href=/v1.0/zh/blog/2017/adapter-model/>Mixer 适配器模型</a></li><li><a title="Istio 0.2 公告。" href=/v1.0/zh/blog/2017/0.2-announcement/>宣布 Istio 0.2</a></li><li><a title="使用 Istio 创建自动缩放的金丝雀部署。" href=/v1.0/zh/blog/2017/0.1-canary/>使用 Istio 进行金丝雀部署</a></li><li><a title="Istio Auth 0.1 公告。" href=/v1.0/zh/blog/2017/0.1-auth/>使用 Istio 增强端到端安全</a></li></ul></div></div></div><div class=card><div class=card-header role=tab id=header1><a data-toggle=collapse href=#collapse1 title="2018 年的博客文章。" role=button aria-controls=collapse1><div><img src=/v1.0/img/blog.svg alt=Icon class=page_icon>
2018 年的博客文章</div></a></div><div id=collapse1 class="collapse show" data-parent=#sidebar role=tabpanel aria-labelledby=header1><div class=card-body><ul class=tree><li><a title="Istio 1.0 已生产就绪。" href=/v1.0/zh/blog/2018/announcing-1.0/>宣布 Istio 1.0</a></li><li><a title="Istio v1alpha3 路由 API 介绍,动机及其设计原则。" href=/v1.0/zh/blog/2018/v1alpha3-routing/>Istio v1aplha3 路由 API 介绍</a></li><li><a title="描述如何在AWS上使用网络负载均衡器配置 Istio Ingress。" href=/v1.0/zh/blog/2018/aws-nlb/>使用AWS NLB 配置 Istio Ingress</a></li><li><a title="使用 Kubernetes 命名空间和 RBAC 为 Istio 构建软性多租户环境。" href=/v1.0/zh/blog/2018/soft-multitenancy/>Istio 的软性多租户支持</a></li><li><a title=介绍更安全,低风险的部署和发布到生产。 href=/v1.0/zh/blog/2018/traffic-mirroring/>用于在生产环境进行测试的 Istio 流量镜像功能</a></li><li><a title="描述基于 Istio 的 Bookinfo 示例的简单场景。" href=/v1.0/zh/blog/2018/egress-tcp/>使用外部 TCP 服务</a></li><li><span class=current title="描述基于 Istio Bookinfo 示例的简单场景。">使用外部 Web 服务</span></li></ul></div></div></div></div></nav></div><div class="col-12 col-md-9 col-xl-8"><p class=d-md-none><label class=sidebar-toggler data-toggle=offcanvas><i class="fa fa-sign-out-alt"></i></label></p><main aria-labelledby=title><div class=pagenav><p><a href=/v1.0/zh/blog/2018/ title="2018 年的博客文章。"><i style=transform:scaleX(-1) class="fa fa-level-up-alt"></i>&nbsp;2018 年的博客文章</a></p></div><h1 id=title>使用外部 Web 服务</h1><p class=subtitle>HTTPS 流量的出口规则</p><p class=byline>By <span class=attribution>Vadim Eisenberg</span>
/
<span class=publish_date>January 31, 2018</span></p><nav class="toc-inlined d-xl-none d-print-none"><hr><div class=directory role=directory><nav id=InlinedTableOfContents><ul><li><a href=#bookinfo--web->Bookinfo 示例应用程序使用外部的 Web 服务扩展详细信息</a></li><ul><li><a href=#heading>初始设定</a></li><li><a href=#bookinfo--2>Bookinfo 详细信息版本 2</a></li><li><a href=#google-book->Google Book 网络服务的出口规则</a></li></ul><li><a href=#istio>Istio出口流量控制的问题</a></li><ul><li><a href=#-istio--tls>由 Istio 发起的 TLS</a></li><ul><li><a href=#istio--tls->Istio 双向 TLS 的关系</a></li></ul><li><a href=#heading-1>恶意微服务威胁</a></li><li><a href=#-mixer->没有跟踪,遥测和没有 Mixer 检查</a></li></ul><li><a href=#heading-2>未来的工作</a></li><li><a href=#heading-3>结论</a></li><li><a href=#see-also>See also</a></li></ul></nav></div><hr></nav><p>在许多情况下,在 <em>service mesh</em> 中的微服务序并不是应用程序的全部, 有时,网格内部的微服务需要使用在服务网格外部的遗留系统提供的功能, 虽然我们希望逐步将这些系统迁移到服务网格中。 但是在迁移这些系统之前,必须让服务网格内的应用程序能访问它们。 还有其他情况,应用程序使用外部组织提供的 Web 服务,通常是通过万维网提供的服务。</p><p>在这篇博客文章中,我修改了<a href=/v1.0/zh/docs/examples/bookinfo/>Istio Bookinfo 示例应用程序</a>让它可以从外部 Web 服务(<a href=https://developers.google.com/books/docs/v1/getting_started>Google Books APIs</a> )获取图书详细信息。 我将展示如何使用 <em>egress rule</em> 在 Istio 中启用外部 HTTPS 流量。 最后,我解释了当前与 Istio 出口流量控制相关的问题。</p><h2 id=bookinfo--web->Bookinfo 示例应用程序使用外部的 Web 服务扩展详细信息</h2><h3 id=heading>初始设定</h3><p>为了演示使用外部 Web 服务的场景,我首先使用安装了 <a href=/v1.0/zh/docs/setup/kubernetes/quick-start/#%E5%AE%89%E8%A3%85%E6%AD%A5%E9%AA%A4>Istio</a> 的 Kubernetes 集群, 然后我部署<a href=/v1.0/zh/docs/examples/bookinfo/>Istio Bookinfo 示例应用程序</a>, 此应用程序使用 <em>details</em> 微服务来获取书籍详细信息,例如页数和发布者, 原始 <em>details</em> 微服务提供书籍详细信息,无需咨询任何外部服务。</p><p>此博客文章中的示例命令与 Istio 0.2+ 一起使用,无论启用或不启用<a href=/v1.0/zh/docs/concepts/security/#%E5%8F%8C%E5%90%91-tls-%E8%AE%A4%E8%AF%81>双向 TLS</a></p><p>此帖子的场景所需的 Bookinfo 配置文件显示自 <a href=https://github.com/istio/istio/releases/tag/0.5.0>Istio版本0.5</a></p><p>Bookinfo 配置文件位于 Istio 发行存档的 <code>samples/bookinfo/platform/kube</code> 目录中。</p><p>以下是原始<a href=/v1.0/zh/docs/examples/bookinfo/>Bookinfo示例应用程序</a>中应用程序端到端体系结构的副本。</p><figure style=width:80%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:59.08%><a class=not-for-endnotes href=/v1.0/docs/examples/bookinfo/withistio.svg><img class=element-to-stretch src=/v1.0/docs/examples/bookinfo/withistio.svg alt="The Original Bookinfo Application" title="The Original Bookinfo Application"></a></div><figcaption>The Original Bookinfo Application</figcaption></figure><h3 id=bookinfo--2>Bookinfo 详细信息版本 2</h3><p>让我们添加一个新版本的 <em>details</em> 微服务,<em>v2</em> ,从<a href=https://developers.google.com/books/docs/v1/getting_started>Google Books APIs</a>中获取图书详细信息。</p><pre><code class=language-command>$ kubectl apply -f &lt;(istioctl kube-inject -f @samples/bookinfo/platform/kube/bookinfo-details-v2.yaml@)</code></pre><a hidden style=display:none href=https://raw.githubusercontent.com/istio/istio/release-1.0/samples/bookinfo/platform/kube/bookinfo-details-v2.yaml></a><p>现在,应用程序的更新架构如下所示:</p><figure style=width:80%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:65.16%><a class=not-for-endnotes href=/v1.0/blog/2018/egress-https/bookinfo-details-v2.svg><img class=element-to-stretch src=/v1.0/blog/2018/egress-https/bookinfo-details-v2.svg alt="The Bookinfo Application with details V2" title="The Bookinfo Application with details V2"></a></div><figcaption>The Bookinfo Application with details V2</figcaption></figure><p>请注意Google Book 服务位于 Istio 服务网格之外,其边界由虚线标记。</p><p>现在让我们使用以下 <em>route rule</em> 将指向 <em>details</em> 微服务的所有流量定向到 <em>details version v2</em></p><pre><code class=language-bash>cat &lt;&lt;EOF | istioctl create -f -
apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
name: details-v2
namespace: default
spec:
destination:
name: details
route:
- labels:
version: v2
EOF</code></pre><p><a href=/v1.0/zh/docs/examples/bookinfo/#%E7%A1%AE%E5%AE%9A-ingress-%E7%9A%84-ip-%E5%92%8C%E7%AB%AF%E5%8F%A3>确定入口 IP 和端口</a>之后,让我们访问应用程序的网页。</p><p>糟糕&mldr;页面显示 <em>Error fetching product details</em>,而不是书籍详细信息:</p><figure style=width:80%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:36.01%><a class=not-for-endnotes href=/v1.0/blog/2018/egress-https/errorFetchingBookDetails.png><img class=element-to-stretch src=/v1.0/blog/2018/egress-https/errorFetchingBookDetails.png alt="The Error Fetching Product Details Message" title="The Error Fetching Product Details Message"></a></div><figcaption>The Error Fetching Product Details Message</figcaption></figure><p>好消息是我们的应用程序没有崩溃, 通过良好的微服务设计,我们没有让<strong>故障扩散</strong>。 在我们的例子中,失败的 <em>details</em> 微服务不会导致 <code>productpage</code> 微服务失败, 尽管 <em>details</em> 微服务失败,仍然提供了应用程序的大多数功能, 我们有<strong>优雅的服务降级</strong>:正如您所看到的,评论和评级正确显示,应用程序仍然有用。</p><p>那可能出了什么问题? 啊&mldr;&mldr;答案是我忘了启用从网格内部到外部服务的流量,在本例中是 Google Book Web服务。 默认情况下Istio sidecar代理<a href=https://www.envoyproxy.io>Envoy proxies</a><strong>阻止到集群外目的地的所有流量</strong>, 要启用此类流量,我们必须定义<a href=https://archive.istio.io/v0.7/docs/reference/config/istio.routing.v1alpha1/#EgressRule>出口规则</a></p><h3 id=google-book->Google Book 网络服务的出口规则</h3><p>不用担心,让我们定义<strong>出口规则</strong>并修复我们的应用程序:</p><pre><code class=language-bash>cat &lt;&lt;EOF | istioctl create -f -
apiVersion: config.istio.io/v1alpha2
kind: EgressRule
metadata:
name: googleapis
namespace: default
spec:
destination:
service: &#34;*.googleapis.com&#34;
ports:
- port: 443
protocol: https
EOF</code></pre><p>现在访问应用程序的网页会显示书籍详细信息而不会出现错误:</p><figure style=width:80%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:34.82%><a class=not-for-endnotes href=/v1.0/blog/2018/egress-https/externalBookDetails.png><img class=element-to-stretch src=/v1.0/blog/2018/egress-https/externalBookDetails.png alt="Book Details Displayed Correctly" title="Book Details Displayed Correctly"></a></div><figcaption>Book Details Displayed Correctly</figcaption></figure><p>请注意,我们的出口规则允许使用 HTTPS 协议在端口 443 上与任何与 <em>*.googleapis.com</em> 匹配的域进行流量传输, 让我们假设为了示例,我们的 Istio 服务网格中的应用程序必须访问 <em>googleapis.com</em> 的多个子域,例如 <em>www.googleapis.com</em> 以及 <em>fcm.googleapis.com</em> , 我们的规则允许流量到 <em>www.googleapis.com</em><em>fcm.googleapis.com</em>,因为它们都匹配 <em>*.googleapis.com</em> , 此<strong>通配符</strong>功能允许我们使用单个出口规则启用到多个域的流量。</p><p>我们可以查询我们的出口规则:</p><pre><code class=language-command>$ istioctl get egressrules
NAME KIND NAMESPACE
googleapis EgressRule.v1alpha2.config.istio.io default</code></pre><p>我们可以删除我们的出口规则:</p><pre><code class=language-command>$ istioctl delete egressrule googleapis -n default
Deleted config: egressrule googleapis</code></pre><p>并在输出中看到删除出口规则。</p><p>删除出口规则后访问网页会产生我们之前遇到的相同错误即_Error fetching product details_, 正如我们所看到的,出口规则是**动态定义**,与许多其他 Istio 配置工件一样 , Istio 运算符可以动态决定它们允许微服务访问哪些域, 他们可以动态启用和禁用外部域的流量,而无需重新部署微服务。</p><h2 id=istio>Istio出口流量控制的问题</h2><h3 id=-istio--tls>由 Istio 发起的 TLS</h3><p>这个故事有一个警告, 在 HTTPS 中,所有 HTTP 详细信息(主机名,路径,标头等)都已加密,因此 Istio 无法知道加密请求的目标域, 那么Istio 可以通过 <a href=https://tools.ietf.org/html/rfc3546#section-3.1>SNI</a><em>Server Name Indication</em>)字段来了解目标域, 但是,此功能尚未在 Istio 中实现, 因此目前Istio无法基于目标域执行 HTTPS 请求的过滤。</p><p>为了允许 Istio 基于域执行出口请求的过滤,微服务必须发出 HTTP 请求, 然后Istio 打开到目标的 HTTPS 连接(执行 TLS 发起), 根据微服务是在 Istio 服务网格内部还是外部运行,微服务的代码必须以不同方式编写或以不同方式配置, 这与<a href=/v1.0/zh/docs/concepts/what-is-istio/#%E8%AE%BE%E8%AE%A1%E7%9B%AE%E6%A0%87>最大化透明度</a>的 Istio 设计目标相矛盾, 有时我们需要妥协&mldr;&mldr;</p><p>下图显示了如何执行外部服务的 HTTPS 流量, 在顶部Istio 服务网格外部的微服务</p><p>发送常规 HTTPS 请求,端到端加密, 在底部Istio 服务网格内的相同微服务必须在 pod 内发送未加密的HTTP请求这些请求被 sidecar Envoy 代理拦截 , sidecar 代理执行 TLS 发起,因此 pod 和外部服务之间的流量被加密。</p><figure style=width:80%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:65.16%><a class=not-for-endnotes href=/v1.0/blog/2018/egress-https/https_from_the_app.svg><img class=element-to-stretch src=/v1.0/blog/2018/egress-https/https_from_the_app.svg alt="HTTPS traffic to external services, from outside vs. from inside an Istio service mesh" title="HTTPS traffic to external services, from outside vs. from inside an Istio service mesh"></a></div><figcaption>HTTPS traffic to external services, from outside vs. from inside an Istio service mesh</figcaption></figure><p>以下是我们如何在<a href=https://raw.githubusercontent.com/istio/istio/release-1.0/samples/bookinfo/src/details/details.rb>Bookinfo details microservice code</a>中使用Ruby <a href=https://docs.ruby-lang.org/en/2.0.0/Net/HTTP.html>net/http模块</a></p><pre><code class=language-ruby>uri = URI.parse(&#39;https://www.googleapis.com/books/v1/volumes?q=isbn:&#39; &#43; isbn)
http = Net::HTTP.new(uri.host, uri.port)
...
unless ENV[&#39;WITH_ISTIO&#39;] === &#39;true&#39; then
http.use_ssl = true
end</code></pre><p>请注意,默认的 HTTPS 端口 <code>443</code> 的取值是 <code>URI.parse</code> 通过对 URI (<code>https://</code>) 的解析得来的, 当在 Istio 服务网格内运行时,微服务必须向端口 &ldquo;443” 发出 HTTP 请求,该端口是外部服务侦听的端口。</p><p>当定义 <code>WITH_ISTIO</code> 环境变量时,请求在没有 SSL普通 HTTP )的情况下执行。</p><p>我们将 <code>WITH_ISTIO</code> 环境变量设置为 <em>&ldquo;true&rdquo;</em> <a href=https://raw.githubusercontent.com/istio/istio/release-1.0/samples/bookinfo/platform/kube/bookinfo-details-v2.yaml>details 的部署配置文件</a>,</p><p><code>container</code>部分:</p><pre><code class=language-yaml>env:
- name: WITH_ISTIO
value: &#34;true&#34;</code></pre><h4 id=istio--tls->Istio 双向 TLS 的关系</h4><p>请注意在这种情况下TLS 的源与 Istio 应用的 <a href=/v1.0/zh/docs/concepts/security/#%E5%8F%8C%E5%90%91-tls-%E8%AE%A4%E8%AF%81>双向 TLS</a> 无关, 无论 Istio 双向 TLS 是否启用,外部服务的 TLS 源都将起作用 , 保证服务网<strong></strong>的服务到服务通信,并为每个服务提供强大的身份认证, 在 <strong>外部服务</strong>的情况下,我们有<strong>单向</strong> TLS这是用于保护 Web 浏览器和 Web 服务器之间通信的相同机制 , TLS 应用于与外部服务的通信,以验证外部服务器的身份并加密流量。</p><h3 id=heading-1>恶意微服务威胁</h3><p>另一个问题是,出口规则不是一个安全方面的功能,它只是开放了到外部服务的通信功能。对基于 HTTP 的协议来说这些规则是建立在域的基础之上的。Istio 不会检查请求的目标 IP 是否与 Host Header 相匹配。这意味着服务网格内的恶意微服务有能力对 Istio 进行欺骗,使之放行目标为恶意 IP 的流量。攻击方式就是在恶意请求中,将 Host Header 的值设置为 Egress 规则允许的域。</p><p>Istio 目前不支持保护出口流量,只能其他地方执行,例如通过防火墙或 Istio 外部的其他代理, 现在,我们正在努力在出口流量上启用混合器安全策略的应用,并防止上述攻击。</p><h3 id=-mixer->没有跟踪,遥测和没有 Mixer 检查</h3><p>请注意,目前不能为出口流量收集跟踪和遥测信, 无法应用 Mixer, 我们正在努力在未来的 Istio 版本中解决这个问题。</p><h2 id=heading-2>未来的工作</h2><p>在我的下一篇博客文章中,我将演示 TCP 流量的 Istio 出口规则,并将显示组合路由规则和出口规则的示例。</p><p>在 Istio我们正在努力使 Istio 出口流量更加安全,特别是在启用出口流量的跟踪,遥测和 Mixer 检查时。</p><h2 id=heading-3>结论</h2><p>在这篇博文中,我演示了 Istio 服务网格中的微服务如何通过 HTTPS 使用外部 Web 服务, 默认情况下Istio 会阻止集群外主机的所有流量, 要启用此类流量,必须为服务网格创建出口规则, 可以通过 HTTPS 访问外部站点,但是微服务必须发出 HTTP 请求,而 Istio 将执行 TLS 发起, 目前,没有为出口流量启用跟踪,遥测和混合器检查, 出口规则目前不是安全功能,因此需要额外的机制来保护出口流量, 我们正在努力为将来版本中的出口流量启用日志记录/遥测和安全策略。</p><p>要了解有关 Istio 出口流量控制的更多信息,请参阅<a href=/v1.0/zh/docs/tasks/traffic-management/egress/>控制出口流量任务</a></p><h2 id=see-also>See also</h2><div class=see-also><div class=container-fluid><div class=row><div class="col-xs-12 col-sm-6 col-xl-4"><p class=link><a href=/v1.0/zh/blog/2018/egress-tcp/>使用外部 TCP 服务</a></p><p class=desc>描述基于 Istio 的 Bookinfo 示例的简单场景。</p></div><div class="col-xs-12 col-sm-6 col-xl-4"><p class=link><a href=/v1.0/zh/docs/tasks/traffic-management/egress/>控制 Egress 流量</a></p><p class=desc>在 Istio 中配置从网格内访问外部服务的流量路由。</p></div><div class="col-xs-12 col-sm-6 col-xl-4"><p class=link><a href=/v1.0/zh/blog/2018/v1alpha3-routing/>Istio v1aplha3 路由 API 介绍</a></p><p class=desc>Istio v1alpha3 路由 API 介绍,动机及其设计原则。</p></div><div class="col-xs-12 col-sm-6 col-xl-4"><p class=link><a href=/v1.0/zh/blog/2018/traffic-mirroring/>用于在生产环境进行测试的 Istio 流量镜像功能</a></p><p class=desc>介绍更安全,低风险的部署和发布到生产。</p></div><div class="col-xs-12 col-sm-6 col-xl-4"><p class=link><a href=/v1.0/zh/blog/2017/0.1-canary/>使用 Istio 进行金丝雀部署</a></p><p class=desc>使用 Istio 创建自动缩放的金丝雀部署。</p></div><div class="col-xs-12 col-sm-6 col-xl-4"><p class=link><a href=/v1.0/zh/docs/tasks/traffic-management/ingress/>控制 Ingress 流量</a></p><p class=desc>介绍在服务网格 Istio 中如何配置外部公开服务。</p></div></div></div></div></main><div class="container-fluid d-print-none"><br><div class=row><div class="col-6 pagenav"><p><a title="描述基于 Istio 的 Bookinfo 示例的简单场景。" href=/v1.0/zh/blog/2018/egress-tcp/><i class="fa fa-long-arrow-alt-left"></i>使用外部 TCP 服务</a></p></div><div class="col-6 pagenav" style=text-align:right></div></div></div><div class="d-none d-print-block" aria-hidden=true><h2>Links</h2><ol id=endnotes></ol></div></div><div class="col-12 col-md-2 d-none d-xl-block d-print-none"><nav class=toc><div class=spacer></div><div id=toc class=directory role=directory><nav id=TableOfContents><ul><li><a href=#bookinfo--web->Bookinfo 示例应用程序使用外部的 Web 服务扩展详细信息</a></li><ul><li><a href=#heading>初始设定</a></li><li><a href=#bookinfo--2>Bookinfo 详细信息版本 2</a></li><li><a href=#google-book->Google Book 网络服务的出口规则</a></li></ul><li><a href=#istio>Istio出口流量控制的问题</a></li><ul><li><a href=#-istio--tls>由 Istio 发起的 TLS</a></li><ul><li><a href=#istio--tls->Istio 双向 TLS 的关系</a></li></ul><li><a href=#heading-1>恶意微服务威胁</a></li><li><a href=#-mixer->没有跟踪,遥测和没有 Mixer 检查</a></li></ul><li><a href=#heading-2>未来的工作</a></li><li><a href=#heading-3>结论</a></li><li><a href=#see-also>See also</a></li></ul></nav></div></nav></div></div></div></div><footer class="d-print-none container-fluid"><div class=row><div class="col-5 col-lg-4" role=navigation><div class=container-fluid><div class=row><div class=icon><span>discuss</span>
<a title="Join the Istio discussion board to participate in discussions and get help troubleshooting problems" href=https://discuss.istio.io aria-label="Istio discussion board"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M225.9 32C103.3 32 0 130.5.0 252.1.0 256 .1 480 .1 480l225.8-.2c122.7.0 222.1-102.3 222.1-223.9S348.6 32 225.9 32zM224 384c-19.4.0-37.9-4.3-54.4-12.1L88.5 392l22.9-75c-9.8-18.1-15.4-38.9-15.4-61 0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128z" /></svg></a></div><div class=icon><span>slack</span>
<a title="在 Slack 上与 Istio 社区交互讨论开发问题(仅限邀请)" href=https://istio.slack.com aria-label=slack><svg viewBox="0 0 31.444 31.443"><path d="M31.202 16.369c-.62-1.388-2.249-2.011-3.637-1.391l-1.325.594-3.396-7.591 1.325-.592c1.388-.622 2.01-2.25 1.389-3.637-.62-1.389-2.248-2.012-3.637-1.39l-1.324.593-.593-1.326c-.621-1.388-2.249-2.009-3.637-1.388-1.388.62-2.009 2.247-1.389 3.637l.593 1.325L7.98 8.598 7.388 7.273c-.621-1.39-2.249-2.009-3.637-1.39C2.363 6.504 1.742 8.132 2.362 9.52l.592 1.324L1.63 11.438c-1.388.621-2.01 2.247-1.389 3.636.62 1.388 2.249 2.01 3.637 1.39l1.325-.594 3.394 7.592-1.325.592c-1.388.621-2.009 2.25-1.389 3.637.621 1.389 2.249 2.011 3.637 1.391l1.324-.593.593 1.325c.621 1.389 2.249 2.01 3.637 1.389 1.387-.62 2.009-2.248 1.388-3.636l-.591-1.326 7.591-3.394.592 1.321c.621 1.391 2.248 2.013 3.637 1.392 1.388-.619 2.01-2.248 1.389-3.637l-.592-1.324 1.323-.594C31.201 19.384 31.823 17.757 31.202 16.369zM13.623 21.215l-3.395-7.593 7.591-3.394 3.395 7.591L13.623 21.215z"/></svg></a></div><div class=icon><span>twitter</span>
<a title="关注我们的 Twitter 来获最新信息" href=https://twitter.com/IstioMesh aria-label=Twitter><svg viewBox="0 0 310 310"><path d="M302.973 57.388c-4.87 2.16-9.877 3.983-14.993 5.463 6.057-6.85 10.675-14.91 13.494-23.73.632-1.977-.023-4.141-1.648-5.434-1.623-1.294-3.878-1.449-5.665-.39-10.865 6.444-22.587 11.075-34.878 13.783-12.381-12.098-29.197-18.983-46.581-18.983-36.695.0-66.549 29.853-66.549 66.547.0 2.89.183 5.764.545 8.598C101.163 99.244 58.83 76.863 29.76 41.204c-1.036-1.271-2.632-1.956-4.266-1.825-1.635.128-3.104 1.05-3.93 2.467-5.896 10.117-9.013 21.688-9.013 33.461.0 16.035 5.725 31.249 15.838 43.137-3.075-1.065-6.059-2.396-8.907-3.977-1.529-.851-3.395-.838-4.914.033-1.52.871-2.473 2.473-2.513 4.224-.007.295-.007.59-.007.889.0 23.935 12.882 45.484 32.577 57.229-1.692-.169-3.383-.414-5.063-.735-1.732-.331-3.513.276-4.681 1.597-1.17 1.32-1.557 3.16-1.018 4.84 7.29 22.76 26.059 39.501 48.749 44.605-18.819 11.787-40.34 17.961-62.932 17.961-4.714.0-9.455-.277-14.095-.826-2.305-.274-4.509 1.087-5.294 3.279-.785 2.193.047 4.638 2.008 5.895 29.023 18.609 62.582 28.445 97.047 28.445 67.754.0 110.139-31.95 133.764-58.753 29.46-33.421 46.356-77.658 46.356-121.367.0-1.826-.028-3.67-.084-5.508 11.623-8.757 21.63-19.355 29.773-31.536 1.237-1.85 1.103-4.295-.33-5.998C307.394 57.037 305.009 56.486 302.973 57.388z"/></svg></a></div><div class=icon><span>stack overflow</span>
<a title="Stack Overflow 中列举了针对实际问题以及部署、配置和使用 Istio 的各项回答" href=https://stackoverflow.com/questions/tagged/istio aria-label="Stack Overflow"><svg viewBox="0 0 120 120"><polygon points="84.4,93.8 84.4,70.6 92.1,70.6 92.1,101.5 22.6,101.5 22.6,70.6 30.3,70.6 30.3,93.8"/><path d="M38.8 68.4l37.8 7.9 1.6-7.6-37.8-7.9L38.8 68.4zM43.8 50.4l35 16.3 3.2-7-35-16.4L43.8 50.4zM53.5 33.2l29.7 24.7 4.9-5.9L58.4 27.3 53.5 33.2zM72.7 14.9l-6.2 4.6 23 31 6.2-4.6-23-31zM38 86h38.6v-7.7H38V86z"/></svg></a></div></div><div class="tag row d-none d-lg-flex">对于用户</div></div></div><div class="col-7 col-lg-4"><p class="text-center copyright" role=contentinfo>Istio
Archive
1.0<br>&copy; 2019 Istio Authors, <a href=https://policies.google.com/privacy>Privacy Policy</a><br>Archived on March 19, 2019</p></div><div class="col-6 col-lg-4 d-none d-lg-flex" role=navigation><div class=container-fluid><div class="row justify-content-end"><div class=icon><span>github</span>
<a title="Istio 的代码在 GitHub 上开发" href=https://github.com/istio/community aria-label=GitHub><svg viewBox="0 0 478.165 478.165"><path d="M349.22 55.768c6.136 14.046 10.241 37.556 4.224 54.69 24.426 20.999 33.073 71.904 21.079 113.704 35.006 2.73 76.666-1.235 103.642 9.484-25.183-3.248-59.651-9.563-91.987-7.431-6.136.458-15.361-.239-14.903 8.408 37.735 3.008 75.092 6.117 105.894 15.779-30.702-4.981-67.74-12.552-105.894-13.668-15.54 30.921-47.239 46.262-90.991 49.49 4.682 10.261 13.847 14.066 15.879 30.702 3.267 24.406-4.881 60.328 3.208 76.686 4.064 7.89 10.579 8.009 14.863 14.604-10.699 12.871-37.257-1.395-40.186-14.604-5.14-22.852 7.89-58.256-6.415-73.737.996 24.865-5.718 59.85.996 82.145 2.789 8.806 10.659 12.113 8.647 20.063-49.809 5.08-28.989-64.373-37.177-105.356-7.471.697-4.204 11.197-4.224 15.76-.199 40.106 8.189 94.836-34.846 89.556-1.315-8.348 5.838-11.217 8.467-19.007 7.91-22.434-1.454-56.045 2.112-83.161-16.417 12.512 1.793 55.666-8.428 77.961-5.838 12.671-24.785 18.27-39.19 12.651 1.873-9.464 11.695-7.989 15.879-16.875 5.818-12.452.02-30.244 2.092-48.494-30.423 6.097-53.993-.877-65.608-20.023-5.12-8.507-6.356-18.708-12.632-26.219-6.117-7.551-16.098-8.507-19.087-18.808 37.755-9.185 39.17 38.771 73.06 39.807 10.44.418 15.799-2.909 25.402-5.16 2.749-12.113 8.428-21.039 16.875-27.494-42.078-5.658-76.865-18.788-93.023-50.466-38.293 1.893-73.339 7.013-105.894 14.843 29.547-10.679 65.807-14.604 104.778-15.819-2.351-13.807-22.434-10.022-34.866-9.543C47.677 227.17 18.449 230.138.0 233.645c26.817-9.543 64.233-8.348 100.454-8.428-11.038-34.767-7.232-90.014 17.015-110.615-6.854-17.254-4.722-45.346 4.184-58.834 27.036 1.175 43.374 12.891 60.388 24.247 21.019-6.017 43.035-9.045 71.904-7.451 12.133.677 24.705 6.097 33.731 5.32 8.906-.877 18.728-10.898 27.534-14.843C326.507 58.099 336.17 56.206 349.22 55.768z"/></svg></a></div><div class=icon><span>drive</span>
<a title="如果您想深入了解 Istio 的技术细节,请查看我们日益完善的设计文档" href=https://groups.google.com/forum/#!forum/istio-team-drive-access aria-label="team drive"><svg viewBox="0 0 207.027 207.027"><path d="M69.866 15.557.0 138.919l28.732 52.552 143.288-.029 35.008-59.588L136.39 15.735 69.866 15.557zM17.166 139.046 74.268 38.205 91.21 67.783 33.24 168.447 17.166 139.046zM99.841 82.851l23.805 41.558-47.732-.006L99.841 82.851zM163.434 176.443l-117.332.024 21.53-37.065 64.606.008.067.119 52.865-.085L163.434 176.443zM140.932 124.411 90.157 35.767l-2.966-5.178 40.751.121 57.003 93.706L140.932 124.411z"/></svg></a></div><div class=icon><span>working groups</span>
<a title="如果您想为 Istio 项目做出贡献,请考虑加入我们的工作组" href=https://github.com/istio/community/blob/master/WORKING-GROUPS.md aria-label="working groups"><svg viewBox="0 -45 439.833 439.833"><polygon points="246.048,195.833 299.966,235.085 319.497,227.296 276.278,195.833"/><polygon points="193.786,195.833 163.556,195.833 120.33,227.3 139.862,235.089"/><path d="M219.927 11.558c-23.854.0-37.057 12.362-36.814 36.182.348 32.623 14.211 52.414 36.814 52.068.0.0 36.802 1.492 36.802-52.068C256.729 23.918 244.294 11.558 219.927 11.558z"/><path d="M285.017 124.567l-36.77-14.659-8.608-7.256c-2.274-1.922-5.636-1.78-7.741.317l-11.973 11.904-12.008-11.907c-2.109-2.094-5.465-2.229-7.736-.313l-8.611 7.256-36.77 14.661c-11.842 4.715-11.83 46.647-12.848 50.497h155.93C296.866 171.228 296.862 129.28 285.017 124.567z"/><path d="M77.976 228.568s36.801 1.492 36.801-52.068c0-23.82-12.434-36.182-36.801-36.182-23.854.0-37.057 12.362-36.814 36.182C41.509 209.124 55.372 228.915 77.976 228.568z"/><path d="M143.065 253.329l-36.77-14.658-8.609-7.256c-2.275-1.923-5.635-1.781-7.742.315l-11.971 11.904-12.008-11.908c-2.109-2.094-5.465-2.229-7.736-.312l-8.611 7.256-36.77 14.66C1.006 258.045 1.018 299.977.0 303.827h155.93C154.915 299.988 154.911 258.042 143.065 253.329z"/><path d="M361.878 228.568s36.801 1.492 36.801-52.068c0-23.82-12.434-36.182-36.801-36.182-23.854.0-37.057 12.362-36.812 36.182C325.411 209.124 339.274 228.915 361.878 228.568z"/><path d="M426.968 253.329l-36.77-14.658-8.609-7.256c-2.273-1.923-5.635-1.781-7.742.315l-11.971 11.904-12.008-11.908c-2.109-2.094-5.465-2.229-7.736-.312l-8.61 7.256-36.771 14.66c-11.842 4.715-11.83 46.646-12.848 50.497h155.93C438.817 299.988 438.812 258.042 426.968 253.329z"/></svg></a></div></div><div class="tag row justify-content-end text-right">对于开发者</div></div></div></div></footer><div class="d-xl-none d-print-none"><button id=scroll-to-top aria-hidden=true onclick=scrollToTop() title="Back to top"><i class="fa fa-lg fa-arrow-up"></i></button></div><script src=https://code.jquery.com/jquery-3.2.1.slim.min.js integrity=sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN crossorigin=anonymous></script><script src=https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js integrity=sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl crossorigin=anonymous></script><script src=https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.7.1/clipboard.min.js></script><script src="https://www.google.com/cse/brand?form=search_form"></script><script src=/v1.0/js/all.min.js data-manual></script></body></html>