mirror of https://github.com/istio/istio.io.git
59 lines
36 KiB
HTML
59 lines
36 KiB
HTML
<!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> 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 <(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 <<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>糟糕…页面显示 <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>那可能出了什么问题? 啊……答案是我忘了启用从网格内部到外部服务的流量,在本例中是 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 <<EOF | istioctl create -f -
|
||
apiVersion: config.istio.io/v1alpha2
|
||
kind: EgressRule
|
||
metadata:
|
||
name: googleapis
|
||
namespace: default
|
||
spec:
|
||
destination:
|
||
service: "*.googleapis.com"
|
||
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 设计目标相矛盾, 有时我们需要妥协……</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('https://www.googleapis.com/books/v1/volumes?q=isbn:' + isbn)
|
||
http = Net::HTTP.new(uri.host, uri.port)
|
||
...
|
||
unless ENV['WITH_ISTIO'] === 'true' then
|
||
http.use_ssl = true
|
||
end</code></pre><p>请注意,默认的 HTTPS 端口 <code>443</code> 的取值是 <code>URI.parse</code> 通过对 URI (<code>https://</code>) 的解析得来的, 当在 Istio 服务网格内运行时,微服务必须向端口 “443” 发出 HTTP 请求,该端口是外部服务侦听的端口。</p><p>当定义 <code>WITH_ISTIO</code> 环境变量时,请求在没有 SSL(普通 HTTP )的情况下执行。</p><p>我们将 <code>WITH_ISTIO</code> 环境变量设置为 <em>“true”</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: "true"</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>© 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> |