istio.io/archive/v1.5/zh/blog/2018/egress-tcp/index.html

108 lines
50 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="使用外部 TCP 服务"><meta name=description content="描述基于 Istio 的 Bookinfo 示例的简单场景。"><meta name=author content="Vadim Eisenberg"><meta name=keywords content="microservices,services,mesh,traffic-management,egress,tcp"><meta property="og:title" content="使用外部 TCP 服务"><meta property="og:type" content="website"><meta property="og:description" content="描述基于 Istio 的 Bookinfo 示例的简单场景。"><meta property="og:url" content="/v1.5/zh/blog/2018/egress-tcp/"><meta property="og:image" content="/v1.5/img/istio-whitelogo-bluebackground-framed.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.5 / 使用外部 TCP 服务</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><link rel=alternate type=application/rss+xml title="Istio Blog" href=/v1.5/blog/feed.xml><link rel=alternate type=application/rss+xml title="Istio News" href=/v1.5/news/feed.xml><link rel=alternate type=application/rss+xml title="Istio Blog and News" href=/v1.5/feed.xml><link rel="shortcut icon" href=/v1.5/favicons/favicon.ico><link rel=apple-touch-icon href=/v1.5/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/v1.5/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/v1.5/favicons/favicon-32x32.png sizes=32x32><link rel=icon type=image/png href=/v1.5/favicons/android-36x36.png sizes=36x36><link rel=icon type=image/png href=/v1.5/favicons/android-48x48.png sizes=48x48><link rel=icon type=image/png href=/v1.5/favicons/android-72x72.png sizes=72x72><link rel=icon type=image/png href=/v1.5/favicons/android-96x96.png sizes=96xW96><link rel=icon type=image/png href=/v1.5/favicons/android-144x144.png sizes=144x144><link rel=icon type=image/png href=/v1.5/favicons/android-192x192.png sizes=192x192><link rel=manifest href=/v1.5/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=Work+Sans:400|Chivo:400|Work+Sans:500,300,600,300italic,400italic,500italic,600italic|Chivo:500,300,600,300italic,400italic,500italic,600italic"><link rel=stylesheet href=/v1.5/css/all.css><script src=/v1.5/js/themes_init.min.js></script></head><body class="language-unknown archive-site"><script>const branchName="release-1.5";const docTitle="使用外部 TCP 服务";const iconFile="\/v1.5/img/icons.svg";const buttonCopy='复制到剪切板';const buttonPrint='打印';const buttonDownload='下载';</script><script src="https://www.google.com/cse/brand?form=search-form" defer></script><script src=/v1.5/js/all.min.js data-manual defer></script><header><nav><a id=brand href=/v1.5/zh/><span class=logo><svg viewBox="0 0 300 300"><circle cx="150" cy="150" r="146" 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=name>Istioldie 1.5</span></a><div id=hamburger><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#hamburger"/></svg></div><div id=header-links><a title="了解如何部署、使用和运维 Istio。" href=/v1.5/zh/docs/>文档</a>
<a class=current title="关于使用 Istio 的博客文章。" href=/v1.5/zh/blog/2020/>博客<i class=dot data-prefix=/blog></i></a>
<a title="关于 Istio 项目的最新报道。" href=/v1.5/zh/news/>新闻<i class=dot data-prefix=/news></i></a>
<a title="关于 Istio 的常见问题。" href=/v1.5/zh/faq/>FAQ</a>
<a title="关于 Istio 项目的说明。" href=/v1.5/zh/about/>关于</a><div class=menu><button id=gearDropdownButton class=menu-trigger title=选项和设置 aria-label="Options and Settings" aria-controls=gearDropdownContent><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#gear"/></svg></button><div id=gearDropdownContent class=menu-content aria-labelledby=gearDropdownButton role=menu><a tabindex=-1 role=menuitem lang=en id=switch-lang-en>English</a>
<a tabindex=-1 role=menuitem lang=zh id=switch-lang-zh class=active>中文</a><div role=separator></div><a tabindex=-1 role=menuitem class=active id=light-theme-item>亮主题</a>
<a tabindex=-1 role=menuitem id=dark-theme-item>暗主题</a><div role=separator></div><a tabindex=-1 role=menuitem id=syntax-coloring-item>代码高亮</a><div role=separator></div><h6>本站的其它版本</h6><a tabindex=-1 role=menuitem onclick="navigateToUrlOrRoot('https://istio.io/blog\/2018\/egress-tcp\/');return false;">当前版本</a>
<a tabindex=-1 role=menuitem onclick="navigateToUrlOrRoot('https://preliminary.istio.io/blog\/2018\/egress-tcp\/');return false;">下个版本</a>
<a tabindex=-1 role=menuitem href=https://istio.io/archive>旧版本</a></div></div><button id=search-show title="搜索 istio.io" aria-label=搜索><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#magnifier"/></svg></button></div><form id=search-form name=cse role=search><input type=hidden name=cx value=002184991200833970123: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.5/search>
<input id=search-textbox class=form-control name=q type=search aria-label="搜索 istio.io">
<button id=search-close title=取消搜索 type=reset aria-label=取消搜索><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#cancel-x"/></svg></button></form></nav></header><div class=banner-container></div><main class=primary><div id=sidebar-container class="sidebar-container sidebar-offcanvas"><nav id=sidebar aria-label="Section Navigation"><div class=directory><div class=card><button class="header dynamic" id=card0 title="2020 年的博客文章。" aria-controls=card0-body><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#blog"/></svg>2020 年的博客文章</button><div class=body aria-labelledby=card0 role=region id=card0-body><ul role=tree aria-expanded=true class=leaf-section aria-labelledby=card0><li role=none><a role=treeitem title="Istio 的扩展中使用 WASM 的前景。 (2020年3月5日)" href=/v1.5/zh/blog/2020/wasm-announce/>重新定义代理的扩展性Envoy 和 Istio 引入 WebAssembly</a></li><li role=none><a role=treeitem title="Istio 在 2020 年的愿景声明及路线图。 (2020年3月3日)" href=/v1.5/zh/blog/2020/tradewinds-2020/>Istio 2020——为了商用</a></li><li role=none><a role=treeitem title="一种更安全的秘密管理方式。 (2020年2月20日)" href=/v1.5/zh/blog/2020/istio-agent/>移除跨 pod Unix domain socket</a></li><li role=none><a role=treeitem title="为 Istio deploymentcluster提供自动化 Istio 配置,并让其像单个网格一样工作。 (2020年1月5日)" href=/v1.5/zh/blog/2020/multi-cluster-mesh-automation/>使用 Admiral 管理 Istio 多集群的配置和服务发现</a></li></ul></div></div><div class=card><button class="header dynamic" id=card1 title="2019 年的博客文章。" aria-controls=card1-body><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#blog"/></svg>2019 年的博客文章</button><div class=body aria-labelledby=card1 role=region id=card1-body><ul role=tree aria-expanded=true class=leaf-section aria-labelledby=card1><li role=none><a role=treeitem title="一种更安全管理 Istio webhook 的方法。 (2019年11月14日)" href=/v1.5/zh/blog/2019/webhook/>安全管理 Webhook</a></li><li role=none><a role=treeitem title="关于 Istio 基于 operator 的安装和控制平面管理特性的介绍。 (2019年11月14日)" href=/v1.5/zh/blog/2019/introducing-istio-operator/>Istio Operator 简介</a></li><li role=none><a role=treeitem title="Istio v1beta1 授权策略的设计原则、基本概述及迁移操作。 (2019年11月14日)" href=/v1.5/zh/blog/2019/v1beta1-authorization-policy/>Istio v1beta1 授权策略概述</a></li><li role=none><a role=treeitem title="通过分析 Istio 配置来发现潜在问题和一般问题。 (2019年11月14日)" href=/v1.5/zh/blog/2019/introducing-istioctl-analyze/>istioctl analyze 介绍</a></li><li role=none><a role=treeitem title="在 Istio 中配置和管理 DNS 证书。 (2019年11月14日)" href=/v1.5/zh/blog/2019/dns-cert/>DNS 证书管理</a></li><li role=none><a role=treeitem title="正式启用访问 Istio 资源。 (2019年11月14日)" href=/v1.5/zh/blog/2019/announcing-istio-client-go/>Istio client-go 发布公告</a></li><li role=none><a role=treeitem title="把 Istio 入口网关配置为外部服务的代理。 (2019年10月15日)" href=/v1.5/zh/blog/2019/proxy/>把 Istio 作为外部服务的代理</a></li><li role=none><a role=treeitem title="将需要隔离的环境部署到单独的网格中,并通过网格联邦启用网格间通信。 (2019年10月2日)" href=/v1.5/zh/blog/2019/isolated-clusters/>用于隔离和边界保护的多网格部署</a></li><li role=none><a role=treeitem title="如何使用 Istio 去监控被阻止的和透传的外部服务流量。 (2019年9月28日)" href=/v1.5/zh/blog/2019/monitoring-external-service-traffic/>监控被阻止的和透传的外部服务流量</a></li><li role=none><a role=treeitem title="本文演示 Mixer 进程外适配器实现 Knative scale-from-zero 逻辑的具体过程。 (2019年9月18日)" href=/v1.5/zh/blog/2019/knative-activator-adapter/>适用于 Knative 的 Mixer 适配器</a></li><li role=none><a role=treeitem title="使用 Istio 实现零代码改动保护多云 Kubernetes 应用。 (2019年9月18日)" href=/v1.5/zh/blog/2019/app-identity-and-access-adapter/>APP 身份和访问适配器</a></li><li role=none><a role=treeitem title="利用 Kubernetes 可信任的 JWT 来更安全地为工作负载实例颁发证书。 (2019年9月10日)" href=/v1.5/zh/blog/2019/trustworthy-jwt-sds/>Istio 1.3 Secret 服务发现的更改</a></li><li role=none><a role=treeitem title="Istio API 的设计原则和这些 API 是如何演变的。 (2019年8月5日)" href=/v1.5/zh/blog/2019/evolving-istios-apis/>Istio API 的演变</a></li><li role=none><a role=treeitem title="管控出口流量的备选方案比较,包括性能因素。 (2019年7月22日)" href=/v1.5/zh/blog/2019/egress-traffic-control-in-istio-part-3/>Istio 中安全管控出口流量,第三部分</a></li><li role=none><a role=treeitem title="使用 Istio 的出口流量管控来阻止相关出口流量攻击。 (2019年7月10日)" href=/v1.5/zh/blog/2019/egress-traffic-control-in-istio-part-2/>Istio 中的安全管控出口流量,第二部分</a></li><li role=none><a role=treeitem title="评估 Istio 数据平面性能的工具和指南。 (2019年7月9日)" href=/v1.5/zh/blog/2019/performance-best-practices/>最佳实践Service Mesh 基准性能测试</a></li><li role=none><a role=treeitem title="了解如何延长 Istio 自签名根证书的有效期。 (2019年6月7日)" href=/v1.5/zh/blog/2019/root-transition/>延长 Istio 自签名根证书的有效期</a></li><li role=none><a role=treeitem title="涉及出口流量攻击和出口流量管控要求。 (2019年5月22日)" href=/v1.5/zh/blog/2019/egress-traffic-control-in-istio-part-1/>Istio 中的安全管控出口流量,第一部分</a></li><li role=none><a role=treeitem title="Istio 1.1 性能概览。 (2019年3月19日)" href=/v1.5/zh/blog/2019/istio1.1_perf/>为性能而设计的 Istio 1.1</a></li><li role=none><a role=treeitem title="在多集群服务网格环境中配置 Istio 的路由规则。 (2019年2月7日)" href=/v1.5/zh/blog/2019/multicluster-version-routing/>多集群服务网格中的分版本路由</a></li><li role=none><a role=treeitem title="宣布新的博客策略。 (2019年2月5日)" href=/v1.5/zh/blog/2019/sail-the-blog/>博客策略更新!</a></li><li role=none><a role=treeitem title="揭秘 Istio 是如何将其数据平面组件添加到现有 deployment。 (2019年1月31日)" href=/v1.5/zh/blog/2019/data-plane-setup/>揭开 Istio Sidecar 注入模型的神秘面纱</a></li><li role=none><a role=treeitem title="评估加入 Egress gateway 对性能造成的影响。 (2019年1月31日)" href=/v1.5/zh/blog/2019/egress-performance/>Egress gateway 性能测试</a></li><li role=none><a role=treeitem title="使用 AppSwitch 解决应用程序启动顺序和启动延迟。 (2019年1月14日)" href=/v1.5/zh/blog/2019/appswitch/>使用 AppSwitch 进行 Sidestepping 依赖性排序</a></li><li role=none><a role=treeitem title="Istio 有了一个新的论坛。 (2019年1月10日)" href=/v1.5/zh/blog/2019/announcing-discuss.istio.io/>Istio 论坛成立</a></li><li role=none><a role=treeitem title="如何使用 cert-manager 手工部署一个自定义 Ingress 网关。 (2019年1月10日)" href=/v1.5/zh/blog/2019/custom-ingress-gateway/>使用 Cert-Manager 部署一个自定义 Ingress 网关</a></li></ul></div></div><div class=card><button class="header dynamic" id=card2 title="2018 年的博客文章。" aria-controls=card2-body><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#blog"/></svg>2018 年的博客文章</button><div class="body default" aria-labelledby=card2 role=region id=card2-body><ul role=tree aria-expanded=true class=leaf-section aria-labelledby=card2><li role=none><a role=treeitem title="如何在不部署 Sidecar 代理的情况下使用 Istio 进行流量管理。 (2018年11月21日)" href=/v1.5/zh/blog/2018/incremental-traffic-management/>增量式应用 Istio 第一部分,流量管理</a></li><li role=none><a role=treeitem title="描述了一个基于 Istio 的 Bookinfo 示例的简单场景。 (2018年11月16日)" href=/v1.5/zh/blog/2018/egress-mongo/>使用外部 MongoDB 服务</a></li><li role=none><a role=treeitem title="Istio 在 Twitch 举办了为期一天的直播庆祝 1.0 的发布。 (2018年8月3日)" href=/v1.5/zh/blog/2018/istio-twitch-stream/>Istio 在 Twitch 上全天直播</a></li><li role=none><a role=treeitem title="惠普如何在 Istio 上构建其下一代鞋类个性化平台。 (2018年7月31日)" href=/v1.5/zh/blog/2018/hp/>Istio 是惠普 FitStation 平台的改变者</a></li><li role=none><a role=treeitem title="使用 AppSwitch 自动接入应用并降低延迟。 (2018年7月30日)" href=/v1.5/zh/blog/2018/delayering-istio/>使用 AppSwitch 精简 Istio 层次</a></li><li role=none><a role=treeitem title="描述 Istio 的授权功能以及如何在各种用例中使用它。 (2018年7月20日)" href=/v1.5/zh/blog/2018/istio-authorization/>基于 Istio 授权的 Micro-Segmentation</a></li><li role=none><a role=treeitem title="如何通过 Stackdriver 将 Istio 访问日志导出到 BigQuery、GCS、Pub/Sub 等不同的接收器。 (2018年7月9日)" href=/v1.5/zh/blog/2018/export-logs-through-stackdriver/>通过 Stackdriver 将日志导出到 BigQuery、GCS、Pub/Sub</a></li><li role=none><a role=treeitem title="描述如何配置 Istio 进行 HTTP Egress 流量监控和访问策略。 (2018年6月22日)" href=/v1.5/zh/blog/2018/egress-monitoring-access-control/>HTTP Egress 流量监控和访问策略</a></li><li role=none><a role=treeitem title="Istio v1alpha3 路由 API 介绍, 动机及其设计原则。 (2018年4月25日)" href=/v1.5/zh/blog/2018/v1alpha3-routing/>Istio v1aplha3 路由 API 介绍</a></li><li role=none><a role=treeitem title="描述如何在 AWS 上使用网络负载均衡器配置 Istio Ingress。 (2018年4月20日)" href=/v1.5/zh/blog/2018/aws-nlb/>使用 AWS NLB 配置 Istio Ingress</a></li><li role=none><a role=treeitem title="使用 Kubernetes 命名空间和 RBAC 为 Istio 构建软性多租户环境。 (2018年4月19日)" href=/v1.5/zh/blog/2018/soft-multitenancy/>Istio 的软性多租户支持</a></li><li role=none><a role=treeitem title="介绍更安全,低风险的部署和发布到生产。 (2018年2月8日)" href=/v1.5/zh/blog/2018/traffic-mirroring/>用于在生产环境进行测试的 Istio 流量镜像功能</a></li><li role=none><span role=treeitem class=current title="描述基于 Istio 的 Bookinfo 示例的简单场景。 (2018年2月6日)">使用外部 TCP 服务</span></li><li role=none><a role=treeitem title="描述基于 Istio Bookinfo 示例的简单场景。 (2018年1月31日)" href=/v1.5/zh/blog/2018/egress-https/>使用外部 Web 服务</a></li></ul></div></div><div class=card><button class="header dynamic" id=card3 title="2017 年的博客文章。" aria-controls=card3-body><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#blog"/></svg>2017 年的博客文章</button><div class=body aria-labelledby=card3 role=region id=card3-body><ul role=tree aria-expanded=true class=leaf-section aria-labelledby=card3><li role=none><a role=treeitem title="提高可用,降低延迟。 (2017年12月7日)" href=/v1.5/zh/blog/2017/mixer-spof-myth/>Mixer 和 SPOF 神话</a></li><li role=none><a role=treeitem title="概要说明 Mixer 的插件架构。 (2017年11月3日)" href=/v1.5/zh/blog/2017/adapter-model/>Mixer 适配器模型</a></li><li role=none><a role=treeitem title="Istio 的策略如何关联 Kubernetes 的网络策略 。 (2017年8月10日)" href=/v1.5/zh/blog/2017/0.1-using-network-policy/>Istio 使用网络策略</a></li><li role=none><a role=treeitem title="使用 Istio 创建自动缩放的金丝雀部署。 (2017年6月14日)" href=/v1.5/zh/blog/2017/0.1-canary/>使用 Istio 进行金丝雀部署</a></li><li role=none><a role=treeitem title="Istio Auth 0.1 公告。 (2017年5月25日)" href=/v1.5/zh/blog/2017/0.1-auth/>使用 Istio 增强端到端安全</a></li></ul></div></div></div></nav></div><div class=article-container><button tabindex=-1 id=sidebar-toggler title=折叠导航栏><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#pull"/></svg></button><nav aria-label=Breadcrumb><ol><li><a href=/v1.5/zh/ title=用于连接、保护、控制和观测服务。>Istio</a></li><li><a href=/v1.5/zh/blog/ title="关于使用 Istio 的博客文章。">博客</a></li><li><a href=/v1.5/zh/blog/2018/ title="2018 年的博客文章。">2018 年的博客文章</a></li><li>使用外部 TCP 服务</li></ol></nav><article aria-labelledby=title><div class=title-area><div style=width:100%><h1 id=title>使用外部 TCP 服务</h1><p class=subtitle>网格外部 TCP 流量的服务入口</p><p class=byline><span>作者</span>
<span class=attribution>Vadim Eisenberg</span><span> | </span><span><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#calendar"/></svg><span>&nbsp;</span>2018年2月6日<span>&nbsp;</span>(更新于 2019年2月10日</span><span> | </span><span title="882 字"><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#clock"/></svg><span>&nbsp;</span>阅读大约需要 5 分钟</span></p></div></div><nav class=toc-inlined aria-label="Table of Contents"><div><hr><ol><li role=none aria-label="Bookinfo 示例应用程序与外部评级数据库"><a href=#Bookinfo-sample-application-with-external-ratings-database>Bookinfo 示例应用程序与外部评级数据库</a><ol><li role=none aria-label=为评级数据设置数据库><a href=#setting-up-the-database-for-ratings-data>为评级数据设置数据库</a><li role=none aria-label="Bookinfo 应用程序的初始设置"><a href=#initial-setting-of-Bookinfo-application>Bookinfo 应用程序的初始设置</a><li role=none aria-label="将数据库用于 Bookinfo 应用程序中的评级数据"><a href=#use-the-database-for-ratings-data-in-Bookinfo-application>将数据库用于 Bookinfo 应用程序中的评级数据</a><li role=none aria-label=访问网页><a href=#access-the-webpage>访问网页</a><li role=none aria-label="外部 MySQL 实例的网格外部服务入口"><a href=#mesh-external-service-entry-for-an-external-MySQL-instance>外部 MySQL 实例的网格外部服务入口</a></ol></li><li role=none aria-label="出口 TCP 流量控制的动机"><a href=#motivation-for-egress-TCP-traffic-control>出口 TCP 流量控制的动机</a><li role=none aria-label="TCP 流量的服务入口"><a href=#service-entries-for-tcp-traffic>TCP 流量的服务入口</a><li role=none aria-label=与网格扩展的关系><a href=#relation-to-virtual-machines-support>与网格扩展的关系</a><li role=none aria-label=清理><a href=#cleanup>清理</a><li role=none aria-label=结论><a href=#conclusion>结论</a><li role=none aria-label=相关内容><a href=#see-also>相关内容</a></li></ol><hr></div></nav><div><aside class="callout warning"><div class=type><svg class="large-icon"><use xlink:href="/v1.5/img/icons.svg#callout-warning"/></svg></div><div class=content>该博客文章是在 Istio 1 的版本下编写的,因此其中某些内容现在可能已过时。</div></aside></div><div><aside class="callout tip"><div class=type><svg class="large-icon"><use xlink:href="/v1.5/img/icons.svg#callout-tip"/></svg></div><div class=content>这篇博客在 2018 年 7 月 23 日有修改,修改的内容使用了新的 <a href=/v1.5/zh/blog/2018/v1alpha3-routing/>v1alpha3 流量管理 API</a>。如果你想使用旧版本 API请参考<a href=https://archive.istio.io/v0.7/blog/2018/egress-tcp.html>这个文档</a></div></aside></div><p>在我之前的博客文章<a href=/v1.5/zh/blog/2018/egress-https/>使用外部 Web 服务</a>中,我描述了如何通过 HTTPS 在网格 Istio 应用程序中使用外部服务,在这篇文章中,我演示了通过 TCP 使用外部服务。你会用到 <a href=/v1.5/zh/docs/examples/bookinfo/>Istio Bookinfo 示例应用程序</a>,这是将书籍评级数据保存在 MySQL 数据库中的版本。你会在集群外部署此数据库并配置 <em>ratings</em> 服务以使用它,你还会定义<a href=/v1.5/zh/docs/reference/config/networking/service-entry/>服务 Entry</a> 以允许网格内应用程序访问外部数据库。</p><h2 id=Bookinfo-sample-application-with-external-ratings-database>Bookinfo 示例应用程序与外部评级数据库</h2><p>首先,在 Kubernetes 集群之外设置了一个 MySQL 数据库实例来保存 Bookinfo 评级数据,然后修改 <a href=/v1.5/zh/docs/examples/bookinfo/>Bookinfo 示例应用程序</a>以使用这个数据库。</p><h3 id=setting-up-the-database-for-ratings-data>为评级数据设置数据库</h3><p>为此,你设置了 <a href=https://www.mysql.com>MySQL</a> 的实例,你可以使用任何 MySQL 实例; 我使用 <a href=https://www.ibm.com/cloud/compose/mysql>Compose for MySQL</a>,我使用 <code>mysqlsh</code><a href=https://dev.mysql.com/doc/mysql-shell/en/>MySQL Shell</a>)作为 MySQL 客户端来提供评级数据。</p><ol><li><p>设置 <code>MYSQL_DB_HOST</code><code>MYSQL_DB_PORT</code> 环境变量。</p><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ export MYSQL_DB_HOST=&lt;你的 MySQL host&gt;
$ export MYSQL_DB_PORT=&lt;你的 MySQL port&gt;
</code></pre><p>如果你使用的是本地数据库,使用的是默认 MYSQL port<code>host</code><code>port</code> 分别是 <code>localhost</code><code>3306</code></p></li><li><p>初始化数据库时,如果出现提示,执行下面的命令输入密码。这个命令通过 <code>admin</code> 数据库用户凭证来执行。这个 <code>admin</code> 用户是通过 <a href=https://www.ibm.com/cloud/compose/mysql>Compose for Mysql</a> 创建数据库时默认存在的。</p><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ curl -s https://raw.githubusercontent.com/istio/istio/release-1.5/samples/bookinfo/src/mysql/mysqldb-init.sql | mysqlsh --sql --ssl-mode=REQUIRED -u admin -p --host $MYSQL_DB_HOST --port $MYSQL_DB_PORT
</code></pre><p><em><strong>或者</strong></em></p><p>使用 <code>mysql</code> 客户端和本地 MySQL 数据库时,运行:</p><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ curl -s https://raw.githubusercontent.com/istio/istio/release-1.5/samples/bookinfo/src/mysql/mysqldb-init.sql | mysql -u root -p --host $MYSQL_DB_HOST --port $MYSQL_DB_PORT
</code></pre></li><li><p>创建一个名为 <code>bookinfo</code> 的用户,并在 <code>test.ratings</code> 表上授予它 <em>SELECT</em> 权限:</p><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ mysqlsh --sql --ssl-mode=REQUIRED -u admin -p --host $MYSQL_DB_HOST --port $MYSQL_DB_PORT -e &#34;CREATE USER &#39;bookinfo&#39; IDENTIFIED BY &#39;&lt;password you choose&gt;&#39;; GRANT SELECT ON test.ratings to &#39;bookinfo&#39;;&#34;
</code></pre><p><em><strong>或者</strong></em></p><p>对于 <code>mysql</code> 和本地数据库,命令是:</p><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ mysql -u root -p --host $MYSQL_DB_HOST --port $MYSQL_DB_PORT -e &#34;CREATE USER &#39;bookinfo&#39; IDENTIFIED BY &#39;&lt;password you choose&gt;&#39;; GRANT SELECT ON test.ratings to &#39;bookinfo&#39;;&#34;
</code></pre><p>在这里,你会应用<a href=https://en.wikipedia.org/wiki/Principle_of_least_privilege>最小特权原则</a>,这意味着不在 Bookinfo 应用程序中使用 <code>admin</code> 用户。相反,你为应用程序 Bookinfo 创建了一个最小权限的特殊用户 <code>bookinfo</code> 在这种情况下,<code>bookinfo</code> 用户只对单个表具有 <code>SELECT</code> 特权。</p><p>在运行命令创建用户之后,你可能会想通过检查最后一个命令的编号并运行 <code>history -d &lt;创建用户的命令编号></code> 来清理我的 bash 历史记录。你可能不希望新用户的密码存储在 bash 历史记录中,如果你使用了 <code>mysql</code> 命令行工具,记得要删除 <code>~/.mysql_history</code> 文件中的最后一个命令。在 <a href=https://dev.mysql.com/doc/refman/5.5/en/create-user.html>MySQL 文档</a>中阅读有关新创建用户的密码保护的更多信息。</p></li><li><p>检查创建的评级,看看一切都按预期工作:</p><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ mysqlsh --sql --ssl-mode=REQUIRED -u bookinfo -p --host $MYSQL_DB_HOST --port $MYSQL_DB_PORT -e &#34;select * from test.ratings;&#34;
Enter password:
+----------+--------+
| ReviewID | Rating |
+----------+--------+
| 1 | 5 |
| 2 | 4 |
+----------+--------+
</code></pre><p><em><strong>或者</strong></em></p><p>对于 <code>mysql</code> 和本地数据库:</p><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ mysql -u bookinfo -p --host $MYSQL_DB_HOST --port $MYSQL_DB_PORT -e &#34;select * from test.ratings;&#34;
Enter password:
+----------+--------+
| ReviewID | Rating |
+----------+--------+
| 1 | 5 |
| 2 | 4 |
+----------+--------+
</code></pre></li><li><p>暂时将评级设置为<code>1</code>,以便在 Bookinfo <em>ratings</em> 服务使用我们的数据库时提供可视线索:</p><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ mysqlsh --sql --ssl-mode=REQUIRED -u admin -p --host $MYSQL_DB_HOST --port $MYSQL_DB_PORT -e &#34;update test.ratings set rating=1; select * from test.ratings;&#34;
Enter password:
Rows matched: 2 Changed: 2 Warnings: 0
+----------+--------+
| ReviewID | Rating |
+----------+--------+
| 1 | 1 |
| 2 | 1 |
+----------+--------+
</code></pre><p><em><strong></strong></em></p><p>对于<code>mysql</code>和本地数据库:</p><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ mysql -u root -p --host $MYSQL_DB_HOST --port $MYSQL_DB_PORT -e &#34;update test.ratings set rating=1; select * from test.ratings;&#34;
Enter password:
+----------+--------+
| ReviewID | Rating |
+----------+--------+
| 1 | 1 |
| 2 | 1 |
+----------+--------+
</code></pre><p>在最后一个命令中使用了 <code>admin</code> 用户(和 <code>root</code> 用于本地数据库),因为 <code>bookinfo</code> 用户在 <code>test.ratings</code> 表上没有 <code>UPDATE</code> 权限。</p></li></ol><p>现在你已经可以去部署使用外部数据库的 Bookinfo 应用程序版本了。</p><h3 id=initial-setting-of-Bookinfo-application>Bookinfo 应用程序的初始设置</h3><p>为了演示使用外部数据库的场景,你首先使用安装了 <a href=/v1.5/zh/docs/setup/getting-started/>Istio</a> 的 Kubernetes 集群,然后部署 <a href=/v1.5/zh/docs/examples/bookinfo/>Istio Bookinfo 示例应用程序</a><a href=/v1.5/zh/docs/examples/bookinfo/#apply-default-destination-rules>应用默认的 destination rule</a><a href=/v1.5/zh/docs/tasks/traffic-management/egress/egress-control/#change-to-the-blocking-by-default-policy>将 Istio 默认策略修改为禁止 Egress</a></p><p>此应用程序使用 <code>ratings</code> 微服务来获取书籍评级,评分在 1 到 5 之间。评级显示为每个评论的星号,有几个版本的 <code>ratings</code> 微服务。有些人使用 <a href=https://www.mongodb.com>MongoDB</a>,有些使用 <a href=https://www.mysql.com>MySQL</a> 作为他们的数据库。</p><p>这篇博客例子里的命令是以 Istio 0.8 以上版本为基础的,无论启用或不启用<a href=/v1.5/zh/docs/concepts/security/#mutual-TLS-authentication>双向 TLS</a></p><p>提醒一下,这是 <a href=/v1.5/zh/docs/examples/bookinfo/>Bookinfo 示例应用程序</a>中应用程序的原始整体架构图。</p><figure style=width:80%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:59.086918235567985%><a data-skipendnotes=true href=/v1.5/zh/docs/examples/bookinfo/withistio.svg title="原始的 Bookinfo 应用程序"><img class=element-to-stretch src=/v1.5/zh/docs/examples/bookinfo/withistio.svg alt="原始的 Bookinfo 应用程序"></a></div><figcaption>原始的 Bookinfo 应用程序</figcaption></figure><h3 id=use-the-database-for-ratings-data-in-Bookinfo-application>将数据库用于 Bookinfo 应用程序中的评级数据</h3><ol><li><p>修改使用 MySQL 数据库的 <em>ratings</em> 服务版本的 <code>deployment spec</code>,以使用你的数据库实例。该 <code>spec</code> 位于 Istio 发行档案的 <a href=https://github.com/istio/istio/blob/release-1.5/samples/bookinfo/platform/kube/bookinfo-ratings-v2-mysql.yaml><code>samples/bookinfo/platform/kube/bookinfo-ratings-v2-mysql.yaml</code></a> 中。编辑以下几行:</p><pre><code class=language-yaml data-expandlinks=true data-repo=istio>- name: MYSQL_DB_HOST
value: mysqldb
- name: MYSQL_DB_PORT
value: &#34;3306&#34;
- name: MYSQL_DB_USER
value: root
- name: MYSQL_DB_PASSWORD
value: password
</code></pre><p>替换上面代码段中的值,指定数据库主机,端口,用户和密码,请注意,在 Kubernetes 中使用容器环境变量中密码的正确方法是<a href=https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-environment-variables>使用 secret</a>,仅对于此示例任务,你可能会在 deployment spec 中直接配置明文的密码, <strong>切记!不要在真实环境中这样做</strong>!我想你们应该也知道,<code>"password"</code> 这个值也不应该用作密码。</p></li><li><p>应用修改后的 <code>spec</code> 来部署使用外部数据库的 <em>ratings</em> 服务,<em>v2-mysql</em> 的版本。</p><div><a data-skipendnotes=true style=display:none href=https://raw.githubusercontent.com/istio/istio/release-1.5/samples/bookinfo/platform/kube/bookinfo-ratings-v2-mysql.yaml>Zip</a><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo-ratings-v2-mysql.yaml@
deployment &#34;ratings-v2-mysql&#34; created
</code></pre></div></li><li><p>将发往 <em>reviews</em> 服务的所有流量路由到 <em>v3</em> 版本,这样做是为了确保 <em>reviews</em> 服务始终调用 <em>ratings</em> 服务,此外,将发往 <em>ratings</em> 服务的所有流量路由到使用外部数据库的 _ratings v2-mysql_。</p><p>通过添加两个<a href=/v1.5/zh/docs/reference/config/networking/virtual-service/>虚拟服务(virtual service)</a>,可以为上述两种服务指定路由。这些虚拟服务在 Istio 发行档案的 <code>samples/bookinfo/networking/virtual-service-ratings-mysql.yaml</code> 中指定。
<strong><em>注意:</em></strong> 确保你在完成了<a href=/v1.5/zh/docs/examples/bookinfo/#apply-default-destination-rules>添加默认目标路由</a>才执行下面的命令。</p><div><a data-skipendnotes=true style=display:none href=https://raw.githubusercontent.com/istio/istio/release-1.5/samples/bookinfo/networking/virtual-service-ratings-mysql.yaml>Zip</a><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-mysql.yaml@
</code></pre></div></li></ol><p>更新的架构如下所示,请注意,网格内的蓝色箭头标记根据我们添加的虚拟服务配置的流量,根据虚拟服务的定义,流量将发送到 <em>reviews v3</em><em>ratings v2-mysql</em></p><figure style=width:80%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:59.314858206480224%><a data-skipendnotes=true href=/v1.5/zh/blog/2018/egress-tcp/bookinfo-ratings-v2-mysql-external.svg title="Bookinfo 应用程序,其评级为 v2-mysql外部为 MySQL 数据库"><img class=element-to-stretch src=/v1.5/zh/blog/2018/egress-tcp/bookinfo-ratings-v2-mysql-external.svg alt="Bookinfo 应用程序,其评级为 v2-mysql外部为 MySQL 数据库"></a></div><figcaption>Bookinfo 应用程序,其评级为 v2-mysql外部为 MySQL 数据库</figcaption></figure><p>请注意MySQL 数据库位于 Istio 服务网格之外,或者更准确地说是在 Kubernetes 集群之外,服务网格的边界由虚线标记。</p><h3 id=access-the-webpage>访问网页</h3><p><a href=/v1.5/zh/docs/examples/bookinfo/#determine-the-ingress-IP-and-port>确定入口 IP 和端口</a>之后,访问应用程序的网页。</p><p>你会发现问题,在每次审核下方都会显示消息 <em>&ldquo;Ratings service is currently unavailable”</em> 而不是评级星标。</p><figure style=width:80%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:36.18705035971223%><a data-skipendnotes=true href=/v1.5/zh/blog/2018/egress-tcp/errorFetchingBookRating.png title="Ratings 服务的错误信息"><img class=element-to-stretch src=/v1.5/zh/blog/2018/egress-tcp/errorFetchingBookRating.png alt="Ratings 服务的错误信息"></a></div><figcaption>Ratings 服务的错误信息</figcaption></figure><p><a href=/v1.5/zh/blog/2018/egress-https/>使用外部 Web 服务</a>一样,你会体验到<strong>优雅的服务降级</strong>,这很好,虽然 <em>ratings</em> 服务中有错误,但是应用程序并没有因此而崩溃,应用程序的网页正确显示了书籍信息,详细信息和评论,只是没有评级星。</p><p>你遇到的问题与<a href=/v1.5/zh/blog/2018/egress-https/>使用外部 Web 服务</a>中的问题相同,即 Kubernetes 集群外的所有流量TCP 和 HTTP都被 sidecar 代理默认阻止,要为 TCP 启用此类流量,必须定义 TCP 的网格外部服务入口。</p><h3 id=mesh-external-service-entry-for-an-external-MySQL-instance>外部 MySQL 实例的网格外部服务入口</h3><p>&ldquo;TCP 网格外部服务入口&rdquo;功能可以解决上面的问题。</p><ol><li><p>获取你的 MySQL 数据库事例的 IP 地址,作为参考,你可以通过 <a href=https://linux.die.net/man/1/host>host</a> 命令实现:</p><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ export MYSQL_DB_IP=$(host $MYSQL_DB_HOST | grep &#34; has address &#34; | cut -d&#34; &#34; -f4)
</code></pre><p>如果是本地数据库,设置 <code>MYSQL_DB_IP</code> 环境变量为你的本机 IP保证这个环境变量能被集群访问到。</p></li><li><p>定义一个网格外部服务入口:</p><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ kubectl apply -f - &lt;&lt;EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: mysql-external
spec:
hosts:
- $MYSQL_DB_HOST
addresses:
- $MYSQL_DB_IP/32
ports:
- name: tcp
number: $MYSQL_DB_PORT
protocol: tcp
location: MESH_EXTERNAL
EOF
</code></pre></li><li><p>检查你刚刚新增的服务入口,确保它的值是正确的</p><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ kubectl get serviceentry mysql-external -o yaml
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
...
</code></pre></li></ol><p>请注意,对于 TCP 服务入口,将 <code>tcp</code> 指定为入口 &ldquo;port&rdquo;&ldquo;protocol&rdquo; 的值,另请注意,要在 &ldquo;addresses&rdquo; 列表里面指定外部服务的 IP 地址,作为一个 <code>32</code> 为后缀的 <a href=https://tools.ietf.org/html/rfc2317>CIDR</a> 块。</p><p><a href=#service-entries-for-tcp-traffic>下面</a>我将详细讨论 TCP 服务入口。现在先来验证我们添加的出口规则是否解决了问题。访问网页看看评星是否回来了。</p><p>有效! 访问应用程序的网页会显示评级而不会出现错误:</p><figure style=width:80%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:36.69064748201439%><a data-skipendnotes=true href=/v1.5/zh/blog/2018/egress-tcp/externalMySQLRatings.png title="Book Ratings 显示正常"><img class=element-to-stretch src=/v1.5/zh/blog/2018/egress-tcp/externalMySQLRatings.png alt="Book Ratings 显示正常"></a></div><figcaption>Book Ratings 显示正常</figcaption></figure><p>请注意,正如预期的那样,你会看到两个显示评论的一星评级。将评级更改为一颗星,为我们提供了一个视觉线索,确实使用了我们的外部数据库。</p><p>与 HTTP/HTTPS 的服务入口一样,你可以动态地使用 <code>kubectl</code> 删除和创建 TCP 的服务入口。</p><h2 id=motivation-for-egress-TCP-traffic-control>出口 TCP 流量控制的动机</h2><p>一些网内 Istio 应用程序必须访问外部服务,例如遗留系统,在许多情况下,不通过 HTTP 或 HTTPS 协议执行访问,使用其他 TCP 协议,例如 <a href=https://docs.mongodb.com/manual/reference/mongodb-wire-protocol/>MongoDB Wire 协议</a><a href=https://dev.mysql.com/doc/internals/en/client-server-protocol.html>MySQL 客户端/服务器协议</a>等特定于数据库的协议,与外部数据库通信。</p><p>接下来我会再说说 TCP 流量的服务入口。</p><h2 id=service-entries-for-tcp-traffic>TCP 流量的服务入口</h2><p>启用到特定端口的 TCP 流量的服务入口必须指定 <code>TCP</code> 作为端口的协议,此外,对于 <a href=https://docs.mongodb.com/manual/reference/mongodb-wire-protocol/>MongoDB Wire 协议</a>,协议可以指定为 <code>MONGO</code>,而不是 <code>TCP</code></p><p>对于服务入口配置的 <code>addresses</code> 字段,必须使用 <a href=https://tools.ietf.org/html/rfc2317>CIDR</a> 表示法中的 IP 块。注意在 TCP 服务入口配置中,<code>host</code> 字段会被忽略。</p><p>要通过其主机名启用到外部服务的 TCP 流量,必须指定主机名的所有 IP每个 IP 必须由 CIDR 块指定。</p><p>请注意,外部服务的所有 IP 并不总是已知。要往外发送 TCP 流量,只能配置为被应用程序使用的 IP。</p><p>另请注意,外部服务的 IP 并不总是静态的,例如在 <a href=https://en.wikipedia.org/wiki/Content_delivery_network>CDN</a> 的情况下,有时 IP 在大多数情况下是静态的,但可以不时地更改,例如由于基础设施的变化。在这些情况下,如果已知可能 IP 的范围,则应通过 CIDR 块指定范围。如果不知道可能的 IP 的范围,则不能使用 TCP 服务入口,并且<a href=/v1.5/zh/docs/tasks/traffic-management/egress/egress-control/#direct-access-to-external-services>必须直接调用外部服务</a>,绕过 sidecar 代理。</p><h2 id=relation-to-virtual-machines-support>与网格扩展的关系</h2><p>请注意,本文中描述的场景与<a href=/v1.5/zh/docs/examples/virtual-machines/bookinfo/>集成虚拟机</a>示例中描述的网格扩展场景不同。 在这种情况下MySQL 实例在与 Istio 服务网格集成的外部(集群外)机器(裸机或 VM上运行 MySQL 服务成为网格的一等公民,具有 Istio 的所有有益功能,除此之外,服务可以通过本地集群域名寻址,例如通过 <code>mysqldb.vm.svc.cluster.local</code>,并且可以通过<a href=/v1.5/zh/docs/concepts/security/#mutual-TLS-authentication>双向 TLS 身份验证</a>保护与它的通信,无需创建服务入口来访问此服务; 但是,该服务必须在 Istio 注侧,要启用此类集成,必须在计算机上安装 Istio 组件( <em>Envoy proxy</em> <em>node-agent</em> <code>_istio-agent_</code> ),并且必须可以从中访问 Istio 控制平面(<em>Pilot</em> <em>Mixer</em> <em>Citadel</em> )。有关详细信息,请参阅 <a href=/v1.5/zh/docs/examples/virtual-machines/>Istio VM 相关</a></p><p>在这个的示例中MySQL 实例可以在任何计算机上运行,也可以由云提供商作为服务进行配置,无需集成机器
与 Istio ,无需从机器访问 Istio 控制平面,在使用 MySQL 作为服务的情况下,运行 MySQL 的计算机可能无法访问并且可能无法在其上安装必需的组件。在这个的例子中MySQL 实例可以通过其全局域名进行寻址,如果消费应用程序希望使用该域名,这可能是有益的,当在消费应用程序的部署配置中无法更改预期的域名时,这尤其重要。</p><h2 id=cleanup>清理</h2><ol><li><p>删除 <code>test</code> 数据库和 <code>bookinfo</code> 用户:</p><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ mysqlsh --sql --ssl-mode=REQUIRED -u admin -p --host $MYSQL_DB_HOST --port $MYSQL_DB_PORT -e &#34;drop database test; drop user bookinfo;&#34;
</code></pre><p><em><strong>或者</strong></em></p><p>对于<code>mysql</code>和本地数据库:</p><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ mysql -u root -p --host $MYSQL_DB_HOST --port $MYSQL_DB_PORT -e &#34;drop database test; drop user bookinfo;&#34;
</code></pre></li><li><p>删除虚拟服务:</p><div><a data-skipendnotes=true style=display:none href=https://raw.githubusercontent.com/istio/istio/release-1.5/samples/bookinfo/networking/virtual-service-ratings-mysql.yaml>Zip</a><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ kubectl delete -f @samples/bookinfo/networking/virtual-service-ratings-mysql.yaml@
Deleted config: virtual-service/default/reviews
Deleted config: virtual-service/default/ratings
</code></pre></div></li><li><p>取消部署 <em>ratings v2-mysql</em> </p><div><a data-skipendnotes=true style=display:none href=https://raw.githubusercontent.com/istio/istio/release-1.5/samples/bookinfo/platform/kube/bookinfo-ratings-v2-mysql.yaml>Zip</a><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ kubectl delete -f @samples/bookinfo/platform/kube/bookinfo-ratings-v2-mysql.yaml@
deployment &#34;ratings-v2-mysql&#34; deleted
</code></pre></div></li><li><p>删除服务入口:</p><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ kubectl delete serviceentry mysql-external -n default
Deleted config: serviceentry mysql-external
</code></pre></li></ol><h2 id=conclusion>结论</h2><p>在这篇博文中,我演示了 Istio 服务网格中的微服务如何通过 TCP 使用外部服务默认情况下Istio 会阻止所有流量TCP 和 HTTP到集群外的主机 要为 TCP 启用此类流量,必须为服务网格创建 TCP 网格外部服务入口。</p><nav id=see-also><h2>相关内容</h2><div class=see-also><div class=entry><p class=link><a data-skipendnotes=true href=/v1.5/zh/blog/2018/egress-mongo/>使用外部 MongoDB 服务</a></p><p class=desc>描述了一个基于 Istio 的 Bookinfo 示例的简单场景。</p></div><div class=entry><p class=link><a data-skipendnotes=true href=/v1.5/zh/blog/2019/egress-traffic-control-in-istio-part-3/>Istio 中安全管控出口流量,第三部分</a></p><p class=desc>管控出口流量的备选方案比较,包括性能因素。</p></div><div class=entry><p class=link><a data-skipendnotes=true href=/v1.5/zh/blog/2019/egress-traffic-control-in-istio-part-2/>Istio 中的安全管控出口流量,第二部分</a></p><p class=desc>使用 Istio 的出口流量管控来阻止相关出口流量攻击。</p></div><div class=entry><p class=link><a data-skipendnotes=true href=/v1.5/zh/blog/2019/egress-traffic-control-in-istio-part-1/>Istio 中的安全管控出口流量,第一部分</a></p><p class=desc>涉及出口流量攻击和出口流量管控要求。</p></div><div class=entry><p class=link><a data-skipendnotes=true href=/v1.5/zh/blog/2019/egress-performance/>Egress gateway 性能测试</a></p><p class=desc>评估加入 Egress gateway 对性能造成的影响。</p></div><div class=entry><p class=link><a data-skipendnotes=true href=/v1.5/zh/blog/2018/egress-monitoring-access-control/>HTTP Egress 流量监控和访问策略</a></p><p class=desc>描述如何配置 Istio 进行 HTTP Egress 流量监控和访问策略。</p></div></div></nav></article><nav class=pagenav><div class=left><a title=介绍更安全,低风险的部署和发布到生产。 href=/v1.5/zh/blog/2018/traffic-mirroring/><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#left-arrow"/></svg>用于在生产环境进行测试的 Istio 流量镜像功能</a></div><div class=right><a title="描述基于 Istio Bookinfo 示例的简单场景。" href=/v1.5/zh/blog/2018/egress-https/>使用外部 Web 服务<svg class="icon"><use xlink:href="/v1.5/img/icons.svg#right-arrow"/></svg></a></div></nav><div id=feedback><div id=feedback-initial>这些信息有用吗?<br><button class="btn feedback" onclick="sendFeedback('zh',1)">是的</button>
<button class="btn feedback" onclick="sendFeedback('zh',0)">没有</button></div><div id=feedback-comment>Do you have any suggestions for improvement?<br><br><input id=feedback-textbox type=text placeholder="Help us improve..." data-lang=zh></div><div id=feedback-thankyou>Thanks for your feedback!</div></div><div id=endnotes-container aria-hidden=true><h2>链接</h2><ol id=endnotes></ol></div></div><div class=toc-container><nav class=toc aria-label="Table of Contents"><div id=toc><ol><li role=none aria-label="Bookinfo 示例应用程序与外部评级数据库"><a href=#Bookinfo-sample-application-with-external-ratings-database>Bookinfo 示例应用程序与外部评级数据库</a><ol><li role=none aria-label=为评级数据设置数据库><a href=#setting-up-the-database-for-ratings-data>为评级数据设置数据库</a><li role=none aria-label="Bookinfo 应用程序的初始设置"><a href=#initial-setting-of-Bookinfo-application>Bookinfo 应用程序的初始设置</a><li role=none aria-label="将数据库用于 Bookinfo 应用程序中的评级数据"><a href=#use-the-database-for-ratings-data-in-Bookinfo-application>将数据库用于 Bookinfo 应用程序中的评级数据</a><li role=none aria-label=访问网页><a href=#access-the-webpage>访问网页</a><li role=none aria-label="外部 MySQL 实例的网格外部服务入口"><a href=#mesh-external-service-entry-for-an-external-MySQL-instance>外部 MySQL 实例的网格外部服务入口</a></ol></li><li role=none aria-label="出口 TCP 流量控制的动机"><a href=#motivation-for-egress-TCP-traffic-control>出口 TCP 流量控制的动机</a><li role=none aria-label="TCP 流量的服务入口"><a href=#service-entries-for-tcp-traffic>TCP 流量的服务入口</a><li role=none aria-label=与网格扩展的关系><a href=#relation-to-virtual-machines-support>与网格扩展的关系</a><li role=none aria-label=清理><a href=#cleanup>清理</a><li role=none aria-label=结论><a href=#conclusion>结论</a><li role=none aria-label=相关内容><a href=#see-also>相关内容</a></li></ol></div></nav></div></main><footer><div class=user-links><a class=channel title="立刻下载 Istio 1.5.4" href=/v1.5/docs/setup/getting-started/#download aria-label="Download Istio"><span>download</span><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#download"/></svg>
</a><a class=channel title="加入 Istio discussion board 参与讨论获取帮助" href=https://discuss.istio.io aria-label="Istio discussion board"><span>discuss</span><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#discourse"/></svg></a>
<a class=channel title="Stack Overflow 中列举了针对实际问题以及部署、配置和使用 Istio 的各项回答" href=https://stackoverflow.com/questions/tagged/istio aria-label="Stack Overflow"><span>stack overflow</span><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#stackoverflow"/></svg></a>
<a class=channel title="在 Slack 上与 Istio 社区交互讨论开发问题(仅限邀请)" href=https://istio.slack.com aria-label=slack><span>slack</span><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#slack"/></svg></a>
<a class=channel title="关注我们的 Twitter 来获取最新信息" href=https://twitter.com/IstioMesh aria-label=Twitter><span>twitter</span><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#twitter"/></svg></a><div class=tag>对于用户</div></div><div class=info><p class=copyright>中文内容由 ServiceMesher 社区维护,部分文档可能稍微滞后于英文版本,同步工作持续进行中<br>Istio 归档
1.5.4<br>&copy; 2020 Istio Authors, <a href=https://policies.google.com/privacy>隐私政策</a><br>归档于 2020年5月21日</p></div><div class=dev-links><a class=channel title="Istio 的代码在 GitHub 上开发" href=https://github.com/istio/community aria-label=GitHub><span>github</span><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#github"/></svg></a>
<a class=channel title="如果您想深入了解 Istio 的技术细节,请查看我们日益完善的设计文档" href=https://groups.google.com/forum/#!forum/istio-team-drive-access aria-label="team drive"><span>drive</span><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#drive"/></svg></a>
<a class=channel title="如果您想为 Istio 项目做出贡献,请考虑加入我们的工作组" href=https://github.com/istio/community/blob/master/WORKING-GROUPS.md aria-label="working groups"><span>working groups</span><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#working-groups"/></svg></a><div class=tag>对于开发者</div></div></footer><div id=scroll-to-top-container aria-hidden=true><button id=scroll-to-top title=回到顶部><svg class="icon"><use xlink:href="/v1.5/img/icons.svg#top"/></svg></button></div></body></html>