关于istio:全网最细-深度解析-Istio-Ambient-Mesh-流量路径

前言Istio Ambient Mesh 是 Istio 社区的推出的将 Sidecar 的能力抽离至 ztunnel 和 waypoint 的全新架构,同时基于 iptables 和策略路由实现了该架构下的流量规定,目前网络上曾经有些材料对这部分的实现进行了肯定水平的分析(比方 http://Solo.io 推出的三篇系列文章),但依然有很多细节尚没有任何文章提及。本文旨在对 Istio Ambient Mesh 的流量门路进行具体解读,力求尽可能清晰地出现细节,以帮忙读者齐全了解 Istio Ambient Mesh 中最为要害的局部。浏览本文须要读者具备根本的 TCP/IP 协定常识和操作系统网络常识,包含 iptables 和路由等。鉴于篇幅限度,本文不会具体介绍这些根底概念,对于感兴趣的读者,倡议自行查阅相干材料以深刻理解。 环境咱们应用一个最简化的场景来阐明 Ambient Mesh 流量门路:从一个运行在 Node-A 上的 sleep Pod 中通过 curl 发动一个 HTTP 申请,申请的对象是集群中名为 httpbin 的服务。在该服务下有一个位于 Node-B 上的 httpbin Pod,因为服务(ClusterIP)在 K8s 中只是一个虚构的 IP(它并不是任何实在存在的网络设备地址),所以在这个场景中,这个申请是间接发往 httpbin 利用 Pod 的,该场景的网络门路看起来会像是这样: 然而,在 Ambient Mesh 流量规定的影响下,实际上从 sleep Pod 收回的数据包须要经验一系列 iptables、策略路由被转发至 ztunnel 或 waypoint 之后能力达到对端的 httpbin 利用当中。这里为了在后续的篇幅中便于形容,咱们须要先介绍一下在这一流程中的所有参与者,读者无需记住这些设施的地址和名称,此处列出只是为了不便查阅: 残缺流量门路sleep -> httpbin 的申请门路尽管看起来非常简略,然而在 Ambient Mesh 下,ztunnel 接管了所有的出入连贯,从 sleep pod 收回的 ip 包都会被劫持到 ztunnel 的 15001 端口,通过 ztunnel 加密后再收回,所以事实上 sleep pod 中执行的 curl 发动的连贯实际上是连贯到了 ztunnel Pod 中的协定栈,同样地,httpbin Pod 接管到的连贯实际上则是来自它所在 Node 上运行的 ztunnel,所以理论建设的 TCP 连贯有 3 条: ...

September 26, 2023 · 9 min · jiezi

关于istio:Istio-正式成为-CNCF-毕业项目

「K8S 生态周报」内容次要蕴含我所接触到的 K8S 生态相干的每周值得举荐的一些信息。欢送订阅知乎专栏「k8s生态」。大家好,我是张晋涛。 就在昨天 Istio 正式成为 CNCF 毕业我的项目了 !这是 Istio 倒退过程中的一个重要的里程碑。 这篇文章我将疾速回顾下 Istio 的倒退历程以及它的一些次要个性。Istio 大略是我除了 Kubernetes 和 Docker 外写的相干内容最多的了,我也有幸在 Istio Con 做过分享。 Istio 的倒退历程是这样的: Istio 我的项目由 Google、IBM 和 Lyft 在 2017 年开源,联合了这三家公司在生产环境中运行多语言应用程序栈的教训。它的次要指标是简化云原生环境中微服务的治理,平安和可观测性。它一开始就是构筑在 Kubernetes 之上的。并且在 2018 年公布了 v1.0 版本,标记着它正式生产可用。 Istio 最后的架构中蕴含管制面和数据面,其中数据立体应用 Envoy 作为服务代理,管制立体由多个组件组成,包含 Pilot、Mixer、Citadel 和 Galley 等,然而这些组件常常受到诟病。起初在 2020 年 3 月公布的 v1.5 版本中将这些组件进行了对立,成为 istiod 。我在 K8S 生态周报| Docker v19.03.7 公布 | MoeLove 进行过介绍: 原先是这样 对立后成为 istiod,就清晰很多了。 在 2020 年 5 月公布的 Istio 1.6 版本中,除去移除了一些不再须要的内容外,还减少了目前应用最为宽泛的 istio install 命令,也增加了 Istio 本身的金丝雀更新反对,相干内容也能够看 K8S 生态周报| Docker v19.03.9 公布 | MoeLove ...

July 13, 2023 · 2 min · jiezi

关于istio:分析-Java-应用在-Istio-下的-warm-up

剖析 Java 利用在 Istio 下的 warm up故事的开始在很久很久前的,有个测试找到一个开发,说 k8s 下 HPA(主动伸缩) 新启动的 pod 的 api latency 特地高: 须要留神,上图是在 Java 服务提供者本身察看到的 latency,即观察点是服务的 server 端或说 upstream 。有同学会问,这个重要吗? api latency 就是 api latency 了,还要管是什么观察点的察看后果? 因为已知是 server 端的察看后果,那么就间接考察 server 端了。这次运气比拟好,间接被告知 server 端 cpu 应用高。再看看 pod 配置: resources: limits: cpu: "2" memory: 4Gi requests: cpu: "2" memory: 4Gi考察直觉通知我,是 CPU 限流(CPU Throttled)了(这个直觉是两年前花了一个月在坑中爬出来后造成的,Grafana Dashboard 也是本人老手造的)。可怜言中: 同时,留神到一个景象是,线程数在 pod 启动时,直线拉升: 好了,问题如同很简略,就看什么工作用了那么多 cpu ,有什么能够优化。 谁的锅性能优化有个根本实践: ...

July 9, 2023 · 6 min · jiezi

关于istio:调试与观察-istioproxy-Envoy-sidecar-的启动过程

调试与察看 istio-proxy Envoy sidecar 的启动过程 debug 初始化之难Envoy 的启动 attach 办法 手工 inject 的 istio-proxy container 1. 定制手工拉起的 istio-proxy 环境2. 启动 remote debug server 与 vscode debug session 2.1 设置断点3. 启动 pilot-agent 和 envoy4. 开始 debug罕用断点附录 - 写给本人的一些备忘 Istio auto inject 的 sidecar container (我没有应用这种办法) 在 worker node 上 Debugger wait processDebugger follow process forkDebugger wrapper script流量 debuglldb 常用命令单 调试与察看 istio-proxy Envoy sidecar 的启动过程学习 Istio 下 Envoy sidecar 的初始化过程,有助于了解 Envoy 是如何构建起整个事件驱动和线程互动体系的。其中 Listener socket 事件监初始化是重点。而获取这个常识最间接的办法是 debug Envoy 启动初始化过程,这样能够间接察看运行状态的 Envoy 代码,而不是间接读无聊的 OOP 代码去猜事实行为。但要 debug sidecar 初始化有几道砍要过。本文记录了我通关打怪的过程。 ...

June 7, 2023 · 7 min · jiezi

关于istio:Istio-实现-extauthz-外部扩展鉴权以及对接基于-k8s-的微服务

Istio 实现 ext-authz 内部扩大鉴权以及对接基于 k8s 的微服务能够实现基于 redis 的 token 鉴权以及实现 rbac 鉴权。 转载请注明起源:https://janrs.com/vrsrIstio 的内部鉴权实质是基于 Envoy 实现的,间接看 Envoy 的代码,链接地址:点击主动跳转 Isio 官网的 Demo 代码,链接:点击主动跳转 实现Istio 提供了基于 HTTP 形式以及 Grpc 形式的内部鉴权扩大,这里这实现了 Grpc。 配置批改 Istio 的 Configmap 配置。在 mesh 字段上面增加以下代码配置: extensionProviders: - name: "rgrpc-dev-authz-grpc-provider" envoyExtAuthzGrpc: service: "auth.rgrpc-dev.svc.cluster.local" port: 50051截图如下 创立 Istio 鉴权 Grpc 服务实质上,Istio 的内部鉴权是基于 Evnoy 实现,只须要实现了 Envoy 的 Grpc 办法后 Istio 就会主动调用。 须要实现的 Envoy 的 external_auth.pb.go文件 链接:点击主动跳转 只须要实现外面的 Check 办法即可。Envoy 官网提供了 v2 以及 v3 代码的实现,这里我只实现了 v3 的接口。 ...

June 1, 2023 · 3 min · jiezi

关于istio:调试-Istio-网格中运行的-Envoy-sidecar-C-代码

调试 Istio 网格中运行的 Envoy sidecar C++ 代码本文来源于我的开源书籍 《Istio Insider》 。介绍调试在 Istio 网格中运行的 Envoy sidecar C++ 代码。 它有助于在代码级别深入研究 sidecar。 它使咱们在解决 Istio 问题或编写更好的 EnvoyFilter 或 eBPF 跟踪程序时更有信念。 本文介绍如何应用 VSCode 和 lldb 调试 Envoy istio-proxy sidecar。 我的动机深入研究 Envoy Proxy 在 Istio 管制面管制下的实在行为和代码逻辑 多年前,我写过一篇文章:gdb debug istio-proxy(envoy)(中文)。 它只是在 Istio 网格之外调试 Envoy 过程。对我来说,深入研究 Istio 服务网格中 sidecar (istio-proxy) 的行为让我更有信念实现我的书:《Istio Insider》。 我想应用 (lldb/gdb) + VSCode 来调试在 Istio 服务网格上运行的 Envoy(C++ 代码)。 深入研究 Envoy Proxy 在 Istio 管制面管制下的实在行为和代码逻辑 去年,我在写《逆向工程与云原生现场剖析 —— eBPF 跟踪 Istio/Envoy 系列》 时,感觉应用 BPF uprobe 动静注入 probe ,探测过程数据最难的是理解运行期的 C++ 对象内存构造。而 debug 过程无疑是最间接牢靠的内存构造察看办法。能够用 debug 中的察看后果,领导 BPF uprobe 程序的精确编写。 ...

May 19, 2023 · 4 min · jiezi

关于istio:Istio-升级后踩的坑

背景前段时间咱们将 istio 版本升级到 1.12 后导致现有的利用监控有局部数据失落(页面上显示不进去)。 一个是利用根底信息失落。再一个是利用 JVM 数据失落。接口维度的监控数据失落。 修复根底信息首先是第一个根底信息失落的问题,页面上其实显示的是咱们的一个聚合指标istio_requests_total:source:rate1m。 聚合后能够将多个指标合并为一个,缩小零碎压力具体能够参考 Istio 的最佳实际 Observability Best Practices 有具体阐明。 spec: groups: - interval: 30s name: istio.service.source.istio_requests_total rules: - expr: | sum(irate(istio_requests_total{reporter="source"}[1m])) by ( destination_app, source_workload_namespace, response_code, source_app ) record: istio_requests_total:source:rate1m实质上是通过以上四个维度进行统计 istio_requests_total;但在降级之后查看原始数据发现失落了 destination_app, source_app 这两个 tag。 至于为啥失落,查了许久,最初在降级后的资源文件 stats-filter-1.12.yaml 中找到了答案:降级后新增了 tags_to_remove 标记,将咱们所须要的两个 tag 间接删掉了。 后续在以后 namespace 下从新建一个 EnvoyFilter 资源笼罩掉默认的便能复原这两个 tag,修复后监控页面也显示失常了。 EnvoyFilter 是实时失效的,并不需要重建利用 Pod。JVM 监控JVM 数据失落的这个利用,间接进入 Pod 查看暴露出的 metric,发现数据都有,一切正常。 jvm_memory_pool_bytes_used{pool="Code Cache",} 1.32126784E8jvm_memory_pool_bytes_used{pool="Metaspace",} 2.74250552E8jvm_memory_pool_bytes_used{pool="Compressed Class Space",} 3.1766024E7jvm_memory_pool_bytes_used{pool="G1 Eden Space",} 1.409286144E9jvm_memory_pool_bytes_used{pool="G1 Survivor Space",} 2.01326592E8jvm_memory_pool_bytes_used{pool="G1 Old Gen",} 2.583691248E9阐明不是数据源的问题,那就可能是数据采集节点的问题了。 ...

February 20, 2023 · 2 min · jiezi

关于istio:特定条件下-Istio-发生-halfclose-连接泄漏与出站连接失败

引在 4 年前,Istio 让我眼前一亮的个性莫过于利用无关的流量拦挡和通明代理。这为低成本进入 Service Mesh 时代大大降低了开发门槛。也是很多公司引入 Istio 的次要起因之一。 有句话说: 你的最大长处有时候也是你的最大毛病的起源。Istio 默认应用了 iptable 的 REDIRECT rule 作为 DNAT 出站流量到 sidecar 的办法。 如果读者比拟理解 NAT ,也肯定或多或少晓得,NAT 是个不完满,有比拟显著缺点(哪个技术没有?),但事实中宽泛应用的技术。包含你家的路由器上也在应用。 NAT 技术,在 Linux kernel 中,个别是以 conntrack + NAT iptable 实现的。它是 NAT 的一个实现。它有着和 NAT 技术相似的问题。 用 Draw.io 关上 问题上面讲述两个问题。两个问题都只在特定条件下才触发: TCP Proxy 局部场景 half-closed 连贯透露 1 小时应用程序出站(outbound)连贯超时,因为应用程序抉择了一个与 15001(outbound)listener 上的现有套接字抵触的长期端口问题 1 是 问题 2 的诱因之一。 因为之前与社区沟通过程次要应用英文,还未来得及翻译,上面次要还是英文叙述。 TCP Proxy 局部场景 half-closed 连贯透露 1 小时有配图的细节,可见我的书《istio insider》中的 TCP Proxy half-closed connection leak for 1 hour in some scenariosSidecar intercept and TCP proxy all outbound TCP connection by default:(app --[conntrack DNAT]--> sidecar) -----> upstream-tcp-service ...

February 13, 2023 · 4 min · jiezi

关于istio:EnvoyIstio-连接生命周期与临界异常-不知所谓的连接-REST

简介本文指标:阐明 Envoy 连贯管制相干参数作用。以及在临界异常情况下的细节逻辑。指标是如何缩小连贯异样而引起的服务拜访失败,进步服务成功率。 近期为解决一个生产环境中的 Istio Gateway 连贯偶然 Reset 问题,钻研了一下 Envoy/Kernel 在 socket 连贯敞开上的事。其中包含 Envoy 的连贯治理相干参数和 Linux 零碎网络编程的细节。写本文以备忘。 原文:https://blog.mygraphql.com/zh/posts/cloud/envoy/connection-life/ 引封面简介:《硅谷(Silicon Valley)》 《硅谷》是一部美国悲剧电视连续剧,由迈克·贾奇、约翰·阿尔舒勒和戴夫·克林斯基创作。 它于 2014 年 4 月 6 日在 HBO 首播,并于 2019 年 12 月 8 日完结,共 53 集。该系列模拟了硅谷的技术行业文化,重点讲述了创立一家名为 Pied Piper 的初创公司的程序员 Richard Hendricks,并记录了他在面对来自更大实体的竞争时维持公司的致力。 该系列因其写作和风趣而受到好评。 它取得了有数荣誉提名,包含间断五次取得黄金时段艾美奖卓越悲剧系列提名。 我在 2018 年看过这部连续剧。过后英文程度无限,能听懂的只有 F*** 的单词。但透过屏幕,还是能够感触到一群有守业激情的如何各展所能,去应答一个又一个挑战的过程。在某种程度上,满足我这种事实世界无奈实现的欲望。 剧中一个经典场景是玩一种能够抛在地面后,随机变红或蓝的玩具球。玩家失去蓝色,就算赢。叫: SWITCH PITCH BALL Based on a patented ‘inside-out’ mechanism, this lightweight ball changes colors when it is flipped in the air. The Switch Pitch entered the market in 2001 and has been in continuous production since then. The toy won the Oppenheim Platinum Award for Design and has been featured numerous times on HBO’s Silicon Valley. ...

January 12, 2023 · 21 min · jiezi

关于istio:世事洞明皆學問-tcpdump-抓取-Istio-流量真心话

图片起源: Rowan Atkinson Goes to Battle in ‘Man vs. Bee’ 本文摘自我的开源书《Istio & Envoy 底细》 中的 Istio 端口 与 组件。如图片不清,可回到原文。最近,须要在 mTLS 的 Istio 1.12 环境下定位一些 “神奇” 的网络问题。经验过一些 tcpdump 抓取 Istio 流量的折腾,被迫又温习了一次 Istio 的网络魔术,固记录于本文。 前言无论你抵赖与否,咱们习惯是缘用旧办法或工具去解决新问题。就算曾经达到 Cloud Natvie, Service Mesh 时代,人们也会默认持续用 tcpdump 去定位网络问题。这有问题吗?或者有,或者没有,我没答案。 tcpdump 的历史https://en.wikipedia.org/wiki... tcpdump was originally written in 1988 by Van Jacobson, Sally Floyd, Vern Paxson and Steven McCanne who were, at the time, working in the Lawrence Berkeley Laboratory Network Research Group. By the late 1990s there were numerous versions of tcpdump distributed as part of various operating systems, and numerous patches that were not well coordinated. Michael Richardson (mcr)&action=edit&redlink=1) and Bill Fenner created www.tcpdump.org in 1999. ...

December 18, 2022 · 4 min · jiezi

关于istio:Service-Mesh-Summit-回顾-轻舟服务网格的无侵入增强-Istio-经验

在云原生社区近日主办的 Service Mesh Summit 2022 服务网格峰会上,网易数帆云原生技术专家方志恒分享了轻舟服务网格无侵入加强 Istio 的教训,本文据此次分享整顿,介绍了对无侵入和实现的思考,轻舟服务网格演进过程中的扩大加强,以及这些扩大加强和无侵入的关系。这里“无侵入”强调的是对服务网格基础设施自身的无侵入,而不是只有对业务的无侵入,后者是服务网格自身的定位所要思考的内容。 服务网格保护中的无侵入对于无侵入,咱们从各自的实践经验也晓得,做无侵入的加强是十分艰难的。起因有很多,比如说咱们可能要做业务的适配,疾速落地,定制的一些需要等,业务以及我的项目周期的压力,迫使咱们不得不做出一些有侵入的抉择。然而咱们为什么还要去强调无侵入呢?因为对于咱们保护团队,或者说对于咱们本人这个技术计划的保护方来说,每一分侵入都会有每一分的老本,它会在后续会体现进去,比如说在做长期保护,做版本演进,去做社区的一些性能和新版本的对齐,咱们都须要去解决咱们的改变和社区的骨干分支之间的抵触。 因而,咱们须要在咱们的研发流程外面去贯彻这样一个指标或者理念:这个计划是不是做到无侵入了,如果没有做到的话,那做到的水平是怎么样的?这样可能才失去一个“求上得中”的成果,就是保持无侵入,咱们才可能做到比拟低的侵入。 在应用社区的计划去做定制开发、去演进的过程中,咱们认为,有一些比拟适合的用来去做保护的思路,最合适的形式,是间接应用社区原生的 API 提供的扩大点去做一些无侵入的扩大,这是最现实的状况。当然,社区的一些扩大的 API 可能无奈齐全满足咱们的需要,这个时候咱们能够在下层去做一个封装,业界的一些落地的实际案例也体现出这样的理念。这里援用一句名言:计算机科学畛域的任何问题,都能够通过减少一个中间层来解决。 即便是这样,咱们出于性能的思考,或者出于个性的思考,很多时候还是会面临一些不得不去做批改的状况。咱们有第二个准则,就是把扩大加强的内容去做一些封装在一个独自的库外面,这样能够做到最小的批改和替换。这也是一个比拟奢侈的工程教训。 第三点,如果咱们的确要做比拟大的一个批改,这个时候咱们能够尽量去贯彻一个理念,就是要对社区原生的一些设计思路和个性做一致性的对齐。这里我分享一个“撸猫准则”:如果咱们非要去撸一只猫的话,最好顺着它的毛去撸,否则咱们可能会把它的毛搞得很乱,甚至它还会反过来咬咱们一口。 服务和配置的扩大首先介绍咱们对 Istio 的服务和配置的扩大。 配置Istio 社区曾经提供反对多 configSource,并给出了一个协定叫 MCP-over-xds,通过这种形式咱们能够从不同的数据源去拿到所需的配置。 configSources:- address: xds://mesh-registry.istio-system.svc:16010?type=serviceentry&type=sidecar- address: k8s://这里给出一个配置样例,是通过 xDS 协定去向某一个服务去获取它的配置,同时也能够去 Kubernetes 去获取那些规范的 CR,这是它的一个扩大的形式。 咱们的 URL 跟官网的略微有点不一样,是在这根底上略微做了一点改良,实现了一个叫做 Istio-MCP 的库平替社区原生的 adsc,这就是后面说的第二个准则。在这个库外面,咱们实现了 xDS 的增量推送,更加强了一个 revision 的机制,Istio 反对依照 revision 去获取本人感兴趣的配置,咱们对此做了加强。咱们还做了一个更灵便的分派,容许在 configSource 外面去指定一个类型,相当于从不同的 configSource 去获取不同类型的配置,这个很多时候都是实际的须要。 服务服务这部分,在网易数帆的场景外面,比拟宽泛地利用到了 ServiceEntry。Istio 对 Kubernetes 服务的反对很好,大部分状况下无需做额定的扩大,然而因为它的定位,Istio 把对非 Kubernetes 服务的反对简直都留给了它的一个扩大点,就是 ServiceEntry 这个API,以及后面所说的配置扩大的形式。通过这种形式,Istio 容许第三方来作为配置和服务的提供员,来提供其余的服务模型。当然在这个过程中,第三方须要本人去实现服务模型的转换,因为 ServiceEntry 简直就是 Istio 外部服务模型的 API 版本,你能够认为它是 Istio Service 模型。 ...

October 14, 2022 · 4 min · jiezi

关于istio:Istio-Envoy-内幕一书的进展

假期间,更新了不少内容。有趣味的敌人能够去预览一下。总体感悟是:求言有其物,不求大而全。谢谢。 《Istio & Envoy 底细》

October 4, 2022 · 1 min · jiezi

关于istio:图解-Istio-Envoy-请求处理流程超时熔断指标监控

对于封面:Tower Bridge watercolor painting by Juan Bosco 摘录阐明:本文摘自一本我在写作中的开源书《Istio & Envoy 底细》 中 Envoy 申请与响应调度 一节。如果说你看到的转载图片不清,可回到原书。 申请与响应调度 相干组件相干的监控指标Envoy 申请调度流程申请与响应调度时序线总结一些乏味的扩大浏览 正式开编前。想说说写本节的一些故事原因。为何去钻研 Envoy 的申请与响应调度? 缘起于一个客户需要,须要对 Istio 网格节点故障疾速复原做一些调研。为此,我翻阅了大量的 Istio/Envoy 文档、大咖 Blog。看了很多很芜杂的信息: 衰弱检测熔断Envoy 中的各个神秘又关系千头万绪的 timeout 配置申请 RetryTCP keepalive、TCP_USER_TIMEOUT 配置芜杂到最初,我不得不写个文章去梳理一下信息:Istio 网格节点故障疾速复原初探 。 但信息是梳理了,根底原理却没理顺。于是,我下决心去钻研一下 Envoy 的文档。是的,其实 Envoy 的文档曾经写得比拟粗疏。只是: 信息散落在一个个网页中,无奈用时序和流程的办法组织起来,形成一个有机的整体。不去理解这个整体协作关系,只是一个一个参数离开来看,是无奈感性去衡量这些参数的。指标与指标,指标与参数,关系简单而下面的关系,都能够通过申请与响应调度流程串联起来基于下面起因。我从文档、参数、指标推导出以下流程。<mark>留神:临时未在代码中验证,请审慎参考。</mark> 申请与响应调度实质上说,Envoy 就是一个代理。说起代理,第一反馈应该是有以下流程的软件/硬件: 接管来自 downstream 的 Request做一些逻辑,必要时批改 Request ,并断定upstream目的地转发(批改后)的 Request 到upstream如果协定是一个 Request & Reponse 式的协定(如 HTTP) 代理通常会接管upstream的Response做一些逻辑,必要时批改 Response转发 Response 给 downstream确实,这也是 Envoy 代理 HTTP 协定的概要流程。但 Envoy 还要实现很多个性: ...

October 2, 2022 · 2 min · jiezi

关于istio:好心分手-Istio-网格节点故障快速恢复初探

目录 开始测试寻根 TCP half-openkeepalive重传 timeoutZero window timeout利用 socket 层的 timeout 设置 TCP_USER_TIMEOUTSO_RCVTIMEO / SO_SNDTIMEOpoll timeout寻根总结较真有什么用闲暇连贯的 keepalive 查看 作为 upstream(服务端) 时作为 downstream(客户端) 时TCP_USER_TIMEOUTEnvoy 应用层衰弱检测 衰弱检测与连接池衰弱检测与 endpoint 发现被动衰弱检测: Health checking被动衰弱检测: Outlier detection衰弱检测与 EDS,听谁的?Envoy 应用层的超时 Envoy 应用层的连贯级超时Envoy 应用层的申请级超时 对 downstream(client) 的申请读超时对 upstream(server) 的响应期待超时谈超时,别忘记 retry 影响思考一点总结次要参考如果图片不清,请转到原文最近,须要对 k8s cluster + VIP load balance + Istio 的环境做一些 HA / Chaos Testing(混沌测试) 。如下图,在此环境中,须要看看 worker node B 在非正常关机或网络分区的状况下,对外部用户(Client) 的影响: 申请成功率影响性能(TPS/Response Time)影响 上图须要阐明一下: 对外部的 VIP(虚构IP) 的 TCP/IP 层负载平衡,是通过 ECMP(Equal-Cost Multi-Path) 的 Modulo-N 算法,调配负载,它实质上就是用 TCP 连贯的 5 元组(协定、srcIP、srcPort、dstIP、dstPort)去调配内部流量了。留神,这种负载平衡算法是无状态的,在指标数量发生变化时,负载平衡算法的后果也会发生变化。即是不稳固算法。dstIP 为 VIP 的 TCP 流量,来到 woker node 后,再由 ipvs/conntrack 规定做有状态的,DNAT,dstIP 被映射和转换为任意一个 Istio Gateway POD 的地址。留神,这种负载平衡算法是有状态的,在指标数量发生变化时,原有连贯的负载平衡后果不会发生变化。即算是稳固算法。Istio Gateway POD 对 HTTP/TCP 流量也做了负载平衡。两种协定的区别是: ...

September 27, 2022 · 9 min · jiezi

关于istio:Envoy-Istio-性能指标与原理初探

对于封面:置信很多人听过《London Bridge Is Falling Down》这个儿歌,有人也晓得这个是英国传统的儿童游戏歌曲。但很多人和我一样,认为 "London Bridge" 就是封面中的塔桥。直到明天,我才晓得,"London Bridge" 并不是 "Tower Bridge"。所以,封面不是 "London Bridge"。无论喜爱与否,一个时代的符号走到了起点,愿安定。 摘录阐明:本文摘自一本我在写作中的开源书《Istio & Envoy 底细》 中 Istio 与 Envoy 指标 一节。如果说你看到的转载图片不清,可回到原书。Istio 与 Envoy 指标概述Envoy 指标 Envoy 指标概述 Tag指标数据类型指标释义 cluster managerhttp connection manager(HCM)listenersserverwatch dogEvent loop配置阐明 config.bootstrap.v3.Bootstrapconfig.metrics.v3.StatsConfigconfig.metrics.v3.StatsMatcherIstio 指标 Istio 本人的 Metrics 规范指标阐明 MetricsPrometheus 的 Labels应用 istio-proxy 与利用的 Metrics 整合输入定制:为 Metrics 减少维度定制:退出 request / response 元信息维度工作原理 istio stat filter 应用istio stat Plugin 实现Envoy 内置的 Metrics 定制 Envoy 内置的 Metrics原理总结:Istio-Proxy 指标地图Istio 与 Envoy 指标概述指标监控,可能是 DevOps 监控最重要的一环。但同时也可能是最难的一环。你能够从网上找到各种零碎和中间件的 Grafana 监控仪表盘,它们大都设计得很漂亮得体,让人感觉监控曾经白璧无瑕。 ...

September 11, 2022 · 10 min · jiezi

关于istio:关于-istioproxy-503504等5xx问题排查

问题形容在生产环境,咱们最近部署了Istio Service Mesh,Istio管制立体会在每个服务Pod里主动注入一个sidecar。当各个服务都初始化istio-proxy,通过sidecar去实现服务间的调用时,利用和服务就会面临一个很广泛的问题:upstream 服务调用收到HTTP 503/504 response,这个报错信息通常都是由istio-proxy产生的。HTTP 503通常产生在利用和istio-proxy的inbound或者outbound调用,或者是服务网格内部的服务调用。影响面绝对重大的是通过网格拜访内部服务的outbound流量,绝对小的是网格外部的inbound流量。HTTP 504的问题绝对要少一些,只有在upstream service的接口response工夫超过15秒时才会产生,因为istio-proxy的默认response超时工夫就是15秒。这个问题的景象跟实在的upstream组件失败谬误很类似,然而,通过景象剖析也有可能是istio自身的默认配置对于网格外部的利用不是那么强壮而问题引起的,对于那些影响面比拟大的outbound服务调用:在某一个工夫周期内,会有大量的503产生(通常访问量越大报错越多),过一段时间后本人会自愈,周而复始。 影响小一些的inbound调用,在利用监控面板上看不到报错信息,只有在istio-proxy的log里会发现一些503的痕迹,因为咱们通常会在客户端或者上游调用时配置重试规定,大部分异样调用都会在重试后胜利拿到数据。 对于outbound调用,504 response timeout谬误只会对组件依赖超过15秒的申请造成影响。能够察看一下istio-proxy日志里的HTTP 503/504 upstream谬误,进一步的对于日志格局和response flags的信息能够点击链接查看。envoy log 在具体探索这个谬误的具体起因之前,咱们先看一些谬误一日信息的示例:Inbound Call Error example 上面是一个istio-proxy日志里达到申请的response flag “UC”异样日志,含意是:“Upstream connection termination in addition to 503 response code”,因为某种原因在同一个pod里的istio-proxy和他的upstream容器之间的链接被断开了。 还有另外一种response flag “UF”异样日志, 含意是:“Upstream connection failure in addition to 503 response code”,因为某种原因使同一个pod内的istio-proxy和他的upstream容器没方法建设链接 [2022-04-18T09:29:59.633Z] "GET /service_a/v2.1/get?ids=123456 HTTP/1.1" 503 UC "-" "-" 0 95 11 - "-" "-" "bc6f9ba3-d8dc-4955-a092-64617d9277c8" "srv-a.xyz" "127.0.0.1:8080" inbound|80|http|srv-a.xyz.svc.cluster.local - 100.64.121.11:8080 100.64.254.9:35174 -[2022-04-18T08:38:43.976Z] "GET /service_b/v2.5/get?getIds=123456 HTTP/1.1" 503 UF "-" "-" 0 91 0 - "-" "-" "d0dbd0fe-90db-46d0-b614-7eaea3764f79" "srv-b.xyz.svc.cluster.local" "127.0.0.1:8080" inbound|80|http|srv-b.xyz.svc.cluster.local - 100.65.130.7:8080 100.64.187.3:53378 -Outbound Call Error example ...

May 31, 2022 · 2 min · jiezi

关于istio:上帝和-Istio-打架时程序员如何自我救赎-记一次-Envoy-Filter-修正任性HTTP-Header

引故事产生在公元 2022 年的夏天。上帝(化名)在上线流量测试中,发现在未引入 Istio 前失常 HTTP 200 的申请,引入 Istio Gateway 后变为 HTTP 400 了。而呈现问题的流量均带有不合 HTTP 标准的 HTTP Header。如冒号前多了个 空格: GET /headers HTTP/1.1\r\nHost: httpbin.org\r\nUser-Agent: curl/7.68.0\r\nAccept: */*\r\nSpaceSuffixHeader : normalVal\r\n在向上帝收回修改问题的申请后,“无辜”的程序员作好了应答最坏状况的打算,筹备尝试打造一条把控本人命运的诺亚方舟(希伯来语: ;英语:Noah's Ark)。 打算 - 两艘诺亚方舟人们议论 Istio 时,人们大多数状况其实是在议论 Envoy。而 Envoy 用的 HTTP 1.1 解释器是曾经 2 年没更新的 c 语言写的库 nodejs/http-parser 。最间接的思路是,让解释器去兼容问题 HTTP Header。好,程序员关上了搜索引擎。 1号方舟 - 让解释器兼容如果说抉择搜索引擎是个条件问题,那么搜寻关键字的选用才是个技术+教训的活儿。这里不细说程序员如何搜寻了。总之,后果是被引擎带到:White spaces in header fields will cause parser failed #297 而后当然是喜忧参半地读到: Set the HTTP_PARSER_STRICT=0 solved my issue, thanks.即须要在 istio-proxy / Envoy / http-parser 编译期退出下面参数,就能够兼容后带空格的 Header 名。 ...

May 29, 2022 · 4 min · jiezi

关于istio:Istio实际操作篇Istio入门10分钟快速安装

@TOC 前言上一篇讲了什么是Istio的实践篇,这次咱们就来实际操作。 想看上一篇实践篇的看这里(看完相对有所播种):[Istio是什么?] 还不晓得你就out了,一文40分钟疾速了解_小叶的技术Logs的博客-CSDN博客 本文阐明 请大家务必查看本文有两个版本,具体版、简洁版。 前者适宜老手,后者适宜新手(不便大家查找,从而过滤掉某些步骤,节约工夫老本) 所以大家按需查看哟。 具体版简洁版简洁版:蕴含所有步骤,以及命令的执行过程(适宜老手) 简洁版:只蕴含命令(适宜有肯定熟练度的人) 环境筹备零碎VcpuMemory集群centos728kubernetes具体版入门:搭建步骤Istio软件包下载装置最新软件包 $ curl -L https://istio.io/downloadIstio | sh - # 装置最新软件包这一条命令如果下载不下来,能够间接拜访下载地址:Istio下载 筛选对应的istio版本、下载对应的压缩文件,如图所示:留神:Istio1.13.3版本,要求kubernetes最低集群版是1.19解压软件包: [root@master istio]# lltotal 22704-rw-r--r-- 1 root root 23245765 Apr 23 10:39 istio-1.12.3-linux-amd64.tar.gz[root@master istio]# tar -vzxf istio-1.12.3-linux-amd64.tar.gzistio-1.12.3/istio-1.12.3/manifest.yamlistio-1.12.3/bin/istio-1.12.3/bin/istioctlistio-1.12.3/manifests/istio-1.12.3/manifests/examples/istio-1.12.3/manifests/examples/customresource/istio-1.12.3/manifests/examples/customresource/istio_v1alpha1_istiooperator_cr.yamlistio-1.12.3/manifests/examples/user-gateway/装置目录蕴含: samples/ 目录下的示例应用程序bin/ 目录下的 istioctl 客户端二进制文件 .配置环境变量: [root@master istio]# cat /etc/profileexport ISTIO_HOME=/root/istio/istio-1.12.3 export PATH=$PATH:$ISTIO_HOME/bin[root@master istio]# istioctl versionclient version: 1.12.3control plane version: 1.12.3data plane version: 1.12.3 (10 proxies)下载Istio[root@master ~]# istioctl install --set profile=demo -yDetected that your cluster does not support third party JWT authentication. Falling back to less secure first party JWT. See https://istio.io/v1.12/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for details.! values.global.jwtPolicy is deprecated; use Values.global.jwtPolicy=third-party-jwt. See http://istio.io/latest/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for more information insteadWARNING: Istio control planes installed: 1.13.3.WARNING: An older installed version of Istio has been detected. Running this command will overwrite it.✔ Istio core installed✔ Istiod installed✔ Egress gateways installed✔ Ingress gateways installed✔ Installation complete Making this installation the default for injection and validation.Thank you for installing Istio 1.12. Please take a few minutes to tell us about your install/upgrade experience! https://forms.gle/FegQbc9UvePd4Z9z7主动注入 Envoy 边车代理 ...

April 25, 2022 · 2 min · jiezi

关于istio:Istio是什么-还不知道你就out了一文40分钟快速理解

@[toc] 前言这篇文章属于纯理论,所含内容如下,按需浏览: Istio概念、服务网格、流量治理、istio架构(Envoy、Sidecar 、Istiod)虚构服务(VirtualService)、路由规定、指标规定(DestinationRule)网关(Gateway)、网络弹性和测试(超时、重试、熔断器、故障注入) Istio是什么?Istio是一个开源的服务网格,通明的接入到分布式服务中。它也是一个平台,集成任何日志、遥测和策略零碎的 API 接口。Istio 胜利高效地运行散布式微服务架构,并提供爱护、连贯和监控微服务的对立办法。Istio 有助于升高 DevOps 压力、开发团队的压力。服务网格是什么?组成微服务网络实现服务之间的交互利用场景服务发现、负载平衡、故障复原、度量和监控A/B 测试、金丝雀公布、速率限度、访问控制和端到端认证为什么应用Istio?服务网格是通过sidecar(边车)代理服务实现,管制立体次要是对sidecar的配置和治理,这包含: 为 HTTP、gRPC、WebSocket 和 TCP 流量主动负载平衡。通过丰盛的路由规定、重试、故障转移和故障注入对流量行为进行细粒度管制。可插拔的策略层和配置 API,反对访问控制、速率限度和配额。集群内(包含集群的入口和进口)所有流量的自动化度量、日志记录和追踪。在具备弱小的基于身份验证和受权的集群中实现平安的服务间通信。Istio还反对扩大,满足你部署需要! 流量治理介绍Istio流量路由规定能够很容易的管制服务之间的流量和API调用。能实现A/B测试、金丝雀公布、基于流量百分比公布。开箱即用的故障复原个性,有助于加强利用的健壮性,从而更好地应答被依赖的服务或网络产生故障的状况。Istio 的流量治理由Envoy代理服务提供。网格内服务发送和接管的所有流量都由 Envoy 代理解决,让管制网格内的流量变得异样简略,不须要对服务做更改。为了在网格中导流,Istio 须要晓得 endpoint 在哪和属于哪个服务。为了定位到service registry(服务注册核心),Istio 会连贯到一个服务发现零碎。例如,如果您在 Kubernetes 集群上装置了 Istio,那么它将自动检测该集群中的服务和 endpoint(端点)。 应用此服务注册核心,Envoy 代理能够将流量定向到相干服务。大多数基于微服务的应用程序,每个服务的工作负载都有多个实例来解决流量,称为负载平衡池。默认状况下,Envoy 代理基于轮询调度在服务的负载平衡池内散发流量,按程序申请发送给池中每个成员,一旦所有服务实例均接管过一次申请后,从新回到第一个池成员。 这些 API 也应用 Kubernetes 的自定义资源定义(CRDs)来申明,能够应用 YAML 进行配置。 istio架构Istio 服务网格 逻辑上分为数据立体和管制立体 数据立体:Envoy代理被部署为sidecar,负责协调和管制微服务之间的通信,收集和报告所有网格流量的遥测数据。管制立体:治理并配置Envoy代理 EnvoyC++ 开发的高性能代理,用于协调服务网格中所有服务的入站和出站流量。Envoy 代理是惟一与数据立体流量交互的 Istio 组件。Envoy 代理被部署为服务的 Sidecar,在逻辑上为服务减少了 Envoy 的许多内置个性,例如: 动静服务发现负载平衡TLS 终端HTTP/2 与 gRPC 代理熔断器健康检查基于百分比流量宰割的分阶段公布故障注入丰盛的指标Sidecar容许 Istio 能够执行策略决策,提取丰盛的遥测数据,接着将这些数据发送到监视系统以提供整个网格行为的信息。Sidecar 代理还容许向 Istio 增加性能,不须要从新设计架构或重写代码。IstiodIstiod 提供服务发现、配置和证书治理。Istiod 将管制流量的高级路由规定转换为 Envoy 特定的配置,并在运行时流传给 Sidecar。Istiod 平安通过内置的身份和凭证治理,实现了弱小的服务对服务和终端用户认证。Istiod 充当证书受权(CA),生成证书以容许在数据立体中进行 mTLS 通信。 ...

April 22, 2022 · 3 min · jiezi

关于istio:IstioCon-2022网易数帆六年优化经验即将揭秘

北京工夫4月25~29日,Istio 社区第二届寰球峰会 IstioCon 2022 将于线上举办,来自 Google、网易、IBM、腾讯等公司的 80+ 服务网格(Service Mesh)技术专家将带来 60+ 场技术分享,其中网易数帆资深架构师 Yonka Fang(方志恒)将为寰球开发者和用户分享网易数帆 Istio 实践经验。 网易是服务网格技术的第一批践行者,网易数帆云原生团队早在2017年 Istio 倒退之初就意识到这项技术在云原生架构中的价值,也深度参加了 Istio 社区建设和我的项目迭代,并基于此在2019年实现了网易严选第二代服务网格平台的大降级,目前该项技术也曾经胜利利用在银行、证券、能源等多行业头部客户数字化基础设施中。 演讲主题: Istio 推送的性能优化教训 演讲工夫: 4月28日 10:40(Apr-28 02:40 UTC) 主题简介: 介绍 Istio 中的服务/配置数据流转和推送的流程,剖析该过程中的性能点和可能的性能瓶颈。 结合实际生产落地中的各场景,尤其是大规模服务数据/接入负载场景遇到的性能问题来解说解决思路,分享相干优化教训。 讲师简介: Yonka Fang(方志恒) ,网易数帆 资深架构师网易数帆资深架构师,负责轻舟 Service Mesh,先后参加多家科技公司 Service Mesh 建设及相干产品演进。从事多年基础架构、中间件研发,有较丰盛的 Istio 治理保护、性能拓展和性能优化教训。 网易数帆六年 Istio 实战经验稀释,精彩不容错过,欢送扫码预约直播! 欲知 IstioCon 2022 大会更多详情,请戳链接拜访大会官网: https://events.istio.io/istio...

April 13, 2022 · 1 min · jiezi

关于istio:云原生现场分析-Part4-eBPF-跟踪-IstioEnvoy-之上下游事件驱动协作下的-HTTP-反向代理流程

注,原文来自 https://blog.mygraphql.com/zh... 。如你看到的转载图片不清,请回到原文。 为何要理解 upstream/downstream 事件驱动合作下的 HTTP 反向代理流程逆向工程与云原生现场剖析 系列介绍HTTP 反向代理的总流程 Downstream Read Request 模块合作Upstream Write Request 模块合作Upstream Read Response 模块合作Downstream Write Response 模块合作BPF 脚本输入BPF 脚本结尾为何要理解 upstream/downstream 事件驱动合作下的 HTTP 反向代理流程想不到还真保持写到 Part4 了。不论你信不信,每一 part 的“为何”一节,是我感觉最难写的 :) 。如果你是第一次读这个系列,不必放心,每一节都是比拟独立的。 不出意外的话,你之前看到的 Envoy 简介是这样形容 Envoy 的个性的: C++ 编写,原生底层,没有 GC stop the world,所以性能优异异步事件驱动,多路复用,完满解决 C10k problem因为单线程负责多连贯,在大连贯量时,缩小了大量线程的内存开销,和 CPU 上下文切换开销这些形容,当然有其合理性。但很多远看很漂亮的事物,在微距放大后,可能有很多有意思,有价值的货色。我置信只有剖析得足够粗疏,总可能针对咱们理论运行环境和流量个性对作一些有意义的优化。可能只是批改一个 Envoy / Kernel 的配置,也可能是批改一行 Envoy 的代码。或你的利用的流程相干行为,如每次写 socket 的 buffer 数据包的大小。 而这些,都须要建设在理解实现细节的根底上。除非感觉运气或经验值特地好,能够瞎猜。 逆向工程与云原生现场剖析 系列介绍开始前先做个预报,逆向工程与云原生现场剖析 系列(将)包含: Part 1: eBPF 跟踪 Istio/Envoy 之学步Part 2: eBPF 跟踪 Istio/Envoy 之启动、监听与线程负载平衡Part 3: eBPF 跟踪 Istio/Envoy 之 downstream TCP 连贯 accept、TLS 握手 与 filter_chain 的抉择Part 4: eBPF 跟踪 Istio/Envoy 之 upstream/downstream 事件驱动合作下的 HTTP 反向代理流程 (本文)Part 5: eBPF 跟踪 Istio/Envoy 之 L3/4 Network Fitler 互动机制Part 6: eBPF 跟踪 Istio/Envoy 之 http filterPart 7: eBPF 跟踪 Istio/Envoy 之 http routerPart 8: eBPF 跟踪 Istio/Envoy 之 cluster、 connection pool 与 outbound load balance在系列中,我将演示如何让 bpftrace "读" 懂运行期的由 C++ 11 编写成的 envoy 过程中的对象数据。为免吓跑人,还是老套路,多图少代码,不过有的图有点点简单。程序员大叔开始讲故事了。 ...

April 7, 2022 · 19 min · jiezi

关于istio:逆向工程与云原生现场分析Part3eBPF跟踪IstioEnvoy事件模型连接与TLS握手与filter-chain选择

注,原文来自 https://blog.mygraphql.com/zh/posts/low-tec/trace/trace-istio/trace-istio-part3/ 。如你看到的转载图片不清,请回到原文。 承上在上一篇 逆向工程与云原生现场剖析 Part2 —— eBPF 跟踪 Istio/Envoy 之启动、监听与线程负载平衡 中,介绍了 如何用 bpftrace 去跟踪剖析 Envoy Listener 的 socket 监听,和监听是如何调配到 worker 线程的。 逆向工程与云原生现场剖析 系列介绍开始前先做个预报,逆向工程与云原生现场剖析 系列(将)包含: Part 1: eBPF 跟踪 Istio/Envoy 之学步Part 2: eBPF 跟踪 Istio/Envoy 之启动、监听与线程负载平衡Part 3: eBPF 跟踪 Istio/Envoy 之 downstream TCP 连贯 accept、TLS 握手 与 filter_chain 的抉择(本文)Part 4: eBPF 跟踪 Istio/Envoy 之 http filterPart 5: eBPF 跟踪 Istio/Envoy 之 http routerPart 6: eBPF 跟踪 Istio/Envoy 之 cluster、 connection pool 与 outbound load balance在系列中,我将演示如何让 bpftrace "读" 懂运行期的由 C++ 11 编写成的 envoy 过程中的对象数据。我花了一个月的工夫去补上几个技术债: ...

March 22, 2022 · 9 min · jiezi

关于istio:逆向工程与云原生现场分析-Part2-eBPF-跟踪-IstioEnvoy-之启动监听与线程负载均衡

承上在上一篇 逆向工程与云原生现场剖析 Part1 —— eBPF 跟踪 Istio/Envoy 之学步 中,介绍了如何入门 bpftrace 跟踪 Envoy。这次咱们来次较深度的历险。trace 察看一下 envoy 的启动、worker 线程启动与初始化、socket 监听。 预报开始前先做个预报,逆向工程与云原生现场剖析 系列(将)包含: Part 1: eBPF 跟踪 Istio/Envoy 之学步Part 2: eBPF 跟踪 Istio/Envoy 之启动、监听与线程负载平衡Part 3: eBPF 跟踪 Istio/Envoy 之 downstream L3/4 连贯 accept、TLS 握手 与 filter_chain 的抉择Part 4: eBPF 跟踪 Istio/Envoy 之 http filterPart 5: eBPF 跟踪 Istio/Envoy 之 http routerPart 6: eBPF 跟踪 Istio/Envoy 之 cluster、 connection pool 与 outbound load balance在系列中,我将演示如何让 bpftrace "读" 懂运行期的由 C++ 11 编写成的 envoy 过程中的对象数据。我花了一个月的工夫去补上几个技术债: ...

March 13, 2022 · 12 min · jiezi

关于istio:一文读懂Istio服务网格

Istio是什么随着Kubernetes的遍及,企业容器数量的一直回升。日常的容器治理成为开发及运维团队的一大难题。简略的说,Istio将有助于升高容器治理的复杂性,提供为容器利用治理提供流量治理、数据安全以及可观测性。下图展现了 Kubernetes 和 服务网格 (Service Mesh) 的关系。其中Istio会为每一个pod注入Sidecar容器,图中蓝色的Proxy局部。通过对立的管制立体 (Control plane) 对所有的Sidecar进行治理。 Envoy代理上文提到Sidecar代理在Istio中次要由开源我的项目Envoy来实现。Envoy是一个面向大型服务架构的通明代理。它的外围是一个三、四层的网络代理,通过配置实现TCP/UDP的代理工作。Envoy同时也反对HTTP的七层代理,并提供健康检查、服务发现、动静配置、高级负载平衡(主动重试、熔断器、全局限速等)等性能。下图为Envoy代理的架构图。侦听器 (Listener) 图中右上淡绿色的是代理的侦听器。Envoy能够设置一个或多个侦听器对上游提供网络界面,并且每个侦听器能够设置多个过滤器链 (filter_chans),通过扩大过滤器链能够不便的操控流量的行为。图中紫色局部为Envoy的xDS协定,Istio次要应用xDS协定对Envoy进行配置和治理;上游 (Upstream) 是以Envoy为连贯发起方。上游主机承受Envoy的连贯和申请,图中 host A 为上游主机;上游 (Downstream) 是连贯由上游主机发动,向Envoy发送申请及接管Envoy的响应,图中host B 及 host C为Envoy的上游主机;集群 (Cluster) 则是一组连贯到Envoy的上游主机。 xDS API在Istio中xDS次要用于组件Pilot和Envoy之间的治理。Envoy的v2 API中包含了以下根本协定:CDS (Cluster Discovery Service) 集群发现服务,用以在路由的时候发现上游Cluster。Envoy 从而能够优雅地增加、更新和删除集群。EDS (Endpoint Discovery Service) 端点发现服务,用于发现上游集群中的成员,对集群的端点进行治理。LDS (Listen Discovery Service) 侦听发现服务,用来增加、删除监听器RDS (Route Discovery Service) 路由发现服务。能够在运行时发现 HTTP 连贯,能够用以批改HTTP header,虚拟主机和虚拟主机的路由。在v3 API中又额定减少了SRDS,VHDS,SDS和RTDS协定,这里不做深刻介绍,有趣味的敌人能够查阅相干文档。下图形容了根底协定所对应的不同层面上图中的箭头不是流量进入代理后的门路或路由,也不是理论的程序。这是一个设想的 xDS 接口解决序列。其实xDS之间是有穿插援用的。 Istio 的服务网格 (Service Mesh)通过以上根底概念的介绍,咱们再来看下Istio的服务网格的实现,下图为Istio的服务网格架构图: 流量治理Istio通过规定配置实现HTTP/TCP的路由性能。通过这些配置还能够实现熔断器、限流、AB测试、金丝雀公布等性能。次要配置项包含: Gateway:形容了一个运行在网络边缘的负载均衡器,用于接管传入或传出的 HTTP/TCP 连贯。VirtualService:VirtualService 将 Kubernetes 服务连贯到 Istio 网关。它能够定义路由规定来设定流量到不同的 Kubernetes 服务。DestinationRule:决定了流量通过路由解决后的拜访策略。简而言之,它定义了流量的路由形式。这些策略能够定义负载平衡配置、连接池大小和内部检测配置。EnvoyFilter:提供一种机制来自定义Envoy代理的配置。ServiceEntry:默认状况下 Istio Service Mesh 中的服务无奈发现 Mesh 之外的服务。ServiceEntry 向 Istio 外部的服务注册,以便在网格中主动发现的服务能够被内部拜访。安全性Istio通过管制立体来解决API服务的配置,并在数据立体中配置策略加强点 (PEPs),TLS对所有内部流量及容器间通信进行加密。 ...

February 22, 2022 · 1 min · jiezi

关于istio:逆向工程思维解决云原生现场分析问题-Part1-eBPF-跟踪-IstioEnvoyK8S

缘起云原生复杂性在 200x 年时代,服务端软件架构,组成的复杂度,异构水平绝对于云原生,堪称简略很多。那个年代,大多数根底组件,要么由应用企业开发,要么是购买组件服务反对。 到了 201x 年代,开源静止,去 IOE 静止衰亡。企业更偏向抉择开源根底组件。然而开源根底的保护和问题解决老本其实并不是看起来那么低。给你源码,你认为就什么都看得透吗?对于企业,当初起码有几个大问题: 从高处看: 企业要投入多少人力才、财力能够找到或造就一个看得透开源根底组件的人?开源的版本、安全漏洞、更迭疾速,即便专业人才也很难疾速看得透运行期的软件行为。组件之间盘根错节的依赖、调用关系,再加上版本依赖和更迭,没有可能运行过完全相同环境的测试(哪怕你用了vm/docker image) 或者你还很迷恋向后兼容,即便它曾经挫伤过有数程序员的心和夜晚就像 古希腊哲学家赫拉克利特说:no one can step into the same river once(人不能两次踏进同一条河流)从细节看: 对于大型的开源我的项目,个别企业没可能投入人力看懂全副代码(留神,是看懂,不是看过)。而企业真正关怀或应用的,可能只是一小部分和切身故障相干的子模块。对于大型的开源我的项目,即便你认为看懂全副代码。你也不太可能理解全副运行期的状态。哪怕是我的项目作者,也不肯定能够。 我的项目的作者不在企业,也不可能齐全理解企业中数据的个性。更何况无处不在的 bug开源软件的精力在于凋谢与 free(这里不是指收费,这里只能用英文),而 free 不单单是 read only,它还是 writable 的。 开源软件大都不是大公司中某蠢才产品经理、蠢才构架师设计进去。而是泛滥使用者一起打磨进去的。但如果要看懂全副代码能力 writable,恐怕没人能够批改 Linux 内核了。动态的代码。这点我认为是最重要的。咱们所谓的看懂全副代码,是指动态的代码。但有教训的程序员都晓得,代码只有跑起来,才真正让人看得通透。而能剖析一个跑起来的程序,才能够说,我看懂全副代码。 这让我想起,个别的 code review,都在 review 什么?云原生现场剖析的难卖了半天的关子,那么有什么办法能够卖弄?能够疾速理点,剖析开源我的项目运行期行为? 加日志。 如果要解决的问题方才源码中有日志,或者提供日志开关,当然就关上完事。出工开饭。但这运气得多好?批改开源源码,退出日志,来个紧急上线。这样你得和运维关系有多铁?你确定加一次就够了吗?语言级别的动静 instrumentation 注入代码 在注入代码中剖析数据或出日志。如 alibaba/arthas 。golang instrumentation这对语言有要求,如果是 c/c++ 等就 心有余而力不足 了。对性能影响个别也不少。debug java debug / golang Delve / gdb 等,都有肯定的应用门槛,如程序打包时须要蕴含了 debug 信息。这在当下喜爱计较 image 大小的年代,debug 信息多被翦掉。同时,断点时可能挂起线程甚至整个过程。生产环境上产生就是劫难。uprobe/kprobe/eBPF 在下面办法都不可行时,这个办法值得一试。上面,咱们剖析一下,什么是 uprobe/kprobe/eBPF。为何有价值。逆向工程思维咱们晓得当初大部分程序都是用高级语言编码,再编译生成可执行的文件( .exe / ELF ) 或两头文件在运行期 JIT 编译。最终肯定要生成计算机指令,计算机能力运行。对于开源我的项目,如果咱们找到了这堆生成的计算机指令和源代码之间映射关系。而后: ...

February 10, 2022 · 6 min · jiezi

关于istio:Rainbond-对接-Istio-原理讲解和代码实现分析

一、背景现有的 ServiceMesh 框架有很多,如 Istio、linkerd等。对于用户而言,在测试环境下,须要达到的成果是快、开箱即用。但在生产环境下,可能又有熔断、延时注入等需要。那么繁多的 ServiceMesh 框架无奈同时满足用户不同的需要。 在之前的 Rainbond 版本中,Rainbond 反对了多种不同的利用治理模式,作为利用级的插件,实现了Istio 治理模式的切换。 本文将对Rainbond 实现Istio治理模式进行原理解析。 二、基本原理动静准入管制首先咱们须要理解一个常识,Istio 是如何实现主动注入的。实际上,Istio、linkerd 等不同的 ServiceMesh 框架都应用到了 Kubernetes 中的一个十分重要的性能,叫作 Dynamic Admission Control,也叫作:Initializer。 这个性能会在 API 对象创立之后会被立即调用到。在 API 对象被正式解决前,实现一些初始化的筹备工作。所以在部署了 Istio 管制立体当前,当你提交了 API 对象的 Yaml 文件,会被 Istio 的准入控制器捕捉,实现一些 PATCH 操作,比方加上对应的 Sidecar 容器字段。最终将这个 PATCH 过后的 API 对象交给 Kubernetes 解决。接下来就具体介绍下 ServiceMesh 框架的注入机制。 如何主动注入用户须要先在集群中部署 Istio 的管制立体。它会蕴含一个用来为 Pod 主动注入 Envoy 容器的 Initializer。首先, Istio 会将 Envoy 容器自身的定义,以 ConfigMap 的形式保留在 Kubernetes 当中。当 Initializer 的控制器,通过 Admission-Webhooks 监听到合乎规定【此处指对应的 Annoations】的 API 对象被创立后,读取对应的 ConfigMap 获取到 Envoy 容器的配置。并将相干的字段,主动增加到用户提交的 Pod 的 API 对象里。详见下图和阐明。 ...

January 6, 2022 · 2 min · jiezi

关于istio:Istio在Rainbond-Service-Mesh体系下的落地实践

两年前Service Mesh(服务网格)一进去就受到追捧,很多人认为它是微服务架构的最终状态,因为它能够让业务代码和微服务架构解耦,也就是说业务代码不须要批改就能实现微服务架构,但解耦还不够彻底,应用还是不不便,尽管架构解耦了,但部署还没有解耦。 无奈依据不同环境或客户须要抉择适合的Service Mesh框架。无奈做到在开发环境不必学习和应用Service Mesh,生产环境按需开启。插件式 Service Mesh架构实现思路目前成熟的ServiceMesh框架也有许多,然而对于用户而言。并不存在万能的ServiceMesh框架,能够解决各种场景的问题。因而咱们心愿对于用户而言,他只须要关怀本人的业务代码。而利用的治理能力,则能够通过不同的ServiceMesh框架进行拓展。用户的业务代码与ServiceMesh框架齐全解耦。如下图所示。用户能够随时替换某个利用所应用的ServiceMesh架构。抉择与业务最匹配的解决方案。 基于以上思路,咱们能够将istio、linkerd、dapr等微服务架构做成插件,开发过程中齐全不须要晓得Service Mesh框架的存在,只须要解决好业务的依赖关系,当交付到生产环境或客户环境,有些须要性能高、有些须要性能全、有些客户曾经指定等各种差异化需要,依据环境和客户须要按需开启不同类型的插件即可,当Service Mesh框架有问题,随时切换。这样Service Mesh框架就变成赋能的工具,老的业务零碎重新部署马上就能开启服务治理能力。 Rainbond就是基于上述思路实现的,以后版本曾经实现了三个服务治理插件。 kubernetes 原生Service 模式基于envoy的Service Mesh模式Istio服务治理模式前面咱们具体解说Istio服务治理模式的应用过程。 应用Istio治理模式的实际有了以上概念,咱们能够来看看Rainbond如何与Istio联合。在Rainbond中,用户能够对不同的利用设置不同的治理模式,即用户能够通过切换利用的治理模式,来按需治理利用。这样带来的益处便是用户能够不被某一个ServiceMesh框架所绑定,且能够疾速试错,能疾速找到最适宜以后业务的ServiceMesh框架。 装置Istio 管制面(control plane)首先在切换到Istio治理模式时,如果未装置Istio的管制面,则会提醒须要装置对应的管制面。因而咱们须要装置Istio的管制面,管制面在一个集群中只需装置一次,它提供了对立的治理入口,用来管理工作在Istio治理模式下的服务。实现配置下发等性能。联合Rainbond现有的helm装置形式,咱们能够便捷的装置好对应的组件。 1. 创立团队在5.5.0版本中,咱们反对了用户在创立团队时指定命名空间。因为默认helm装置的命名空间为 istio-system ,所以为了缩小用户配置。咱们首先须要创立出对应的团队。如下图所示。团队英文名对应的则是该团队在集群中的命名空间。此处填写 istio-system 。 2. 对接商店Rainbond反对基于helm间接部署利用,所以接下来对接Rainbond官网helm仓库,后续基于Helm商店部署Istio即可, 在利用市场页面,点击增加商店,抉择helm商店,输出相干信息即可实现对接。 商店地址:https://openchart.goodrain.co... 3. 装置 Istio 管制面商店创立实现后,即可看到对应的 helm 利用,目前Rainbond提供了 istio 1.11.4 版本的helm包,依据 Istio官网文档,该版本对Kubernetes集群的版本反对为 1.19, 1.20, 1.21, 1.22。 装置 base 利用 抉择helm商店中的base利用进行部署,团队抉择之前创立的命名空间为 istio-system 的团队。该利用包次要部署了Istio相干的集群资源和 CRD 资源。 装置 istio-discovery 利用** 同上述base利用一样,抉择正确的团队。装置 istio-discovery 利用。有了这两个利用,就能够领有 Istio 根底的治理能力了。 示例利用开启Istio治理模式1. 切换治理模式咱们以SpringBoot后盾管理系统 若依 为例,如下图所示,用户能够先从开源利用商店装置一个 若依SpringBoot 利用,版本抉择3.6.0,点击治理模式切换,抉择Istio治理模式。 ...

December 15, 2021 · 1 min · jiezi

关于istio:Rainbond-55-发布支持Istio和扩展第三方Service-Mesh框架

Rainbond 5.5 版本次要优化扩展性。服务治理模式能够扩大第三方 ServiceMesh 架构,兼容kubernetes 治理命令和第三方治理平台。 次要性能点解读:1. 反对 Istio,并反对扩大第三方 ServiceMesh 框架Rainbond 专一于无侵入,松耦合的设计理念。在以后版本中,Rainbond 引入了利用级治理模式的切换性能,实现了服务治理能力的动静切换,无需业务逻辑变更,为业务提供了不同的治理能力。能够通过利用级插件的模式扩大第三方 ServcieMesh 框架,比方 Istio、Linkerd、Dapr 等,本次咱们优先反对了Istio,用户能够通过 helm 装置 Istio 相干组件,实现利用治理模式的切换。从而享受到Istio相干的治理能力。如下图所示: 咱们心愿用户最终应用时,服务治理能力与业务逻辑是齐全解耦的,用户能够依据不同的业务应用不同的治理能力。能够依据本人的须要扩大不同的治理模式,后续咱们会有专门的文章来具体介绍如何扩大第三方 ServiceMesh 框架。 2. 兼容 kubernetes 治理命令和第三方治理平台在之前的版本中,咱们以利用为核心,使用户能够便捷的治理本人的业务。但通过Rainbond生成的名字空间、利用名和服务名应用 UUID,对相熟 Kubernetes 的人十分不敌对,在 Kubernetes 展现的 ID 无奈跟业务关联,就无奈应用 Kubernetes 命令或 Kubernetes 的第三方工具治理。因而咱们当初反对了集群内各类资源的重命名。用户能够自定义团队、利用、服务、组件、镜像的英文名,在Kubernetes 中会以英文名展现。 用户设置了利用的英文名为 rbd,别离设置了组件的英文名后,在集群生成的资源如下图所示。 具体变更点:新增性能【利用治理】反对Istio治理模式的切换;【利用治理】反对批改利用和组件的集群资源名;优化性能【组件治理】优化组件构建的镜像名称;【数据库】新版本集群数据库应用utf8mb4编码;【降级】优化利用降级时无变更组件不进行更新操作;【组件治理】优化组件首次设置衰弱检测的提醒;BUG 修复【组件治理】修复实例运行内存为0的问题;【网关】修复网关策略跳转页面谬误的问题;【利用治理】修复利用运行组件数展现谬误的问题;【利用治理】修复利用无奈失常回滚的问题;【插件治理】修复默认插件构建失败的问题;【利用治理】修复公布利用时,插件分享事件同步产生谬误的问题;【插件治理】修复装置插件不失效的问题;【组件治理】修复域名创立的第三方组件无奈通过外部依赖拜访的问题;【利用治理】修复TCP策略网关端口能够随便设置的问题;【降级】修复利用降级失败重试无响应的问题;【利用治理】修复helm利用状态展现谬误的问题;【降级】修复回滚性能不可用的问题;【组件治理】修复外部域名能够反复的问题;【插件】修复插件内存不限度时报错的问题;【降级】修复配置文件降级后无奈批改的问题;【组件治理】修复创立中组件无奈持续部署的问题;References Link[1] Rainbond 5.5装置[2] Rainbond 5.4降级到5.5[3] Istio管制立体装置 Rainbond 是一个开源的云原生利用治理平台,应用简略,不须要懂容器和Kubernetes,反对治理多个Kubernetes集群,提供企业级利用的全生命周期治理,性能包含利用开发环境、利用市场、微服务架构、利用继续交付、利用运维、利用级多云治理等。 Github:https://github.com/goodrain/r... 官网:https://www.rainbond.com?chan... 微信群:请搜寻增加群助手微信号 wylhzmyj 钉钉群:请搜寻群号 31096419

December 15, 2021 · 1 min · jiezi

关于istio:使用-Istioctl-安装-istio

应用 Istioctl 装置 istio 下载 Istio 转到 Istio 公布 页面,下载针对你操作系统的安装文件, 或用自动化工具下载并提取最新版本(Linux 或 macOS): [root@k8s-master-node1 ~]# curl -L https://istio.io/downloadIstio | sh -若无奈下载能够手动写入文件进行执行 脚本内容: #!/bin/sh# Copyright Istio Authors## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.## This file will be fetched as: curl -L https://git.io/getLatestIstio | sh -# so it should be pure bourne shell, not bash (and not reference other scripts)## The script fetches the latest Istio release candidate and untars it.# You can pass variables on the command line to download a specific version# or to override the processor architecture. For example, to download# Istio 1.6.8 for the x86_64 architecture,# run curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.6.8 TARGET_ARCH=x86_64 sh -.set -e# Determines the operating system.OS="$(uname)"if [ "x${OS}" = "xDarwin" ] ; then OSEXT="osx"else OSEXT="linux"fi# Determine the latest Istio version by version number ignoring alpha, beta, and rc versions.if [ "x${ISTIO_VERSION}" = "x" ] ; then ISTIO_VERSION="$(curl -sL https://github.com/istio/istio/releases | \ grep -o 'releases/[0-9]*.[0-9]*.[0-9]*/' | sort -V | \ tail -1 | awk -F'/' '{ print $2}')" ISTIO_VERSION="${ISTIO_VERSION##*/}"fiLOCAL_ARCH=$(uname -m)if [ "${TARGET_ARCH}" ]; then LOCAL_ARCH=${TARGET_ARCH}ficase "${LOCAL_ARCH}" in x86_64) ISTIO_ARCH=amd64 ;; armv8*) ISTIO_ARCH=arm64 ;; aarch64*) ISTIO_ARCH=arm64 ;; armv*) ISTIO_ARCH=armv7 ;; amd64|arm64) ISTIO_ARCH=${LOCAL_ARCH} ;; *) echo "This system's architecture, ${LOCAL_ARCH}, isn't supported" exit 1 ;;esacif [ "x${ISTIO_VERSION}" = "x" ] ; then printf "Unable to get latest Istio version. Set ISTIO_VERSION env var and re-run. For example: export ISTIO_VERSION=1.0.4" exit 1;fiNAME="istio-$ISTIO_VERSION"URL="https://github.com/istio/istio/releases/download/${ISTIO_VERSION}/istio-${ISTIO_VERSION}-${OSEXT}.tar.gz"ARCH_URL="https://github.com/istio/istio/releases/download/${ISTIO_VERSION}/istio-${ISTIO_VERSION}-${OSEXT}-${ISTIO_ARCH}.tar.gz"with_arch() { printf "\nDownloading %s from %s ...\n" "$NAME" "$ARCH_URL" if ! curl -o /dev/null -sIf "$ARCH_URL"; then printf "\n%s is not found, please specify a valid ISTIO_VERSION and TARGET_ARCH\n" "$ARCH_URL" exit 1 fi curl -fsLO "$ARCH_URL" filename="istio-${ISTIO_VERSION}-${OSEXT}-${ISTIO_ARCH}.tar.gz" tar -xzf "${filename}" rm "${filename}"}without_arch() { printf "\nDownloading %s from %s ..." "$NAME" "$URL" if ! curl -o /dev/null -sIf "$URL"; then printf "\n%s is not found, please specify a valid ISTIO_VERSION\n" "$URL" exit 1 fi curl -fsLO "$URL" filename="istio-${ISTIO_VERSION}-${OSEXT}.tar.gz" tar -xzf "${filename}" rm "${filename}"}# Istio 1.6 and above support arch# Istio 1.5 and below do not have arch supportARCH_SUPPORTED="1.6"if [ "${OS}" = "Linux" ] ; then # This checks if ISTIO_VERSION is less than ARCH_SUPPORTED (version-sort's before it) if [ "$(printf '%s\n%s' "${ARCH_SUPPORTED}" "${ISTIO_VERSION}" | sort -V | head -n 1)" = "${ISTIO_VERSION}" ]; then without_arch else with_arch fielif [ "x${OS}" = "xDarwin" ] ; then without_archelse printf "\n\n" printf "Unable to download Istio %s at this moment!\n" "$ISTIO_VERSION" printf "Please verify the version you are trying to download.\n\n" exit 1fiprintf ""printf "\nIstio %s Download Complete!\n" "$ISTIO_VERSION"printf "\n"printf "Istio has been successfully downloaded into the %s folder on your system.\n" "$NAME"printf "\n"BINDIR="$(cd "$NAME/bin" && pwd)"printf "Next Steps:\n"printf "See https://istio.io/latest/docs/setup/install/ to add Istio to your Kubernetes cluster.\n"printf "\n"printf "To configure the istioctl client tool for your workstation,\n"printf "add the %s directory to your environment path variable with:\n" "$BINDIR"printf "\t export PATH=\"\$PATH:%s\"\n" "$BINDIR"printf "\n"printf "Begin the Istio pre-installation check by running:\n"printf "\t istioctl x precheck \n"printf "\n"printf "Need more information? Visit https://istio.io/latest/docs/setup/install/ \n"[root@k8s-master-node1 ~]# bash istio.sh转到 Istio 包目录。例如,如果包是 istio-1.11.4: ...

November 10, 2021 · 5 min · jiezi

关于istio:基于-Istio-的全链路灰度方案探索和实践

作者|曾宇星(宇曾) 审核&校对:曾宇星(宇曾) 编辑&排版:雯燕 背景微服务软件架构下,业务新性能上线前搭建残缺的一套测试零碎进行验证是相当费人费时的事,随着所拆分出微服务数量的一直增大其难度也愈大。这一整套测试零碎所需付出的机器老本往往也不低,为了保障利用新版本上线前的性能正确性验证效率,这套零碎还必须始终独自保护好。当业务变得宏大且简单时,往往还得筹备多套,这是整个行业独特面临且难解的老本和效率挑战。如果能在同一套生产零碎中实现新版本上线前的性能验证的话,所节约的人力和财力是相当可观的。 除了开发阶段的性能验证,生产环境中引入灰度公布能力更好地管制新版本软件上线的危险和爆炸半径。灰度公布是将具备肯定特色或者比例的生产流量调配到须要被验证的服务版本中,以察看新版本上线后的运行状态是否合乎预期。 阿里云 ASM Pro(相干链接请见文末)基于 Service Mesh 所构建的全链路灰度计划,能很好帮忙解决以上两个场景的问题。 ASM Pro 产品性能架构图: 外围能力应用的就是上图扩大的流量打标和按标路由以及流量 Fallback 的能力,上面具体介绍阐明。 场景阐明全链路灰度公布的常见场景如下: 以 Bookinfo 为例,入口流量会带上冀望的 tag 分组,sidecar 通过获取申请上下文(Header 或 Context) 中的冀望 tag,将流量路由散发到对应 tag 分组,若对应 tag 分组不存在,默认会 fallback 路由到 base 分组,具体 fallback 策略可配置。接下来详细描述具体的实现细节。 入口流量的 tag 标签,个别是在网关层面基于相似 tag 插件的形式,将申请流量进行打标。 比方将 userid 处于肯定范畴的打上代表灰度的 tag,思考到理论环境网关的抉择和实现的多样性,网关这块实现不在本文探讨的范畴内。 上面咱们着重探讨基于 ASM Pro 如何做到全链路流量打标和实现全链路灰度。 实现原理 Inbound 是指申请发到 App 的入口流量,Outbond 是指 App 向外发动申请的进口流量。 上图是一个业务利用在开启 mesh 后典型流量门路:业务 App 接管到一个内部申请 p1,接着调用背地所依赖的另一个服务的接口。此时,申请的流量门路是 p1->p2->p3->p4,其中 p2 是 Sidecar 对 p1 的转发,p4 是 Sidecar 对 p3 的转发。为了实现全链路灰度,p3 和 p4 都须要获取到 p1 进来的流量标签,能力将申请路由到标签所对应的后端服务实例,且 p3 和 p4 也要带上同样的标签。关键在于,如何让标签的传递对于利用齐全无感,从而实现全链路的标签透传,这是全链路灰度的关键技术。ASM Pro 的实现是基于分布式链路追踪技术(比方,OpenTracing、OpenTelemetry 等)中的 traceId 来实现这一性能。 ...

November 7, 2021 · 3 min · jiezi

关于istio:istio关于开启gzip压缩

简介开始阶段咱们在kubernetes中应用ingress-nginx来提供http对外暴漏服务,因为服务网格的风行,开始将ingress切换了istio,通常只是应用了gateway和vs相干性能和一些网络鉴权性能,前期业务需要,须要http压缩性能,所以须要开启istio的gzip性能,经官网文档istio默认时没有开启压缩的性能,然而能够通过EnvoyFilter来对代理进行插件扩大。 环境kubernetes1.18版本istio 1.10.1版本。压缩计划gateway进行压缩,对此gateway下的http业务对立都进行压缩。sidecat压缩,对指定业务进行压缩。单个压缩apiVersion: networking.istio.io/v1alpha3kind: EnvoyFiltermetadata: name: gzipspec: workloadSelector: labels: app: productpage #抉择你要压缩的利用 configPatches: - applyTo: HTTP_FILTER #指定利用envoy配置中的补丁地位 match: context: SIDECAR_INBOUND #sidercar入站的路由监听集群 listener: filterChain: #匹配监听器中特定的过滤链 filter: #要利用补丁的特定过滤器的名称 name: envoy.filters.network.http_connection_manager #匹配的过滤器名称 subFilter: #匹配上级过滤器名称 name: envoy.filters.http.router patch: operation: INSERT_BEFORE #进行的操作 进行插入操作 value: ### 插入envoy配置 name: envoy.filters.http.compressor typed_config: '@type': type.googleapis.com/envoy.extensions.filters.http.compressor.v3.Compressor response_direction_config: common_config: content_type: - text/html - text/css - application/javascript disable_on_etag_header: true request_direction_config: common_config: enabled: default_value: false runtime_key: request_compressor_enabled compressor_library: name: text_optimized typed_config: '@type': type.googleapis.com/envoy.extensions.compression.gzip.compressor.v3.Gzip compression_level: BEST_COMPRESSION compression_strategy: DEFAULT_STRATEGY 网关压缩 kind: EnvoyFilter metadata: name: gzip namespace: istio-system spec: workloadSelector: labels: app: istio-ingressgateway configPatches: - applyTo: HTTP_FILTER match:- context: SIDECAR_INBOUND+ context: GATEWAY listener: filterChain: filter: name: envoy.filters.network.http_connection_manager #匹配的过滤器名称 subFilter: #匹配上级过滤器名称 name: envoy.filters.http.router patch: operation: INSERT_BEFORE #进行的操作 进行插入操作 value: ### 插入envoy配置 name: envoy.filters.http.compressor typed_config: '@type': type.googleapis.com/envoy.extensions.filters.http.compressor.v3.Compressor response_direction_config: common_config: content_type: - text/html - text/css - application/javascript disable_on_etag_header: true request_direction_config: common_config: enabled: default_value: false runtime_key: request_compressor_enabled compressor_library: name: text_optimized typed_config: '@type': type.googleapis.com/envoy.extensions.compression.gzip.compressor.v3.Gzip compression_level: BEST_COMPRESSION compression_strategy: DEFAULT_STRATEGY 参考文档https://www.envoyproxy.io/doc...https://istio.io/latest/docs/...

November 2, 2021 · 1 min · jiezi

关于istio:记一次-Istio-调优-Part-2-饥饿的线程与-SOREUSEPORT

图片来自:https://getboulder.com/boulde... 引话说,在很长一段时间,程序员依赖了摩尔定律。而在它到头之前,程序员找到了另一个救命稻草:并行/并发/最终统一。而到了明天,不是 Cloud Native / Micro Service 都不好意思打招呼了。多线程,更是 by default 的了。而在计算机性能工程界,也有一个词: Mechanical Sympathy,直译就是 机器同情心。而要“同情”的前提是,得理解。生存中,很多人理解和谋求work life balance。但你的线程,是否 balance 你要不要同情一下? 一条累到要过载线程,看到其它伙伴在吃下午茶,又是什么一种同情呢? 如何能力让多线程达到最大吞吐? 开始我的项目始终很关注服务响应工夫。而 Istio 的引入显著加大了服务提早,如何尽量减少提早始终是性能调优的重点。 测试环境Istio: v10.0 / Envoy v1.18 Linux Kernel: 5.3 调用拓扑: (Client Pod) --> (Server Pod)其中 Client Pod 构造: Cient(40 并发连贯) --> Envoy(默认 2 worker thread)其中 Server Pod 构造: Envoy(默认 2 worker thread) --> ServerClient/Serve 均为 Fortio(一个 Istio 性能测试工具)。协定应用 HTTP/1.1 keepalive 。 问题压测时,发现TPS压不下来,Client/Server/envoy 的整体 CPU 利用率不高。 首先,我关注的是 sidecar 上是不是有瓶颈。 ...

September 11, 2021 · 4 min · jiezi

关于istio:记一次-Istio-冲刺调优

为何要调优如果说,引入一个技术须要趣味和冲劲,那么,让这个技术上线须要的是保持和执着。 Cloud Native 如是, Istio 如是。在上线前的性能测试中,Istio 的应用提供了可察看性、运维上的便当,同时也引入了苦楚:减少了服务响应延时。如何让苦楚减到最低,成了当下之急。 体现:之前 9ms 的 SERVICE-A,当初要 14 ms 了。SERVICE-A 依赖于 SERVICE-B。 剖析之路脚下有两条路: 间接调整一些认为可疑的配置,禁用一些性能。再压测看后果。对 sidecar 做 cpu profile,定位可疑的中央。进行绝对有依据的调优我抉择了 2。 Sidecar CPU Profile(照肺)Istio 作为一个比拟成熟的开源产品,有其官网的 benchmark 我的项目: https://github.com/istio/tool...我参考了:https://github.com/istio/tool... 。 装置 perf在 container 中运行 linux 的 perf 工具来对 sidecar 作 profile。其中有一些难点,如 Istio-proxy container 默认全文件系统只读,我批改了为可写。须要以 root 身份进入 container。如果感觉麻烦,自行基于原 image 制作定制 Image 也可。具体方法不是本文重点,不说了。之后能够用包工具(如 apt)来装置 perf了。 这是一个 istio-proxy container 配置的例子: spec: containers: - name: istio-proxy image: xyz securityContext: allowPrivilegeEscalation: true capabilities: add: - ALL privileged: true readOnlyRootFilesystem: false runAsGroup: 1337 runAsNonRoot: false runAsUser: 1337执行 profile 、生成 Flame Graph以 root 身份进入 istio-proxy container(是的,root能够省点事) ...

September 11, 2021 · 3 min · jiezi

关于istio:Istio支持多集群源码剖析

在 Istio 1.8中多集群反对的演变 一文中,咱们介绍了4种Istio多集群部署模型,并且简略介绍了单网络 Primary-Remote部署模型的部署步骤。明天咱们通过对源码剖析,来介绍Istio如何反对多集群模式。 次要通过istioctl 命令 和 Pilot-discovery源码两局部来讲述,并且基于Istio1.8 版本。 Istioctl 命令Istioctl 提供了诸多对于多集群反对的命令。该代码位于 istioctl/pkg/multicluster门路下,蕴含了如下子命令: apply :基于网格拓扑更新多集群网格中的集群describe : 形容多集群网格的管制立体的状态generate:依据网格形容和运行时状态生成特定于集群的管制立体配置以上三个命令,大家能够-h,获取帮忙: $ istioctl x multicluster -hCommands to assist in managing a multi-cluster mesh [Deprecated, it will be removed in Istio 1.9]Usage: istioctl experimental multicluster [command]Aliases: multicluster, mcAvailable Commands: apply Update clusters in a multi-cluster mesh based on mesh topology describe Describe status of the multi-cluster mesh's control plane' generate generate a cluster-specific control plane configuration based on the mesh description and runtime stateFlags: -h, --help help for multiclusterGlobal Flags: --context string The name of the kubeconfig context to use -i, --istioNamespace string Istio system namespace (default "istio-system") -c, --kubeconfig string Kubernetes configuration file -n, --namespace string Config namespaceUse "istioctl experimental multicluster [command] --help" for more information about a command.create-remote-secret:创立具备凭据的secret,以容许Istio拜访近程Kubernetes apiserver。比方咱们在部署多集群模型中,肯定会执行如下的命令(此次演示近程集群名为 sgt-base-sg1-prod): ...

January 4, 2021 · 3 min · jiezi

关于istio:如何将部署在VM中的服务纳入Istio

Istio在设计之初,次要面向Kubernetes当中的服务。然而在理论场景中,仍旧有不少服务部署在VM上,Istio想成为Service Mesh事实上的规范,毫无疑问须要反对VM部署的服务。 Istio1.6 新增了 WorkloadEntry 自定义资源,通过该资源为VM提供了一流的反对。 Istio1.7 减少了平安疏导VM中运行的服务的身份的性能。最初,Istio 1.7减少了Sidecar的安装包,以反对CentOS/Red Hat和现有的Debian/Ubuntu。 Istio1.8 新增了智能 DNS 代理,它是由 Go 编写的 Istio sidecar 代理,sidecar 上的 Istio agent 将附带一个由 Istiod 动静编程的缓存 DNS 代理。来自应用程序的 DNS 查问会被 pod 或 VM 中的 Istio 代理通明地拦挡和服务,该代理会智能地响应 DNS 查问申请,能够实现虚拟机到服务网格的无缝多集群拜访。 并且Istio1.8新增了 WorkloadGroup 自定义资源,该资源是形容部署在VM上的服务实例的汇合,旨在模拟现有的用于Kubernetes工作负载的Sidecar注入和Deployment标准模型,以疏导Istio代理。 通过 WorkloadGroup形式, 实现VM 实例主动注册的性能目前处于pre-alpha状态WorkloadEntryWorkloadEntry用来形容非Pod的端点,将VM纳入mesh中。此时VM成为像Pod一样的一等公民,能够配置MUTUAL_TLS。 要创立一个WorkloadEntry并将其附加到ServiceEntry,执行以下操作: apiVersion: networking.istio.io/v1alpha3kind: WorkloadEntrymetadata: name: vm1 namespace: ns1spec: address: 1.1.1.1 labels: app: foo instance-id: vm-78ad2 class: vm---apiVersion: networking.istio.io/v1alpha3kind: ServiceEntrymetadata: name: svc1 namespace: ns1spec: hosts: - svc1.internal.com ports: - number: 80 name: http protocol: HTTP resolution: STATIC workloadSelector: labels: app: foo这将创立一个蕴含一组标签和地址的新WorkloadEntry,以及一个应用WorkloadSelector抉择带有所需标签的所有端点的ServiceEntry,在这种状况下,包含为VM创立的WorkloadEntry。 ...

January 4, 2021 · 1 min · jiezi

关于istio:Istio集成第三方服务注册中心的核心MCP

Istio 作为 Service Mesh 解决方案事实上的规范,解决了开发人员和运维人员所面临的从单体利用向散布式微服务架构转变的挑战。Istio 提供了对整个服务网格的行为洞察和操作控制的能力,以及一个残缺的满足微服务利用各种需要的解决方案。 然而Istio 对 Kubernetes 有着强依赖,整个服务注册发现都依赖Kubernetes 本身服务发现机制。然而在理论公司落地过程中,稍具规模的公司都会有本人的服务注册核心,比方Consul,Eureka 等。另外k8s service 负载平衡在大规模和大流量的情景下,也很难满足要求。所以Kubernetes 只是用来作为一种利用部署模式,和serverless,vm差不多。此时,Istio 想被宽泛采纳,必须反对集成第三方服务注册核心。 Istio 给出的解决方案是 Mesh Configuration Protocol (MCP)。只管特定的服务和原型定义不同,但MCP基于XDS并在概念上与之保持一致。 MCP是什么?MCP是基于订阅的配置散发API。配置消费者(即sink)申请更新来自配置生产者(即source)的资源汇合。增加,更新或删除资源时,source会将资源更新推送到sink。如果sink承受,则回复ACK,如果被回绝则是NACK,例如因为资源有效。一旦对先前的更新进行了ACK/NACK,则source能够推送其余更新。该source一次只能运行一次未实现的更新(每个汇合)。 MCP是一对双向流gRPC API服务(ResourceSource和ResourceSink)。 当source是服务器而sink是客户端时,将应用ResourceSource服务。默认状况下,Galley实现ResourceSource服务,并且Pilot连贯作为客户端。当source是客户端,而sink是服务器时,将应用ResourceSink服务。能够将Galley配置为可选地dial-out到近程配置sink,例如 Pilot位于另一个集群中,在该集群中,它不能作为客户端启动与Galley的连贯。在这种状况下,Pilot将实现ResourceSink服务,而Galley将作为客户端进行连贯。就音讯替换而言,ResourceSource和ResourceSink在语义上是等效的。惟一有意义的区别是谁启动连贯并关上grpc流。 在RequestResources申请和ACK响应中,次要有两个字段: collection:示意此次申请须要的数据类型,目前Istio定义了若干种类型,其中蕴含了serviceentries作为服务发现的数据等。nonce:相似于申请的ID,用来与响应或者申请进行匹配。而在返回的数据中,还有一个字段就是resources字段,外面蕴含真正的数据,具体的数据格式和collection的类型无关。 上面的示例显示sink接管到已胜利ACK的一系列更改。 同时MCP协定还定义了增量推送的能力,这里不做具体论述。 接下来让咱们看看如何实现一个MCP server。 MCP实现MCP为轻松集成内部零碎关上了大门。咱们能够本人实现一个MCP服务器,并将其和Istio集成起来。MCP服务器提供两个次要性能: 连贯并监督内部服务注册零碎以获取最新的服务信息(例如Spring Cloud中的Eureka Server和Apache Dubbo的Zookeeper)。将内部服务信息转换为Istio ServiceEntry并通过MCP资源公布。 Istio Galley实际上是MCP服务器的官网默认实现,这意味着咱们能够援用它并实现咱们本人的MCP服务器。关键点如下: 在MCP服务器中定义咱们要监督的资源汇合。为MCP服务器定义一个监督程序,该监督程序将动静设置MCP资源。定义其余服务器选项(例如,速率限度,AuthChecker等)。目前 istio 集成 consul 和 Eureka 的代码曾经被移除了,consul 和 Eureka 官网也没有具体MCP 实现。 社区中,nacos 通过 nacos-istio我的项目,实现了与istio的集成。consul 通过 consul-mcp 我的项目,也实现了与istio的集成。 如何在istio中配置MCP server?编辑istio 配置文件: kubectl edit cm istio -n istio-systemMCP 服务器 须要在Pilot 配置文件meshconfig里configSources字段配置,ConfigSources形容了用于网络的配置数据的起源规定和其余Istio配置工件。多个数据源能够针对单个管制立体进行配置,故configSources字段是一个对象ConfigSource数组。将此MCP服务器增加到configSource列表中:address: xds://x.x.x.x:18848ConfigSource 构造体如下: ...

December 3, 2020 · 1 min · jiezi

关于istio:使用CNI插件增强Istio服务网格安全性

为了使服务网格失常工作,Istio须要在网格中的每个Pod中注入一个Envoy代理,而后必须通过iptables规定操纵Pod的流量,从而应用程序进出站的流量劫持到Envoy代理。因为每个Pod的iptables规定都是网络命名空间级别的,因而更改不会影响节点上的其余Pod。 默认状况下,Istio应用名为istio-init的initContainer来创立必要的iptables规定,而后再启动Pod中的其余容器。这就要求网格中的Pod具足够的部署[NET_ADMIN容器](https://zhuanlan.zhihu.com/p/%3C/code%3Ehttps://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-capabilities-for-a-container)的 Kubernetes RBAC 权限。NET_ADMIN capabilities 是容许重新配置网络的内核性能。 通常,咱们要防止为应用程序Pod提供此 capabilities,因为Istio 用户权限的晋升,对于某些组织的平安政策来说,可能是难以承受的。 解决此问题的一种办法是应用CNI插件将iptables的规定配置从pod中移除。 CNI插件CNI,它的全称是 Container Network Interface,即容器网络的 API 接口。它是 K8s 中规范的一个调用网络实现的接口。Kubelet 通过这个规范的 API 来调用不同的网络插件以实现不同的网络配置形式,实现了这个接口的就是 CNI 插件,它实现了一系列的 CNI API 接口。常见的 CNI 插件包含 Calico、flannel、Terway、Weave Net 以及 Contiv。Istio CNI 插件会在 Kubernetes pod 生命周期的网络设置阶段实现 Istio 网格的 pod 流量转发设置工作,因而用户在部署 pods 到 Istio 网格中时,不再须要配置[NET_ADMIN](https://link.zhihu.com/?target=https%3A//istio.io/latest/zh/docs/ops/deployment/requirements/) capabilities了。 Istio CNI 插件代替了istio-init容器所实现的性能。 前提条件 装置反对 CNI 的 Kubernetes 集群,并且 kubelet 应用 --network-plugin=cni 参数启用 CNI 插件。AWS EKS、Azure AKS 和 IBM Cloud IKS 集群具备这一性能。Google Cloud GKE 集群须要启用网络策略性能,以让 Kubernetes 配置为 network-plugin=cni。OpenShift 默认启用了 CNI。Kubernetes 须要启用 ServiceAccount 准入控制器。Kubernetes 文档中强烈建议所有应用 ServiceAccounts 的 Kubernetes 装置实例都启用该控制器。装置 ...

November 29, 2020 · 1 min · jiezi

关于istio:Istio-18中多集群支持的演变

Istio 1.8 中对多集群的反对有所扭转。在之前的文章中,咱们介绍过Istio多集群两种部署模型。 Shared control plane 在此配置中,部署了一个Istio管制立体,并且运行在不同集群上的Pod通常间接进行间接通信(集群位于同一网络上时)。Istio管制立体正在与其余集群的Kubernetes API服务器通信,以发现它们上运行的工作负载。 Replicated control plane 在此配置中,在每个集群上部署了一个Istio管制立体,并且在不同集群上运行的Pod通过Istio Ingress网关进行通信。请留神,每个Istio管制立体仅与在同一集群上运行的Kubernetes API服务器通信。此配置是最受欢迎的配置,因为它提供了更高的可用性。 Istio 1.8 做了那些变更 ?通过官网文档,我能够总结出有以下4中部署模型: 同一网络立体的Multi-Primary 此配置相似于 Replicated control plane 配置,Istio管制立体能够发现其余集群上运行的工作负载(通过拜访近程Kubernetes API服务器)。然而因为在同一个网络立体,所以不同集群上运行的Pod能够间接通信。 不同网络立体的 Multi-Primary 此配置相似于 Replicated control plane 配置,Istio管制立体能够发现其余集群上运行的工作负载(通过拜访近程Kubernetes API服务器)。然而因为在不同的网络立体,所以不同集群上运行的Pod不能够间接通信,必须通过Gateway实现互联互通。 同一网络立体的 Primary-Remote 此配置与具备单个网络立体的 Shared control plane 配置雷同。 如上图所示,集群cluster1将在两个集群中拜访近程Kubernetes API服务器。这样,管制立体将可能为两个集群中的工作负载提供服务发现。不同集群上运行的Pod能够间接通信。 Cluster2中的服务将通过专用于东西向流量的网关达到cluster1中的管制立体。 不同网络立体的 Primary-Remote 此配置与具备多个网络立体的 Shared control plane 配置雷同。 如上图所示,Primary集群cluster1将拜访Remote集群的Kubernetes API服务器。这样,管制立体将可能为两个集群中的工作负载提供服务发现。然而因为在不同的网络立体,所以不同集群上运行的Pod不能够间接通信,必须通过Gateway实现互联互通。 通过咱们剖析,咱们发现其实并没有什么大的变动。只是一种演变。 Endpoint发现如何工作 ?查看Istio文档,咱们就会明确是通过创立近程集群的Kubeconfig,而后拜访近程集群的Kubernetes API服务器。 例如 Primary-Remote 部署模型,上面咱们就具体讲述一下。 1:配置cluster1 作为 primary集群,也就是管制集群 为cluster1创立istio配置文件: cat <<EOF > cluster1.yamlapiVersion: install.istio.io/v1alpha1kind: IstioOperatorspec: values: global: meshID: mesh1 multiCluster: clusterName: cluster1 network: network1EOF并将其利用到集群: ...

November 29, 2020 · 1 min · jiezi

关于istio:Banza-Cloud-重磅解读Istio-18

Istio 1.8刚刚公布,并且是迄今为止最好的Istio版本之一。新版本蕴含诸多乏味的试验性能,泛滥加强性能以及不举荐应用和删除的性能。然而,此版本的外围焦点是进步操作稳定性。在这篇文章中,咱们将回顾Istio 1.8的新增性能,并重点介绍降级到最新版本时须要留神的一些潜在问题。 Istio 1.8 变动 ︎留神:Istio 1.8.0发行版中的一些已知问题已在正式变更阐明中指出。在降级集群之前期待一些补丁程序公布,以确保解决了这些问题。首先,重要的是要指出Istio 1.8反对的Kubernetes版本是1.16、1.17、1.18和1.19。如果您的环境中正在运行Istio 1.7,则至多应该曾经在Kubernetes 1.16上(因为它也是Istio 1.7反对的最早的K8s版本)。因而,您应该筹备降级到Istio 1.8,而不用降级K8s集群。 影响比拟大的变更(在降级网格时可能导致问题): Inbound cluster name format 变更默认禁用 Protocol detection timeoutAuthorizationPolicy 新增了 remoteIpBlocks/notRemoteIpBlocks 字段默认强制 Trust Domain Validation移除/弃用: 齐全移除Mixeristioctl 不再反对装置 add-ons弃用 Istio CoreDNS Plugin弃用 Envoy filter names某些较小的变动,但比拟有用: Istiod 可能解决 gateway 证书EnvoyFilter 加强增加了调试存档选项其余值得注意的变动: Helm3 装置 Istio为Istio资源状态增加 generation 字段新增 Wasm Grafana dashboards当目标地址不可达时,正确标记指标无关更改的残缺列表,请参阅更改阐明。 重大影响变动 ︎Inbound 集群名格局变更 ︎之前,Envoy Inbound 集群名的格局相似于inbound|<service_port_number>|<service_port_name>|<service_hostname>。 例如:inbound|80|http|httpbin.default.svc.cluster.local。 从Istio1.8 开始,该格局曾经变更。服务端口名和服务的主机名当初被忽视了,新的格局相似于:inbound|<service_port_number>||。例如:inbound|80|| 。 当多个服务在同一Pod中抉择雷同的容器端口时会呈现问题。 官网的发行申明中提到:"对于大多数用户,这是一个实现细节,只会影响间接与Envoy配置进行交互的调试或工具。"。 好的,到目前为止,当有两个服务应用雷同的服务端口号并抉择同一个Pod,但它们目标端口号不同时,此更改会导致不可预期行为。 这是一个后端和前端容器位于同一Pod中的示例: apiVersion: v1kind: Servicemetadata: name: backyards-web namespace: backyards-systemspec: ports: - name: http port: 80 protocol: TCP targetPort: http-web selector: app.kubernetes.io/name: backyards type: ClusterIP---apiVersion: v1kind: Servicemetadata: name: backyards namespace: backyards-systemspec: ports: - name: http port: 80 protocol: TCP targetPort: http-app selector: app.kubernetes.io/name: backyards type: ClusterIP通过此设置,在应用上游docker.io/istio/pilot:1.8.0 docker镜像时,您会在istiod日志中看到以下正告: ...

November 27, 2020 · 2 min · jiezi

关于istio:使用Istio指标实现工作负载的弹性伸缩

可察看性是Istio4大个性之一。在 Istio可察看性--Metrcis篇 文中咱们讲到,Istio会为Istio服务网格内,外所有服务流量生成指标。这些度量规范提供无关行为的信息,例如总流量,流量中的错误率以及申请的响应工夫。 这些丰盛的指标信息,不仅能够精确形容服务行为和服务质量,而且能够用来作为工作负载弹性伸缩的规范参考。比方咱们能够依据qps,来对工作负载进行弹性伸缩。 部署 kube-metrcis-adaptorKube Metrics Adapter 是Kubernetes的通用指标适配器,能够收集和提供用于程度Pod主动缩放的自定义指标和内部指标。 它反对基于Prometheus度量规范,SQS队列和其余现成的扩大。它会发现Horizontal Pod Autoscaling资源,并开始收集申请的指标并将其存储在内存中。它是应用 custom-metrics-apiserver 库实现的。 咱们应用helm3部署,部署之前先下载 Kube Metrics Adapter 代码仓库,而后进入到chart门路下,执行上面的语句: helm -n kube-system install mesh ./kube-metrics-adapter --set prometheus.url=http://monitor-pod-agent.kube-admin.svc:9090NAME: meshLAST DEPLOYED: Fri Nov 20 18:38:40 2020NAMESPACE: kube-systemSTATUS: deployedREVISION: 1TEST SUITE: NoneNOTES:mesh-kube-metrics-adapter has been deployed.In a few minutes you should be able to list metrics using the following command: kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1Also if you enabled external metrics: kubectl get --raw /apis/external.metrics.k8s.io/v1beta1Wait till deployment is done by: kubectl -n kube-system rollout status deployment mesh-kube-metrics-adapter部署实现之后,咱们能够确定一下pod是否失常运行: ...

November 27, 2020 · 2 min · jiezi

关于istio:Istio流量管理

Istio的流量路由规定可让您轻松管制服务之间的流量和API调用。 Istio简化了诸如断路器,超时和重试之类的服务级别属性的配置,并使其易于设置重要工作(如A / B测试,canary部署和基于百分比的流量拆分的分段部署)。它还提供了开箱即用的故障复原性能,有助于使您的应用程序更弱小,以避免相干服务或网络的故障。 Istio整个流量管制模型,通过以下几个自定义资源实现: Virtual servicesDestination rulesGatewaysService entriesSidecars Gateway,ServiceEntry以及Sidecars咱们曾经在之前的文章中讲述过。本文重点讲述VirtualService和DestinationRule。 VirtualServiceVirtualService是Istio提供的自定义资源定义(CRD)。 VirtualService以及DestinationRule是Istio流量路由性能的要害组成部分。VirtualService使您能够在Istio和您的平台提供的根本连贯和发现的根底上,配置如何将申请路由到Istio服务网格中的服务。每个VirtualService由一组路由规定组成,这些路由规定按程序进行评估,从而使Istio将对VirtualService的每个给定申请匹配到网格内特定的理论目的地。 示例咱们接下来剖析一个最简略的VirtualService,如下: apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata: name: httpbinspec: hosts: - httpbin http: - route: - destination: host: httpbinhosts列出VirtualService的主机名--换句话说,这些路由规定实用于用户可寻址的目的地。这是客户端向服务发送申请时应用的地址。 VirtualService主机名能够是IP地址,DNS名称,也能够是短名称(例如Kubernetes服务短名称),具体取决于平台,该名称隐式或显式地解析为齐全限定的域名(FQDN)。而后,咱们通过配置http属性来创立规定来定向与指定主机名匹配的所有HTTP通信。在该属性下,咱们将destination设置为另一个称为httpbin的Service资源的路由规定。 通过这个简略的示例,咱们能够看出,VirtualService 由主机名和路由规定组成。 VirtualService资源除了路由匹配,并提供许多附加性能来治理流量。 路由匹配VirtualService资源能够依据HTTP主机,门路(具备残缺的正则表达式反对),办法,Header,端口,查问参数等来匹配流量。 例如: apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata: name: bookinfospec: hosts: - bookinfo.com http: - match: - uri: prefix: /reviews route: - destination: host: reviews - match: - uri: prefix: /ratings route: - destination: host: ratings流量治理此外VirtualService资源能够通过容许重试申请,注入谬误或测试提早,重写或重定向申请来智能地治理其匹配的流量。在根底结构层中实现此性能打消了每个独自的应用程序本人实现和治理它的需要,从而提供了更加统一的网络体验。 ...

November 15, 2020 · 2 min · jiezi

关于istio:Istio中访问外部服务

默认状况下,来自启用Istio的Pod的所有出站流量都会重定向到其Sidecar代理,因而集群内部URL的可拜访性取决于代理的配置。网格中的工作负载想要拜访网分外的服务时,有以下三种办法: 容许Envoy代理将申请透传到未在网格外部配置的服务。配置 ServiceEntries 以提供对外部服务的受控拜访。对于特定范畴的IP,齐全绕过Envoy代理。默认Istio将Envoy代理配置为透传对未知服务的申请,这简化了利用程序开发以及现有应用程序到网格的迁徙。 第2种办法,应用Istio ServiceEntry配置,您能够从Istio集群中拜访任何可公开拜访的服务。而且不失落Istio的流量监督和管制性能。该办法也是本文次要讲述的办法。 对于第三种办法,通过global.proxy.includeIPRanges配置。对于一些对性能要求比拟高的利用能够抉择应用,然而须要保障IP范畴在一个可信的环境下。 代理出站流量策略模式Istio有一个装置选项meshConfig.outboundTrafficPolicy.mode,用于配置对外部服务(即Istio外部服务注册表中未定义的那些服务)的解决形式。如果此选项设置为ALLOW_ANY,则Istio代理将容许对未知服务的调用。如果该选项设置为REGISTRY_ONLY,则Istio代理将阻止在网格中未定义HTTP服务或ServiceEntry的任何主机。 默认状况下,ALLOW_ANY为该配置项的默认值。 ServiceEntryServiceEntry是扩大Istio服务注册表的一种形式,以便现有的主动发现的服务能够拜访其余服务,无论它们是未发现的外部服务还是齐全在网格内部的服务(例如,Web API)。 通过配置ServiceEntry,您能够治理在网格内部运行的服务的流量,包含以下性能: 重定向和转发用于内部指标的流量,例如从网络应用的API或到旧根底构造中服务的流量。为内部指标定义重试,超时和故障注入策略。通过将虚拟机增加到网格中,在虚拟机(VM)中运行网格服务。在逻辑上将来自其余集群的服务增加到网格,以在Kubernetes上配置多集群Istio网格。以下示例形容了外部应用程序应用DNS通过主机名解析通过HTTP拜访的内部API。 apiVersion: networking.istio.io/v1alpha3kind: ServiceEntrymetadata: name: httpbin.org namespace: foospec: hosts: - httpbin.org - www.httpbin.org ports: - number: 80 name: http protocol: HTTP exportTo: - "." resolution: DNS location: MESH_EXTERNAL咱们对该配置逐个字段解析: hosts:DNS名称。能够具备通配符前缀。ports:关联的端口。ports.protocol: 以下之一:HTTP,HTTPS,HTTP2,GRPC,MONGO,TCP或TLS。exportTo:默认状况下应用“*”,这意味着该ServiceEntry公开给每个命名空间。 “.”仅将其限度为以后命名空间。目前,exportTo值仅限于这两个。resolution:主机的服务发现模式location:从网格的角度来看,应将此服务视为外部或内部服务。这里的字段并不是ServiceEntry反对的所有字段,更多请查看官网文档。 Demo该demo咱们不仅仅是演示如何通过ServiceEntry拜访内部服务,而且是演示如何对外部服务定义注入超时等策略。 1: 部署之前先部署咱们的sleep pod,作为网格内的工作负载。因为咱们在之前的文章中曾经部署实现,所以这里略过。 kubectl get pods -n fooNAME READY STATUS RESTARTS AGEhttpbin-779c54bf49-dqmgm 2/2 Running 0 27hsleep-d6b58ff57-jl8pq 2/2 Running 0 27h2: 将下面示例ServiceEntry利用到集群中。 ...

November 15, 2020 · 1 min · jiezi

关于istio:详解Istio-mTLS

Istio提供双向TLS作为服务到服务身份验证的解决方案。 双向认证是指单方同时进行认证,这是某些协定的默认认证形式。以前称为“互相实体认证” ,因为两个或多个实体在传输任何数据或信息之前会验证对方的合法性。上面是istio服务之间mTLS流: 客户端应用程序容器将纯文本HTTP申请发送到服务器。客户端代理容器拦挡出站申请。客户端代理与服务器端代理执行TLS握手。此握手包含证书替换。这些证书由Istio预加载到代理容器中。客户端代理对服务器的证书执行平安命名查看,以验证受权身份正在运行服务器。客户端和服务器建设互相TLS连贯,服务器代理将申请转发到服务器应用程序容器。实现细节从Istio 1.5开始,Istio应用主动双向TLS。这意味着,只管服务同时承受纯文本和TLS通信,但默认状况下,服务将在集群内发送TLS申请。 与其余Istio配置一样,您能够在.yaml文件中指定身份验证策略。您应用kubectl部署策略。以下示例身份验证策略指定带有app: reviews标签的工作负载的传输身份验证必须应用双向TLS: apiVersion: "security.istio.io/v1beta1"kind: "PeerAuthentication"metadata: name: "example-peer-policy" namespace: "foo"spec: selector: matchLabels: app: reviews mtls: mode: STRICT作用域在Istio中,能够通过三个粒度级别定义mTLS设置。对于每种服务,Istio都会利用最窄的匹配策略。程序为:服务特定,命名空间范畴,网格范畴。 网格范畴:为根名称空间指定的策略,不带有或带有空的选择器字段。命名空间范畴:为没有或没有空选择器字段的非根名称空间指定的策略。服务特定:在惯例名称空间中定义的策略,带有非空选择器字段。例如咱们下面的示例就是一个服务特定的策略。 每个命名空间只能有一个网格范畴的对等身份验证策略,并且只能有一个命名空间范畴的对等身份验证策略。当您为同一网格或名称空间配置多个网格范畴或命名空间范畴的对等身份验证策略时,Istio会疏忽较新的策略。当多个特定于工作负载的对等身份验证策略匹配时,Istio将抉择最旧的策略。模式对等身份验证策略指定Istio对指标工作负载施行的双向TLS模式。反对以下模式: PERMISSIVE:工作负载承受双向TLS和纯文本流量。当没有Sidecar的工作负载无奈应用双向TLS时,此模式在迁徙过程中最有用。通过应用sidecar注入迁徙工作负载后,您应该将模式切换为STRICT。STRICT:工作负载仅承受双向TLS通信。、DISABLE:互相TLS已禁用。从平安角度来看,除非您提供本人的平安解决方案,否则不应应用此模式。勾销设置模式时,将继承父作用域的模式。缺省状况下,未设置模式的网格范畴对等身份验证策略应用PERMISSIVE模式。 此时,您能够在Istio中将任何服务设置为任何mTLS模式。然而,让咱们看一下In mesh(从网格内)或out of mesh(网分外)调用服务时每种模式会产生什么状况? In mesh 示意Sidecar代理在应用程序容器旁边运行。Out of mesh意味着没有Sidecar容器。总结的表格如下: PERMISSIVE 在网格内应用mTLS,在网分外应用纯文本连贯STRICT 在网格内应用mTLS,但回绝来自网分外的连贯DISABLED 在网格内外都应用纯文本连贯Demo该demo,咱们会创立两个服务,别离查看未启用和启用对等身份验证策略的服务拜访状况。 首先部署demo中须要的资源等: kubectl create ns fookubectl label namespace foo istio-injection=enabledkubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.7/samples/httpbin/httpbin.yaml -n fookubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.7/samples/sleep/sleep.yaml -n foosleep 应用程序是咱们本次demo的客户端。httpbin 应用程序是咱们本次demo的服务端。 咱们查看一下拜访状况,exec 到 sleep pod,而后对 httpbin pod 执行 curl: ...

November 15, 2020 · 1 min · jiezi

关于istio:如何通过Sidecar自定义资源减少Istio代理资源消耗

在Istio体系中,数据立体次要组件是istio proxy(envoy),对于istio proxy,有两个问题咱们比拟关注: 申请提早资源耗费对于申请提早咱们很好了解,毕竟咱们的业务在mesh中,多了一层代理。 明天咱们次要讲述Istio代理的资源耗费以及如何应用新的Sidecar自定义资源来缩小耗费。 Sidecar 自定义资源与 VirtualService 和 DestinationRule 这些罕用资源不同,Sidecar 资源并不是被所有人熟知。 Sidecar形容了sidecar代理的配置,其可协调与其连贯的工作负载实例的入站和出站通信。默认状况下,Istio将应用达到网格中每个工作负载实例所需的必要配置对网格中的所有sidecar代理进行编程,并在与工作负载相干的所有端口上承受流量。 Sidecar配置提供了一种微调端口集的性能,代理在将流量转发到工作负载或从工作负载转发流量时代理将承受的协定。此外,当转发来自工作负载实例的出站流量时,能够限度代理能够拜访的服务集。 每个命名空间只能具备一个Sidecar配置,而没有任何工作负载选择器,该负载指定该命名空间中所有Pod的默认值。对于命名空间范畴的sidecar,倡议应用默认名称。如果给定命名空间中存在多个不应用选择器的Sidecar配置,则零碎的行为是不确定的。如果两个或多个带有工作负载选择器的Sidecar配置抉择雷同的工作负载实例,则零碎的行为是不确定的。默认状况下,MeshConfig根名称空间中的Sidecar配置将利用于所有没有Sidecar配置的命名空间。此全局默认Sidecar配置不应具备任何工作负载选择器。接下来咱们通过一些官网示例去更好地了解。 上面的示例在根命名空间中申明了全局默认的Sidecar配置default,该配置在所有命名空间中配置了sidecar,以仅容许将流量发送到同一命名空间中的其余工作负载以及istio-system命名空间中的服务。 apiVersion: networking.istio.io/v1beta1kind: Sidecarmetadata: name: default namespace: istio-configspec: egress: - hosts: - "./*" - "istio-system/*"上面的示例在prod-us1命名空间中申明Sidecar配置,该配置将笼罩下面定义的全局默认值,并在命名空间中配置sidecar,以容许拜访prod-us1,prod-apis和istio-system命名空间中的服务。 apiVersion: networking.istio.io/v1beta1kind: Sidecarmetadata: name: default namespace: prod-us1spec: egress: - hosts: - "prod-us1/*" - "prod-apis/*" - "istio-system/*"以下示例在prod-us1命名空间中为所有带有标签app: ratings的pod申明Sidecar配置,这些pod属于rating.prod-us1服务。工作负载在端口9080上承受入站HTTP通信。而后,将通信转发到侦听Unix域套接字的附加工作负载实例。在出站方向上,除了istio-system命名空间外,sidecar仅代理绑定到端口9080的prod-us1命名空间中的服务的HTTP通信。 apiVersion: networking.istio.io/v1beta1kind: Sidecarmetadata: name: ratings namespace: prod-us1spec: workloadSelector: labels: app: ratings ingress: - port: number: 9080 protocol: HTTP name: somename defaultEndpoint: unix:///var/run/someuds.sock egress: - port: number: 9080 protocol: HTTP name: egresshttp hosts: - "prod-us1/*" - hosts: - "istio-system/*"Sidecar 形容蕴含以下4局部: ...

November 8, 2020 · 1 min · jiezi

关于istio:解析Istio访问控制

Istio是一种具备流量治理,安全性,可察看性,可扩大的服务网格解决方案。那么Istio的受权模型是什么?其如何实现对网格中的工作负载进行访问控制的? 实现架构在Istio中,Envoy代理是“受权引擎”,因为它蕴含用于确定是否必须回绝或容许一个申请的所有策略。因为间接从代理进行决策,因而Istio中的受权速度十分快。代理应用AuthorizationPolicy自定义资源进行配置,当你将其利用于集群时,该资源将由Istiod获取并配置指标工作负载的服务代理。 AuthorizationPolicy作用域 AuthorizationPolicy的作用域能够是mesh,命名空间和工作负载范畴的,具体取决于命名空间和spec/selector字段。 如果AuthorizationPolicy处于istio root 命名空间(通常是istio-system),并且没有selector字段,那么该策略的作用域是mesh级别,即该规定将在所有命名空间的网格范畴内强制执行。 如果AuthorizationPolicy处于非istio root 命名空间,并且没有selector字段,那么该策略的作用域是命名空间级别,即该规定将对该命名空间内的所有工作负载起作用。 如果AuthorizationPolicy处于非istio root 命名空间,并且蕴含selector字段,那么该策略的作用域是工作负载级别,即该规定将对该命名空间内的对应工作负载起作用。 动作 策略反对ALLOW和DENY动作。 当ALLOW和DENY动作同时用于工作负载时,将首先评估DENY策略。评估由以下规定确定: 如果有任何与申请匹配的DENY策略,回绝该申请。如果没有针对工作负载的ALLOW策略,则容许该申请。如果任何ALLOW策略与申请匹配,则容许该申请。拒绝请求。Rules AuthorizationPolicy蕴含规定列表,这些规定形容匹配的申请,而后依据操作容许或回绝哪些申请。规定由三局部组成:from,to和when。 from -- 指定申请的起源。如果未设置,则容许任何起源。to -- 指定申请的操作。如果未设置,则容许任何操作。when -- 指定申请的其余条件列表。如果未设置,则容许任何条件。示例首先咱们从一个典型的AuthorizationPolicy加深对三大因素的了解。 apiVersion: security.istio.io/v1beta1kind: AuthorizationPolicymetadata: name: httpbin namespace: foospec: action: ALLOW rules: - from: - source: principals: ["cluster.local/ns/default/sa/sleep"] - source: namespaces: ["test"] to: - operation: methods: ["GET"] paths: ["/info*"] - operation: methods: ["POST"] paths: ["/data"] when: - key: request.auth.claims[iss] values: ["https://accounts.google.com"]该示例,httpbin受权策略,位于foo命名空间, 并且没有selector,那么其是命名空间级别的受权策略,其作用于foo命名空间下所有工作负载。 ...

November 8, 2020 · 1 min · jiezi

关于istio:Istio流量管理Ingress-Gateway

传统上,Kubernetes应用Ingress控制器来解决从内部进入集群的流量。应用Istio时,状况不再如此。 Istio已用新的Gateway和VirtualServices资源替换了相熟的Ingress资源。它们协同工作,将流量路由到网格中。在网格外部,不须要Gateway,因为服务能够通过集群本地服务名称互相拜访。 正如我之前文章介绍过的,kubernetes提供的Ingress过于简略,裸露进去的属性表白性太弱。当然社区也意识到了这个问题,从kubernetes1.19 版本,在逐渐补全性能。Istio解决方案中,本人实现了Istio gateway。在非istio场景外,gloo,ambasaador ,contour等网关 能够满足咱们生产环境的需要。部署咱们看下社区默认的部署。 通过Deployment治理的一组istio-ingressgateway Pod。 IngressGateway,这是Envoy代理的封装。它的配置形式与服务网格中应用的Sidecar雷同。当咱们创立或更改Gateway或VirtualService时,Istio Pilot控制器会检测到更改,该控制器会将这些信息转换为Envoy配置并将其发送到相干代理,包含IngressGateway外部的Envoy。 apiVersion: apps/v1kind: Deploymentmetadata: labels: app: istio-ingressgateway istio: ingressgateway release: istio name: istio-ingressgateway namespace: istio-systemspec: selector: matchLabels: app: istio-ingressgateway istio: ingressgateway strategy: rollingUpdate: maxSurge: 100% maxUnavailable: 25% template: metadata: annotations: prometheus.io/path: /stats/prometheus prometheus.io/port: "15090" prometheus.io/scrape: "true" sidecar.istio.io/inject: "false" labels: app: istio-ingressgateway chart: gateways heritage: Tiller istio: ingressgateway release: istio service.istio.io/canonical-name: istio-ingressgateway service.istio.io/canonical-revision: latest spec: affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - preference: matchExpressions: - key: kubernetes.io/arch operator: In values: - amd64 weight: 2 - preference: matchExpressions: - key: kubernetes.io/arch operator: In values: - ppc64le weight: 2 - preference: matchExpressions: - key: kubernetes.io/arch operator: In values: - s390x weight: 2 requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/arch operator: In values: - amd64 - ppc64le - s390x containers: - args: - proxy - router - --domain - $(POD_NAMESPACE).svc.cluster.local - --proxyLogLevel=warning - --proxyComponentLogLevel=misc:error - --log_output_level=default:info - --serviceCluster - istio-ingressgateway - --trust-domain=cluster.local env: - name: JWT_POLICY value: third-party-jwt - name: PILOT_CERT_PROVIDER value: istiod - name: CA_ADDR value: istiod.istio-system.svc:15012 - name: NODE_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName - name: POD_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace - name: INSTANCE_IP valueFrom: fieldRef: apiVersion: v1 fieldPath: status.podIP - name: HOST_IP valueFrom: fieldRef: apiVersion: v1 fieldPath: status.hostIP - name: SERVICE_ACCOUNT valueFrom: fieldRef: fieldPath: spec.serviceAccountName - name: CANONICAL_SERVICE valueFrom: fieldRef: fieldPath: metadata.labels['service.istio.io/canonical-name'] - name: CANONICAL_REVISION valueFrom: fieldRef: fieldPath: metadata.labels['service.istio.io/canonical-revision'] - name: ISTIO_META_WORKLOAD_NAME value: istio-ingressgateway - name: ISTIO_META_OWNER value: kubernetes://apis/apps/v1/namespaces/istio-system/deployments/istio-ingressgateway - name: ISTIO_META_MESH_ID value: cluster.local - name: ISTIO_META_ROUTER_MODE value: sni-dnat - name: ISTIO_META_CLUSTER_ID value: Kubernetes image: docker.io/istio/proxyv2:1.7.3 name: istio-proxy ports: - containerPort: 15021 - containerPort: 8080 - containerPort: 8443 - containerPort: 15443 - containerPort: 15090 name: http-envoy-prom protocol: TCP readinessProbe: failureThreshold: 30 httpGet: path: /healthz/ready port: 15021 scheme: HTTP initialDelaySeconds: 1 periodSeconds: 2 successThreshold: 1 timeoutSeconds: 1 resources: limits: cpu: 2000m memory: 1024Mi requests: cpu: 100m memory: 128Mi securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL privileged: false readOnlyRootFilesystem: true volumeMounts: - mountPath: /etc/istio/proxy name: istio-envoy - mountPath: /etc/istio/config name: config-volume - mountPath: /var/run/secrets/istio name: istiod-ca-cert - mountPath: /var/run/secrets/tokens name: istio-token readOnly: true - mountPath: /var/run/ingress_gateway name: gatewaysdsudspath - mountPath: /etc/istio/pod name: podinfo - mountPath: /etc/istio/ingressgateway-certs name: ingressgateway-certs readOnly: true - mountPath: /etc/istio/ingressgateway-ca-certs name: ingressgateway-ca-certs readOnly: true securityContext: fsGroup: 1337 runAsGroup: 1337 runAsNonRoot: true runAsUser: 1337 serviceAccountName: istio-ingressgateway-service-account volumes: - configMap: name: istio-ca-root-cert name: istiod-ca-cert - downwardAPI: items: - fieldRef: fieldPath: metadata.labels path: labels - fieldRef: fieldPath: metadata.annotations path: annotations name: podinfo - emptyDir: {} name: istio-envoy - emptyDir: {} name: gatewaysdsudspath - name: istio-token projected: sources: - serviceAccountToken: audience: istio-ca expirationSeconds: 43200 path: istio-token - configMap: name: istio optional: true name: config-volume - name: ingressgateway-certs secret: optional: true secretName: istio-ingressgateway-certs - name: ingressgateway-ca-certs secret: optional: true secretName: istio-ingressgateway-ca-certs咱们在IngressGateway部署中必须关怀的是SSL证书。为了可能拜访gateway资源中的证书,请确保已正确装置了证书。 ...

November 8, 2020 · 4 min · jiezi

关于istio:Istio安全性

Istio Security提供了全面的平安解决方案。 Istio平安性能提供弱小的身份,弱小的策略,通明的TLS加密以及身份验证,受权和审核(AAA)工具,以爱护您的服务和数据。 Istio安全性的指标是: 默认状况下的安全性:无需更改利用程序代码和根底构造深度进攻:与现有平安系统集成以提供多层进攻零信赖网络:在不受信赖的网络上构建平安解决方案架构Istio中的平安波及多个组件: 证书颁发机构(CA),用于密钥和证书治理配置API服务器分发给代理:认证策略受权策略平安命名信息Sidecar和边界代理充当策略执行点(PEP),以爱护客户端和服务器之间的通信。一组Envoy代理扩大,用于治理遥测和审计管制立体解决来自API服务器的配置,并在数据立体中配置PEP。 PEP是应用Envoy实现的。下图显示了体系结构。 身份身份是任何平安根底构造的基本概念。在工作负载到工作负载的通信开始时,单方必须替换凭据与其身份信息以进行互相认证。在客户端,将依据平安命名信息查看服务器的身份,以查看其是否是工作负载的受权运行者。在服务器端,服务器能够依据受权策略确定客户端能够拜访哪些信息,审核谁在什么工夫拜访了哪些信息,依据他们应用的工作负载向客户端免费,并回绝任何未能领取账单的客户端拜访工作量。Istio身份模型应用一等的service identity来确定申请起源的身份。该模型为服务标识提供了极大的灵活性和粒度,以代表用户,单个工作负荷或一组工作负荷。在没有服务身份的平台上,Istio能够应用其余能够对工作负载实例进行分组的身份,例如服务名称。以下列表显示了能够在不同平台上应用的服务身份的示例: Kubernetes:Kubernetes服务帐户GKE / GCE:GCP服务帐户GCP:GCP服务帐户AWS:AWS IAM用户/角色帐户本地(非Kubernetes)用户帐户,自定义服务帐户,服务名称,Istio服务帐户或GCP服务帐户。自定义服务帐户是指现有服务帐户,就像客户的身份目录治理的身份一样。证书治理Istio应用X.509证书为每个工作负载平安地设置强身份。与每个Envoy代理一起运行的Istio-agent与istiod一起工作,以主动实现密钥和证书的大规模轮换。下图显示了身份提供流程。 Istio应用以下流程通过secret discovery service (SDS)设置身份: Istiod提供了一个gRPC服务来承受证书签名申请(CSR)。Envoy通过Envoy SDS API发送证书和密钥申请。收到SDS申请后,Istio agent会先创立私钥和CSR,而后再将CSR及其凭据发送给isidod进行签名。CA验证CSR中携带的凭据,并对CSR签名以生成证书。Istio agent通过Envoy SDS API将来自istiod的证书和私钥发送给Envoy。对于证书和密钥轮换,上述CSR过程会定期执行。认证Istio提供了两种认证类型: 对等身份验证: 用于服务到服务的身份验证,以验证建设连贯的客户端。 Istio提供双向TLS作为用于传输身份验证的残缺堆栈解决方案,无需更改服务代码即可启用它。 该解决方案为:为每个服务提供一个弱小的标识,以示意其角色,以实现跨集群和云的互操作性。使服务到服务的通信安全。提供密钥管理系统以主动执行密钥和证书的生成,散发和轮换。申请认证: 用于最终用户身份验证,以验证附加到申请的凭据。 Istio应用JSON Web令牌(JWT)验证启用申请级身份验证,能够应用自定义身份验证程序或任何OpenID Connect实现程序, 例如:ORY HydraKeycloakAuth0Firebase AuthGoogle Auth在所有状况下,Istio都会通过自定义的Kubernetes API将身份验证策略存储在Istio config store中。 Istiod会为每个代理放弃最新状态,并在适当的中央提供密钥。此外,Istio反对许可模式下的身份验证,以帮忙您理解策略更改在施行之前如何影响您的平安情况。 mTLS认证Istio通过客户端和服务器端PEP(Envoy代理实现)建设服务到服务的通信通道。当工作负载应用双向TLS身份验证将申请发送到另一个工作负载时,该申请的解决形式如下: Istio将来自客户端的出站流量从新路由到客户端的本地Sidecar Envoy。客户端Envoy与服务器端Envoy开始互相TLS握手。在握手期间,客户端Envoy还会进行平安的命名查看,以验证服务器证书中提供的服务帐户是否有权运行指标服务。客户端Envoy和服务器端Envoy建设了双向TLS连贯,Istio将流量从客户端Envoy转发到服务器端Envoy。受权后,服务器端Envoy通过本地TCP连贯将流量转发到服务器服务。许可模式 Istio双向TLS具备容许模式,该模式容许服务同时承受纯文本流量和双向TLS流量。此性能极大地改善了双向TLS的启用体验。 当非Istio客户端与非Istio服务器通信时,当服务器筹备启用mTLS的时候,这对运维来说,存在很大的问题。通常,运维无奈同时为所有客户端装置Istio Sidecar,甚至没有权限在某些客户端上装置。即便在服务器上安装了Istio Sidecar之后,运维也无奈在不中断现有通信的状况下启用双向TLS。 启用许可模式后,服务器将承受纯文本和双向TLS流量。该模式为启用过程提供了更大的灵活性。服务器装置的Istio Sidecar能够立刻进行双向TLS流量,而不会毁坏现有的纯文本流量。因而,运维能够逐渐装置和配置客户端的Istio Sidecar,以发送双向的TLS流量。一旦实现客户端的配置,运维就能够将服务器配置为仅TLS双向模式。无关更多信息,请拜访“双向TLS迁徙”教程。 平安命名 服务器身份以证书编码,然而通过发现服务或DNS检索服务名称。平安命名信息将服务器身份映射到服务名称。身份A到服务名称B的映射意味着“ A被受权运行服务B”。管制立体监督apiserver,生成平安的命名映射,并将其平安地散发到PEP。以下示例阐明了为什么平安命名对于身份验证至关重要。假如运行服务数据存储的非法服务器仅应用团队外部身份。歹意用户领有测试团队身份的证书和密钥。歹意用户打算模仿服务以查看从客户端发送的数据。歹意用户应用证书和测试团队身份的密钥来部署伪造的服务器。假如歹意用户胜利劫持(通过DNS坑骗,BGP /路由劫持,ARP坑骗等)发送到数据存储区的流量并将其重定向到伪造的服务器。客户端调用数据存储服务时,它会从服务器的证书中提取测试团队身份,并查看是否容许测试团队运行带有平安命名信息的数据存储。客户端检测到不容许测试团队运行数据存储服务,并且身份验证失败。平安命名可能避免HTTPS流量受到个别网络劫持。它还能够爱护TCP通信免受个别网络劫持。然而,平安命名无奈避免DNS坑骗,因为在这种状况下,攻击者会劫持DNS并批改指标IP地址。这是因为TCP流量不蕴含主机名信息,咱们只能依附IP地址进行路由。实际上,此DNS劫持甚至可能在客户端Envoy 认证架构您能够应用对等和申请身份验证策略为在Istio网格中接管申请的工作负载指定身份验证要求。网格运维应用.yaml文件来指定策略。部署后,策略将保留在Istio配置存储中。 Istio控制器监督配置存储。在任何策略更改后,新策略都会转换为适当的配置,通知PEP如何执行所需的身份验证机制。管制立体能够获取公共密钥,并将其附加到配置中以进行JWT验证。另外,Istiod提供了由Istio系统管理的密钥和证书的门路,并将它们装置到应用程序容器中以实现互相TLS。Istio将配置异步发送到指标端点。代理收到配置后,新的身份验证要求将立刻在该容器上失效。客户端服务(发送申请的客户端服务)负责遵循必要的身份验证机制。对于申请认证,应用程序负责获取JWT凭证并将其附加到申请。对于对等身份验证,Istio会主动将两个PEP之间的所有流量降级到互相TLS。如果身份验证策略禁用了双向TLS模式,则Istio将持续在PEP之间应用纯文本。要笼罩此行为,请应用指标规定明确禁用双向TLS模式。 认证策略本节提供无关Istio身份验证策略如何工作的更多详细信息。联合后面的架构局部,身份验证策略实用于服务收到的申请。要在双向TLS中指定客户端身份验证规定,您须要在DestinationRule中指定TLSSettings。与其余Istio配置一样,您能够在.yaml文件中指定身份验证策略。您应用kubectl部署策略。以下示例身份验证策略指定带有app:reviews标签的工作负载的传输身份验证必须应用双向TLS: apiVersion: "security.istio.io/v1beta1"kind: "PeerAuthentication"metadata: name: "example-peer-policy" namespace: "foo"spec: selector: matchLabels: app: reviews mtls: mode: STRICT策略存储 ...

November 7, 2020 · 3 min · jiezi

关于istio:Istio之Sidecar注入

为了利用Istio的所有性能,网格中的Pod必须运行Istio Sidecar代理。上面介绍了两种将Istio Sidecar注入到容器中的办法:手动应用istioctl命令或通过在容器的命名空间中启用主动Istio Sidecar注入。 手动注入间接批改配置(如部署),并将代理配置注入其中。在Pod的命名空间中启用后,主动注入会应用准入控制器在Pod创立时注入代理配置。手动注入要手动注入部署,请应用istioctl kube-inject: istioctl kube-inject -f samples/sleep/sleep.yaml | kubectl apply -f -默认状况下,这将应用集群内配置。或者,能够应用配置的本地副原本实现注入。 kubectl -n istio-system get configmap istio-sidecar-injector -o=jsonpath='{.data.config}' > inject-config.yamlkubectl -n istio-system get configmap istio-sidecar-injector -o=jsonpath='{.data.values}' > inject-values.yamlkubectl -n istio-system get configmap istio -o=jsonpath='{.data.mesh}' > mesh-config.yaml在输出文件上运行kube-inject并进行部署。 istioctl kube-inject --injectConfigFile inject-config.yaml --meshConfigFile mesh-config.yaml --valuesFile inject-values.yaml --filename samples/sleep/sleep.yaml | kubectl apply -f -主动注入应用Istio提供的 mutating webhook admission controller,能够将Sidecar主动增加到实用的Kubernetes Pod中。 当您在名称空间上设置istio-injection = enabled标签并且启用了注入Webhook时,在该名称空间中创立的所有新容器都将主动增加一个sidecar。 请留神,与手动注入不同,主动注入产生在容器级。您不会看到部署自身的任何变动。相同,您须要查看各个Pod(通过kubectl describe)以查看注入的代理。 ...

November 5, 2020 · 11 min · jiezi

关于istio:K8S-生态周报-Istio-v171-发布

「K8S 生态周报」内容次要蕴含我所接触到的 K8S 生态相干的每周值得举荐的一些信息。欢送订阅知乎专栏「k8s生态」。Istio v1.7.1 公布这是 Istio v1.7 系列的第一个 patch 版本。此次更新有些值得注意的内容: #26625 修复了 istioctl x authz check 使其能更好的兼容 v1beta1 AuthorizationPolicy ;#26617 修复了 headless services endpoint 更新不会触发任何 xds pushes 的问题;##26938 修复了当应用 IstioCNI 时 remove-from-mesh 未移除 init container 的问题;Rook v1.4.3 公布这是个 patch 版本,次要修复了一些和 Ceph 无关的问题, 以及引入了一些小性能: 修复: #6232 因为 Ceph-CSI driver 在某些集群中会把垃圾回收清理掉,所以创立 csidriver 对象时不再为它设置 ownerRef 了。次要是因为 csidriver 是集群级别的对象,不应该将 namespace 级别的对象设置为它的 ownerRef;批改: #6225 为 OSD pod 增加 storageClassDeviceSet 标签#6145 为 Ceph 集群减少 uninstall 模式,如果 UninstallMode CR spec 设置为 yes-really-uninstall-even-if-in-use, 那么集群会间接全副删除,而不会期待 PVC 的期待;##6198 仅在 Dashboard 设置为 true 的时候,才会启动 init 容器;#6127 如果一个 OSD down 了,并且须要从 cluster 中移除,则会启动一个 job 去清理它。如果 OSD 依然 up, 则该 job 会被回绝;Thanos v0.15.0 公布本次新增了一个组件 Query Frontend 这是基于 Cortex Query Frontend 的,所以它们有些雷同的个性,比方 Splitting 和 Results Caching ...

October 31, 2020 · 1 min · jiezi

关于istio:Istio扩展性

Istio的扩展性,次要体现在数据立体代理的扩展性。 WebAssembly是一种沙箱技术,可用于扩大Istio代理(Envoy)。 Proxy-Wasm 沙箱API取代了Mixer,成为Istio中的次要扩大机制。 Istio 1.6将为Proxy-Wasm插件提供对立的配置API。 WebAssembly 沙箱具备以下特点: 高效-扩大插件在实现性能的前提下,只带来很低的提早和大量的CPU和内存开销。性能-扩大插件能够执行策略,收集遥测和批改载荷。隔离-一个插件产生编程谬误或解体不会影响其余插件。配置-应用与其余Istio API统一的API配置插件。扩展名能够动静配置。开发敌对-该插件能够用几种编程语言编写,即反对wasm的语言简直都可能用来编写插件。架构Istio扩大(Proxy-Wasm插件)具备几个方面: Filter Service Provider Interface (SPI) for building Proxy-Wasm plugins for filters.Sandbox V8 Wasm Runtime embedded in Envoy.Host APIs for headers, trailers and metadata.Call out APIs for gRPC and HTTP calls.Stats and Logging APIs for metrics and monitoring. 为了使Envoy可能加载WebAssembly插件并可能对其进行调用并被该插件调用,咱们须要一个稳固的接口。这是proxy-wasm的意义。它定义了一个应用程序二进制接口-从WebAssembly模块导出并在运行时可调用的一组函数。从实质上讲,这与动态链接库没有什么不同。 目前官网提供了Rust 和 C++两种语言的sdk,此外社区另外提供了TinyGo和 AssemblyScript 的实现,咱们能够基于sdk更加不便地扩大Envoy。 Demo咱们的演示应用rust语言实现。大抵包含以下三步: 构建一段Rust代码,该代码实现并应用ABI将代码编译为WebAssembly将此部署到Envoy代理中并进行测试。工具筹备 确保你曾经装置了最新版的rust。能够通过以下命令查看并查看具体版本: $ rustc -Vrustc 1.46.0 (04488afe3 2020-08-24)而后查看是否装置了wasm32-unknown-unknown编译指标: $ rustup target list | grep wasm32wasm32-unknown-emscriptenwasm32-unknown-unknown (installed)wasm32-wasi (installed) 如果大家没有装置,那么能够执行以下命令进行装置: ...

October 31, 2020 · 2 min · jiezi

关于istio:多集群istio-service-mesh复制控制平面

本文次要介绍多主集群istio service mesh,每个主集群都有本人的复制管制立体,并应用网关跨集群连贯服务。 在此配置中,每个集群都具备本人的Istio管制立体部署,而不是应用共享的Istio管制立体来治理网格,每个集群治理本人的端点。为了执行策略和确保安全,所有集群都处于共享的管理控制之下。 通过复制共享服务和名称空间并在所有集群中应用公共根CA,能够在集群中实现单个Istio服务网格。跨集群通信在各个集群的Istio网关上进行。 应用Istio Gateway跨多个Kubernetes集群的Istio网格拜访近程Pod 先决条件两个或多个Kubernetes集群,其反对版本别离为:1.16、1.17、1.18。在每个Kubernetes集群上部署Istio管制立体的权限。每个集群中的istio-ingressgateway服务的IP地址必须能够从其余每个集群拜访,最好应用L4网络负载平衡器(NLB)。根CA。跨集群通信须要服务之间的互相TLS连贯。为了在集群之间实现互相TLS通信,将为每个集群的Istio CA配置为共享根CA生成的两头CA凭据。在每个集群中部署Istio管制立体从组织的根CA为每个集群的Istio CA生成两头CA证书。共享的根CA容许跨不同集群的互相TLS通信。为便于阐明,以下阐明将Istio示例目录中的证书用于两个集群。在理论部署中,您可能会为每个集群应用不同的CA证书,所有证书均由公共根CA签名。在每个集群中运行以下命令,以在所有集群中部署雷同的Istio管制立体配置。应用相似于以下命令,为生成的CA证书创立Kubernetes 秘钥。无关更多详细信息,请参见证书颁发机构(CA)证书。$ kubectl create namespace istio-system$ kubectl create secret generic cacerts -n istio-system --from-file=samples/certs/ca-cert.pem --from-file=samples/certs/ca-key.pem --from-file=samples/certs/root-cert.pem --from-file=samples/certs/cert-chain.pem 部署 Istio:$ istioctl install -f manifests/examples/multicluster/values-istio-multicluster-gateways.yaml部署 DNS为近程集群中的服务提供DNS解析将使现有应用程序可能失常运行,因为应用程序通常心愿通过DNS名称解析服务并拜访生成的IP。 Istio自身不应用DNS在服务之间路由申请。集群本地的服务共享一个通用的DNS后缀(例如svc.cluster.local)。 Kubernetes DNS为这些服务提供DNS解析。 要为近程集群中的服务提供相似的设置,请应用<name>.<namespace>.global格局命名近程集群中的服务。 Istio部署蕴含了CoreDNS服务器,该服务器将为这些服务提供DNS解析。为了利用此DNS,必须将Kubernetes的DNS配置为对.global进行域名存根。 一些云提供商为其Kubernetes服务具备不同的特定DNS域存根性能和过程。请参考云提供商的文档,以确定如何为每个惟一环境存根DNS域。目标是在端口53上为.global增加一个域,以援用或代理Istio服务名称空间中的istiocoredns服务。在每个集群中,创立以下ConfigMap之一,或更新现有的ConfigMap,比方coredns1.4以上的版本: kubectl apply -f - <<EOFapiVersion: v1kind: ConfigMapmetadata: name: coredns namespace: kube-systemdata: Corefile: | .:53 { errors health ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure upstream fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf cache 30 loop reload loadbalance } global:53 { errors cache 30 forward . $(kubectl get svc -n istio-system istiocoredns -o jsonpath={.spec.clusterIP}):53 }EOF配置应用服务给定集群中须要从其余近程集群拜访的每个服务都须要在近程群集中进行ServiceEntry配置。服务条目中应用的主机的格局应为<name>.<namespace>.global,其中名称和名称空间别离对应于服务的名称和名称空间。 ...

October 25, 2020 · 1 min · jiezi

关于istio:多集群istio-service-mesh共享控制平面

在共享管制立体部署模型下,多个Kubernetes近程集群连贯到在主集群中运行的共享Istio管制立体。近程群集能够与主群集位于同一网络中,也能够位于不同网络中。连贯一个或多个近程集群后,主集群的管制立体将治理所有服务端点上的服务网格。 Istio网格逾越多个Kubernetes集群,可通过VPN间接拜访近程Pod 先决条件两个或更多运行受反对的Kubernetes版本(1.16、1.17、1.18)的集群。所有Kubernetes管制立体API服务器必须可互相路由。同一网络上的群集必须是RFC1918网络,VPN或满足以下要求的代替的更高级的网络技术:各个集群Pod CIDR范畴和服务CIDR范畴在整个网络中必须是惟一的,并且不能重叠。同一网络中的所有Pod CIDR必须彼此可路由。不同网络上的集群必须具备istio-ingressgateway服务,该服务可从其余每个集群拜访,最好应用L4网络负载平衡器(NLB)。并非所有的云提供商都反对NLB,并且某些云提供商须要应用非凡的正文能力应用它们。筹备CA 从组织的根CA为每个集群的CA生成两头CA证书。共享的根CA容许跨不同集群的互相TLS通信。为便于阐明,以下阐明将Istio示例目录中的证书用于两个集群。在网格中的每个集群上运行以下命令以装置证书。无关配置内部CA的更多详细信息,请参阅证书颁发机构(CA)证书。 $ kubectl create namespace istio-system$ kubectl create secret generic cacerts -n istio-system --from-file=samples/certs/ca-cert.pem --from-file=samples/certs/ca-key.pem --from-file=samples/certs/root-cert.pem --from-file=samples/certs/cert-chain.pemsamples中的根证书和两头证书已宽泛散发并广为人知。不要在生产中应用这些证书,因为这样集群将容易受到安全漏洞和危害。跨集群管制立体拜访 确定如何向近程集群公开主集群的Istiod发现服务。抉择以下两个选项之一: Option (1) - 应用与数据流量共享的istio-ingressgateway网关。.Option (2) - 在Istiod服务上应用云提供商的外部负载平衡器。无关在群集之间应用外部负载均衡器时可能实用的其余要求和限度,请参阅Kubernetes外部负载均衡器文档和您的云提供商的文档。集群和网络命名确定网格中集群和网络的名称。这些名称将在mesh网络配置中以及配置mesh网络的服务注册表时应用。为每个集群调配一个惟一的名称。该名称必须是DNS标签名称。在上面的示例中,主集群称为main0,而近程群集为remote0。 $ export MAIN_CLUSTER_NAME=main0$ export REMOTE_CLUSTER_NAME=remote0如果集群位于不同的网络上,请为每个网络调配一个惟一的网络名称。 $ export MAIN_CLUSTER_NETWORK=network1$ export REMOTE_CLUSTER_NETWORK=network2如果集群在同一网络上,则这些集群应用雷同的网络名称。 $ export MAIN_CLUSTER_NETWORK=network1$ export REMOTE_CLUSTER_NETWORK=network1部署主集群 创立主集群的配置。抉择跨集群管制立体拜访的两个选项之一。如果是抉择istio-ingressgateway , 则: cat <<EOF> istio-main-cluster.yamlapiVersion: install.istio.io/v1alpha1kind: IstioOperatorspec: values: global: multiCluster: clusterName: ${MAIN_CLUSTER_NAME} network: ${MAIN_CLUSTER_NETWORK} # Mesh network configuration. This is optional and may be omitted if # all clusters are on the same network. meshNetworks: ${MAIN_CLUSTER_NETWORK}: endpoints: - fromRegistry: ${MAIN_CLUSTER_NAME} gateways: - registry_service_name: istio-ingressgateway.istio-system.svc.cluster.local port: 443 ${REMOTE_CLUSTER_NETWORK}: endpoints: - fromRegistry: ${REMOTE_CLUSTER_NAME} gateways: - registry_service_name: istio-ingressgateway.istio-system.svc.cluster.local port: 443 # Use the existing istio-ingressgateway. meshExpansion: enabled: trueEOF如果是抉择外部负载均衡器,则: ...

October 25, 2020 · 3 min · jiezi

关于istio:Istio-是如何在-Kubernetes-幕后工作的

作者:Gaurav Agarwal翻译:Bach(才云) 校对:星空下的文仔(才云)、bot(才云) 如果在 Kubernetes 上应用微服务,那么像 Istio 这样的服务网格将施展出巨大作用。这里咱们先讨论一下 Istio 的体系结构。 Istio 通过两个次要组件帮忙治理微服务: 数据立体(Data Plane):这是 Istio 在微服务中的 Envoy sidecar,它们在服务之间进行理论路由,并收集遥测数据。管制立体(Control Plane):这是通知数据立体如何路由流量的组件,它存储、治理配置,帮忙管理员与 sidecar 代理进行交互并管制 Istio 服务网格。管制立体就像是 Istio 的大脑。通过 Istio 的流量有两种类型:数据立体流量(与业务相干的流量)和管制立体流量(由音讯和 Istio 组件之间的交互组成)。 管制立体组件在以后 Istio 版本(Istio v1.5 及更高版本)中,管制立体以单个二进制 Istiod 的模式提供,由三局部组成:Pilot、Citadel 和 Galley。 Istio 架构 Pilot Pilot 是服务网格的地方控制器,负责应用 Envoy API 与 Envoy sidecar 进行通信。它会解析 Istio manifest 中定义的高级规定,并将其转换为 Envoy 配置。它有助于服务发现、流量治理和智能路由,使咱们能够进行 A/B 测试、蓝绿部署、金丝雀公布等。它能通过配置 sidecar 来提供超时、重试和断路性能,以在网格中提供足够的弹性。 另外,Pilot 还负责在 Istio 配置和 Istio 运行的根底根底构造之间提供涣散的耦合。因而,咱们能够在Kubernetes、Nomad 或 Consul 上运行 Istio,这些与 Istio 交互的形式是类似的。Pilot 晓得本人在哪个平台上运行,能够确保流量治理是雷同的,和平台无关。它能够托管流量治理 API,该 API 可帮忙定义配置并提供更精密的服务网格中流量治理。 ...

October 10, 2020 · 2 min · jiezi

关于istio:使用-Istio-服务网格实现零信任网络

作者:Paul Klinker翻译:Bach(才云) 校对:星空下的文仔(才云)、bot(才云) 微服务有很多长处,包含独立的拓展、隔离的业务逻辑、独立的生命周期治理以及繁难的分布式开发。这些长处同时也带来了一些弊病,例如微服务可能会减少安全漏洞,因为每个微服务都能够是攻打指标,这有形间减少了攻击面。如果入侵者进入网络,它们能够肆意地攻打单个微服务,因而仅爱护网络边界(network border)是不够的,还必须爱护网络外部,这就是零信赖(Zero Trust)的起源。 零信赖的概念由 John Kindervag 提出,它指的是无论网络范畴是外部的还是内部的,都不能有任何隐式信赖(implicitly trust),任何起源都须要显式验证,并应用最小特权来限度对资源的拜访。简而言之,零信赖策略就是不置信任何人。除非网络明确晓得接入者的身份,否则任谁都别想进入。无论是 IP 地址、主机等等,只有不晓得用户身份或者不分明受权路径的,通通不放进来。 本文展现了将 Istio 服务网络配置为零信赖网络的具体步骤,次要应用一个简略的微服务架构,而后通过 Istio 删除隐式的服务到服务(service-to-service)信赖关系。 应用自行开发的解决方案爱护微服务网络可能十分艰难,但服务网格(如 Istio)能够提供帮忙,它确保了南北流量(north-south traffic)和货色流量(east-west traffic)的平安。南北流量是进入和来到服务网格的流量,货色流量是网格内的流量,通常是服务到服务的流量。Istio 通过入口(ingress)和进口(egress)网关解决南北流量,流量路由则是由虚构服务治理。Istio 的 Envoy Proxy 能够治理货色流量,在服务的 Kubernetes Pod 中作为边车(Sidecar)运行。上面咱们就看一下这些概念在小型服务网格中的示例。 K8sMeetup 在服务网分外公开服务 在该例子中,咱们将从两个微服务开始:一个在 NGINX Web 服务器中运行的 Web 客户端和一个 Java/Spring Boot 后端的 REST Service。 该客户是个“敌对”客户,咱们容许其拜访后端服务。前面咱们将向网格增加一个微服务,一个歹意的“敌人”Web 客户端,该客户端将被回绝拜访后端微服务。后端微服务称为“Capitol-Info”,具备查问和插入 Capitol 数据库的性能。这些微服务公开的 endpoint 如下图所示,该图显示了凋谢的、不受爱护的服务网格体系结构。 在 Istio 服务网格中运行的 Capitol-Client 微服务和 Capitol-Info 微服务 咱们当初在尝试爱护服务网格的微服务,所以不调用客户端网站到后端微服务。相同,咱们要创立一个 API 网格,并容许该网关调用服务,从而实现服务到服务的调用。NGINX 在 Web 客户端的 /capitolservice 门路下提供了一个 API 网关。当应用此门路调用 Web 客户端时,NGINX 网关会将代理 Capitol-Info 服务的调用。 ...

September 22, 2020 · 2 min · jiezi

关于istio:用-Istio-解释微服务和服务网格

作者:Sudip Sengupta翻译:Bach(才云) 校对:bot(才云)、星空下的文仔(才云) 微服务会将应用程序合成为多个较小的服务组件。与传统的一体化(Monolithic)架构相比,微服务架构将每个微服务视为独立的实体与模块,从根本上有助于简化代码和相干基础架构的保护。应用程序的每个微服务都能够编写在不同的技术堆栈中,并且能够进一步独立地部署、优化和治理。 从实践上讲,微服务体系结构特地有利于简单的大型应用程序的构建,但实际上,它也被宽泛用于小型应用程序的构建。 微服务架构的益处 能够通过不同的技术堆栈开发和部署应用程序中的各个微服务。每个微服务都能够独立优化、部署或扩大。更好的故障解决和谬误检测。K8sMeetup 微服务架构的组件 在微服务架构上运行的古代云原生应用程序依赖于以下要害组件: 容器化(通过相似 Docker 的平台):通过将服务分为多个过程进行治理和部署。编排(通过相似 Kubernetes 的平台):配置、调配、治理服务的系统资源。服务网格(通过相似 Istio 的平台):通过服务代理网格进行服务间通信,以连贯、治理、爱护微服务。以上三个是微服务架构中最重要的组件,这些组件容许云原生堆栈中的应用程序在负载下扩大,甚至在云环境局部故障期间也能执行。 K8sMeetup 微服务架构的复杂性 大型应用程序被合成为多个微服务时,每个微服务都应用不同的技术堆栈(开发语言、数据库等),因而咱们须要把这些环境组成一个简单的体系结构进行治理。只管曾经将每个微服务划分为独自 Docker 容器中运行的多个过程,以此来帮忙治理和部署单个微服务,但因为咱们必须解决整体零碎运行状况、容错和故障点,服务间通信依然非常复杂。 咱们能够通过购物车在微服务架构上工作的例子来进一步理解。这里微服务将与库存数据库、领取网关服务、基于客户拜访历史的产品倡议算法等无关。只管从实践上讲,这些服务依然是独立的微型模块,但它们的确须要彼此交互。K8sMeetup 为什么咱们须要服务网格? 微服务体系结构中服务到服务通信十分重要,那么很显著,通信通道须要确保无故障、平安、高可用性和健壮性。这些是服务网格作为根底结构组件呈现的中央,它通过实现多个服务代理来确保服务到服务的通信。服务网格不负责增加新性能,但能够微调不同服务之间的通信。 在服务网格中,与单个服务一起部署的代理能够实现服务之间的通信,这被宽泛称为边车(Sidecar)模式。边车模式有着解决服务间通信的重要性能,例如负载平衡、断路、服务发现等。 通过服务网格,咱们能够: 保护、配置、爱护应用程序中所有或选定微服务之间的通信。在微服务中配置和执行网络性能,例如网络弹性、负载平衡、网络中断、服务发现等。网络性能与业务逻辑拆散,为独自实体,因而开发人员能够专一于应用程序的业务逻辑,而与网络通信相干的大部分工作都由服务网格来解决。因为微服务到服务的代理通信始终应用诸如 HTTP1.x/2.x、gRPC 等标准协议,因而开发人员能够应用任何技术来开发单个服务。K8sMeetup 服务网格架构的组件 业务逻辑 业务逻辑蕴含了微服务的外围利用程序逻辑、根底代码、应用程序的计算以及服务到服务的集成逻辑。微服务架构的劣势就是能够在任何平台上编写业务逻辑,并且业务逻辑齐全独立于其余服务。 根本网络性能 根本网络性能包含发动网络申请和连贯服务网格代理。只管微服务中的次要网络性能是通过服务网格来解决的,然而给定的服务必须蕴含根本网络性能能力与 Sidecar 代理连贯。 利用网络性能 与根本网络性能不同,该组件通过服务代理保护和治理要害的网络性能,包含网络中断、负载平衡、服务发现等。 服务网格管制立体 所有服务网格代理都由管制立体集中管理和管制。通过管制立体,咱们能够指定身份验证策略、度量规范生成,并在整个网格中配置服务代理。 K8sMeetup 应用 Istio 施行服务网格 只管有其余服务网格,但 Istio 是最受欢迎的,上面咱们看看如何将 Istio 用于云原生应用程序的服务网格架构。 如上文所述,在微服务体系结构中,Istio 会通过造成根底结构层以连贯、爱护和管制分布式服务之间的通信。Istio 会在每个服务旁边部署一个 Istio 代理(称为 Istio sidecar),但该服务自身的代码很少有更改。所有服务间的流量都定向到 Istio 代理,该代理应用策略管制服务间通信,同时施行部署、故障注入和断路器的根本策略。 Istio 的外围能力 通过身份验证和受权来爱护服务间通信。反对访问控制、配额和资源分配的策略层。反对 HTTP、gRPC、WebSocket 和 TCP 通信的主动负载平衡。集群内所有流量的主动指标、日志和跟踪,包含集群的入口和进口。通过故障转移、故障注入和路由规定配置和管制服务间通信。Istio 不依赖任何平台,这意味着它能够在多种环境中运行,包含云、本地、Kubernetes 等。Istio 以后反对: ...

August 18, 2020 · 1 min · jiezi

关于istio:K8S-生态周报-Istio-已修复导致-Pod-崩溃的-bug

「K8S 生态周报」内容次要蕴含我所接触到的 K8S 生态相干的每周值得举荐的一些信息。欢送订阅知乎专栏「k8s生态」。Istio 1.6.7 公布Istio 1.6.7 是为了解决在 1.6.6 中引入的一个 bug。 该 bug 可能会导致 在应用 Istio 1.6.6 时,某些 Pod 进入 CrashLoopBackOff 状态,无奈失常提供服务。 修复后的外围代码如下,这里次要是减少另一个返回值 expectpod 。 通过此办法获取 Pod 时,Pod 有两种状况可能为空: 该 endpoint 未关联 Pod,这时 expectpod 为 false;该 endpoint 已关联 Pod,但未找到 Pod,这时 expectpod 为 true而这种状况产生的最次要起因可能是因为最终一致性,或者乱序事件等。 倡议如果打算降级 Istio 的读者,间接跳过 1.6.6 版本,免得影响到服务。 func getPod(c *Controller, ip string, ep *metav1.ObjectMeta, targetRef *v1.ObjectReference, host host.Name) (rpod *v1.Pod, expectPod bool) { pod := c.pods.getPodByIP(ip) if pod != nil { return pod, false } if targetRef != nil && targetRef.Kind == "Pod" { key := kube.KeyFunc(targetRef.Name, targetRef.Namespace) podFromInformer, f, err := c.pods.informer.GetStore().GetByKey(key) if err != nil || !f { log.Debugf("Endpoint without pod %s %s.%s error: %v", ip, ep.Name, ep.Namespace, err) endpointsWithNoPods.Increment() if c.metrics != nil { c.metrics.AddMetric(model.EndpointNoPod, string(host), nil, ip) } epkey := kube.KeyFunc(ep.Name, ep.Namespace) c.pods.queueEndpointEventOnPodArrival(epkey, ip) return nil, true } pod = podFromInformer.(*v1.Pod) } return pod, false}Trivy v0.10.1 公布本周 Trivy 相继公布了 v0.10.0 和 v0.10.1 版本,咱们一起来看看有哪些值得关注的内容吧: ...

August 7, 2020 · 2 min · jiezi

火了-2-年的服务网格究竟给微服务带来了什么

本文节选自 ServiceMesher 社区出品的开源电子书《Istio Handbook——Istio 服务网格进阶实战》,作者罗广明,来自百度。在过来几年中,微服务成为了业界技术热点,大量的互联网公司都在应用微服务架构,也有很多传统企业开始实际互联网技术转型,基本上也是以微服务和容器为外围。本文将次要介绍微服务架构的概述以及云原生环境下的 Service Mesh 和传统微服务利用的区别。 微服务架构概述微服务架构堪称是以后软件开发畛域的技术热点,在各种博客、社交媒体和会议演讲上的出镜率十分之高,无论是做基础架构还是做业务零碎的工程师,对微服务都相当关注,而这个景象与热度到目前为止,曾经继续了近 5 年之久。 尤其是近些年来,微服务架构逐步倒退成熟,从最后的星星之火到当初的大规模落地与实际,简直曾经成为分布式环境下的首选架构。微服务成为时下技术热点,大量互联网公司都在做微服务架构的落地和推广。同时,也有很多传统企业基于微服务和容器,在做互联网技术转型。 而在这个技术转型中,国内有一个趋势,以 Spring Cloud 与 Dubbo 为代表的微服务开发框架十分遍及和受欢迎。然而软件开发没有银弹,基于这些传统微服务框架构建的利用零碎在享受其劣势的同时,痛点也越加显著。这些痛点包含但不限于以下几点: 侵入性强。想要集成 SDK 的能力,除了须要增加相干依赖,往往还须要在业务代码中减少一部分的代码、或注解、或配置;业务代码与治理层代码界线不清晰。降级老本高。每次降级都须要业务利用批改 SDK 版本,从新进行性能回归测试,并且对每一台机器进行部署上线,而这对于业务方来说,与业务的疾速迭代开发是有抵触的,大多不违心停下来做这些与业务指标不太相干的事件。版本碎片化重大。因为降级老本高,而中间件却不会进行向前倒退的步调,长此以往,就会导致线上不同服务援用的 SDK 版本不对立、能力参差不齐,造成很难对立治理。中间件演变艰难。因为版本碎片化重大,导致中间件向前演进的过程中就须要在代码中兼容各种各样的老版本逻辑,带着 “桎梏” 前行,无奈实现疾速迭代。内容多、门槛高。Spring Cloud 被称为微服务治理的全家桶,蕴含大大小小几十个组件,内容相当之多,往往须要几年工夫去相熟其中的要害组件。而要想应用 Spring Cloud 作为残缺的治理框架,则须要深刻理解其中原理与实现,否则遇到问题还是很难定位。治理性能不全。不同于 RPC 框架,Spring Cloud 作为治理全家桶的典型,也不是万能的,诸如协定转换反对、多重受权机制、动静申请路由、故障注入、灰度公布等高级性能并没有笼罩到。而这些性能往往是企业大规模落地不可获缺的性能,因而公司往往还须要投入其它人力进行相干性能的自研或者调研其它组件作为补充。以上列出了传统微服务框架的局限性,但这并不意味着它们就一无是处了。在中小企业,采纳 Spring Cloud 这样的传统微服务框架曾经能够满足绝大部分服务治理的需要,并且借此疾速推动微服务化革新。这些痛点往往是技术倒退到肯定的水平必然要经验的阶段,这些痛点促使技术一直倒退、不断前进。 在泛滥热门技术趋势中,云原生的关注度居高不下,很多开发者都对由此衰亡的一众技术非常追捧,泛滥企业又开始摸索云原生架构的转型与落地。这一年,中国的开发者们经验了从关注“云原生概念”到关注“云原生落地实际”的转变。而 Service Mesh 技术也因而越来越炽热,受到越来越多开发者的关注,并领有了少量拥趸。那么 Service Mesh 是什么呢?它为什么会受到开发者的关注?它和传统微服务利用有什么区别? Service Mesh 定义Service Mesh 一词最早由开发 Linkerd 的 Buoyant 公司提出,并于 2016 年 9 月29 日第一次公开应用了这一术语。William Morgan,Buoyant CEO,对 Service Mesh 这一概念定义如下: A service mesh is a dedicated infrastructure layer for handling service-to-service communication. It’s responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application. In practice, the service mesh is typically implemented as an array of lightweight network proxies that are deployed alongside application code, without the application needing to be aware.翻译成中文如下: ...

July 14, 2020 · 2 min · jiezi

详解Istio实践之熔断和限流工作原理

在互联网系统中,服务提供方(upstream)因访问压力过大而响应变慢或失败,服务发起方(downstream)为了保护系统整体的可用性,可以临时暂停对服务提供方的调用,这种牺牲局部,保全整体的措施就叫做熔断。 限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的。一般来说系统的吞吐量是可以被测算的,为了保证系统的稳定运行,一旦达到的需要限制的阈值,就需要限制流量并采取一些措施以完成限制流量的目的。比如:延迟处理,拒绝处理,或者部分拒绝处理等等。一般也会算在熔断中。 可靠性是微服务架构的关键,熔断(Circuit breakers)是减少服务异常和降低服务延迟的一种设计模式,如果在一定时间内服务累计发生错误的次数超过了预先定义的阈值,就会将该错误的服务从负载均衡池中移除(如下图),当超过一段时间后,又会将服务再移回到服务负载均衡池。 熔断主要是无感的处理服务异常并保证不会发生级联甚至雪崩的服务异常。在微服务方面体现是对异常的服务情况进行快速失败,它对已经调用失败的服务不再会继续调用,如果仍需要调用此异常服务,它将立刻返回失败。与此同时,它一直监控服务的健康状况,一旦服务恢复正常,则立刻恢复对此服务的正常访问。这样的快速失败策略可以降低服务负载压力,很好地保护服务免受高负载的影响。 熔断器对比 Hystrix vs Istio Hystrix vs Istio 两大熔断器对比: Hystrix是Netflix OSS的一部分,是微服务领域的领先的熔断工具。Hystrix可以被视为白盒监控工具,而Istio可以被视为黑盒监控工具,主要是因为Istio从外部监控系统并且不知道系统内部如何工作。另一方面,每个服务中有Hystrix来获取所需的数据。Istio是无缝衔接服务,istio可以在不更改应用程序代码的情况下配置和使用。Hystrix的使用需要更改每个服务来引入Hystrix libraries。Istio提高了网格中服务的可靠性和可用性。但是,应用程序需要处理错误并有一定的fall back行为。例如当负载平衡池中的所有服务实例都出现异常时,Envoy将返回HTTP 503。当上游服务返回 HTTP 503 错误,则应用程序需要采取回退逻辑。与此同时,Hystrix也提供了可靠的fall back实现。它允许拥有所有不同类型的fall backs:单一的默认值、缓存或者去调用其他服务。 envoy对应用程序来说几乎完全无感和透明。Hystrix则必须在每个服务调用中嵌入Hystrix库。Istio的熔断应用几乎无语言限制,但Hystrix主要针对的是Java应用程序。 Istio是使用了黑盒方式来作为一种代理管理工具。它实现起来很简单,不依赖于底层技术栈,而且可以在部署后也可以进行配置和修改。Hystrix需要在代码级别处理断路器,可以设置级联和一些附加功能,它需要在开发阶段时做出降级决策,后期优化配置成本高。 Istio限流 Istio无需对代码进行任何更改就可以为应用增加熔断和限流功能。Istio中熔断和限流在DestinationRule的CRD资源的TrafficPolicy中设置,一般设置连接池(ConnectionPool)限流方式和异常检测(outlierDetection)熔断方式。两者ConnectionPool和outlierDetection各自配置部分参数,其中参数有可能存在对方的功能,并没有很严格的区分出来,如主要进行限流设置的ConnectionPool中的maxPendingRequests参数,最大等待请求数,如果超过则也会暂时的熔断。 连接池(ConnectionPool)设置ConnectionPool可以对上游服务的并发连接数和请求数进行限制,适用于TCP和HTTP。ConnectionPool又称之是限流。 官方定义的属性 设置在DestinationRule中的配置如下图: 连接池相关参数解析 TCP设置 Tcp连接池设置http和tcp上游连接的设置。相关参数设置如下: maxConnections:到目标主机的HTTP1/TCP最大连接数量,只作用于http1.1,不作用于http2,因为后者只建立一次连接。 connectTimeout:tcp连接超时时间,默认单位秒。也可以写其他单位,如ms。 tcpKeepalive:如果在套接字上设置SO_KEEPALIVE可以确保TCP 存活 TCP的TcpKeepalive设置: Probes:在确定连接已死之前,在没有响应的情况下发送的keepalive探测的最大数量。默认值是使用系统级别的配置(除非写词参数覆盖,Linux默认值为9)。 Time:发送keep-alive探测前连接存在的空闲时间。默认值是使用系统的配置(除非写此参数,Linux默认值为7200s(即2小时)。 interval:探测活动之间的时间间隔。默认值是使用系统的配置(除非被覆盖,Linux默认值为75秒)。 HTTP设置 http连接池设置用于http1.1/HTTP2/GRPC连接。 http1MaxPendingRequests:http请求pending状态的最大请求数,从应用容器发来的HTTP请求的最大等待转发数,默认是1024。 http2MaxRequests:后端请求的最大数量,默认是1024。 maxRequestsPerConnection:在一定时间内限制对后端服务发起的最大请求数,如果超过了这个限制,就会开启限流。如果将这一参数设置为 1 则会禁止 keepalive 特性; idleTimeout:上游连接池连接的空闲超时。空闲超时被定义为没有活动请求的时间段。如果未设置,则没有空闲超时。当达到空闲超时时,连接将被关闭。注意,基于请求的超时意味着HTTP/2ping将无法保持有效连接。适用于HTTP1.1和HTTP2连接; maxRetries:在给定时间内,集群中所有主机都可以执行的最大重试次数。默认为3。 与Envoy参数对比 熔断和限流是分布式系统的重要组成部分,优点是快速失败并迅速向下游反馈。Istio是通过Envoy Proxy 来实现熔断和限流机制的,Envoy 强制在网络层面配置熔断和限流策略,这样就不必为每个应用程序单独配置或重新编程。Envoy支持各种类型的全分布式(不协调)限流。 IstioConnectionPool与 Envoy 的限流参数对照表: Envoy parametherEnvoy upon objectIstio parameterIstio upon ojbectmax_connectionscluster.circuit_breakersmaxConnectionsTCPSettingsmax_pending_requestscluster.circuit_breakershttp1MaxPendingRequestsHTTPSettingsmax_requestscluster.circuit_breakershttp2MaxRequestsHTTPSettingsmax_retriescluster.circuit_breakersmaxRetriesHTTPSettingsconnect_timeout_msclusterconnectTimeoutTCPSettingsmax_requests_per_connectionclustermaxRequestsPerConnectionHTTPSettingsmaxConnections: 表示在任何给定时间内,Envoy 与上游集群建立的最大连接数,限制对后端服务发起的 HTTP/1.1 连接数。该配置仅适用于 HTTP/1.1 协议,因为HTTP/2 协议可以在同一个 TCP 连接中发送多个请求,而 HTTP/1.1 协议在同一个连接中只能处理一个请求。如果超过了这个限制(即断路器溢出),集群的upstream_cx_overflow计数器就会增加。 ...

July 8, 2019 · 3 min · jiezi

Istio流量治理原理之负载均衡内含福利

流量治理是一个非常宽泛的话题,例如: 动态修改服务间访问的负载均衡策略,比如根据某个请求特征做会话保持;同一个服务有两个版本在线,将一部分流量切到某个版本上;对服务进行保护,例如限制并发连接数、限制请求数、隔离故障服务实例等;动态修改服务中的内容,或者模拟一个服务运行故障等。在Istio中实现这些服务治理功能时无须修改任何应用的代码。较之微服务的SDK方式,Istio以一种更轻便、透明的方式向用户提供了这些功能。用户可以用自己喜欢的任意语言和框架进行开发,专注于自己的业务,完全不用嵌入任何治理逻辑。只要应用运行在Istio的基础设施上,就可以使用这些治理能力。 一句话总结Istio流量治理的目标:以基础设施的方式提供给用户非侵入的流量治理能力,用户只需关注自己的业务逻辑开发,无须关注服务访问管理。 Istio流量治理的概要流程如图1所示: 图1 Istio流量治理的概要流程 在控制面会经过如下流程:(1)管理员通过命令行或者API创建流量规则;(2)Pilot将流量规则转换为Envoy的标准格式;(3)Pilot将规则下发给Envoy。 在数据面会经过如下流程:(1)Envoy拦截Pod上本地容器的Inbound流量和Outbound流量;(2)在流量经过Envoy时执行对应的流量规则,对流量进行治理。 负载均衡下面具体看看Istio提供了流量治理中的负载均衡功能。 负载均衡从严格意义上讲不应该算治理能力,因为它只做了服务间互访的基础工作,在服务调用方使用一个服务名发起访问的时候能找到一个合适的后端,把流量导过去。 如图2所示,传统的负载均衡一般是在服务端提供的,例如用浏览器或者手机访问一个Web网站时,一般在网站入口处有一个负载均衡器来做请求的汇聚和转发。服务的虚拟IP和后端实例一般是通过静态配置文件维护的,负载均衡器通过健康检查保证客户端的请求被路由到健康的后端实例上。 图2 服务端的负载均衡器 在微服务场景下,负载均衡一般和服务发现配合使用,每个服务都有多个对等的服务实例,需要有一种机制将请求的服务名解析到服务实例地址上。服务发现负责从服务名中解析一组服务实例的列表,负载均衡负责从中选择一个实例。 如图3所示为服务发现和负载均衡的工作流程。不管是SDK的微服务架构,还是Istio这样的Service Mesh架构,服务发现和负载均衡的工作流程都是类似的,如下所述:(1)服务注册。各服务将服务名和服务实例的对应信息注册到服务注册中心。(2)服务发现。在客户端发起服务访问时,以同步或者异步的方式从服务注册中心获取服务对应的实例列表。(3)负载均衡。根据配置的负载均衡算法从实例列表中选择一个服务实例。 图3 服务发现和负载均衡的工作流程 Istio的负载均衡正是其中的一个具体应用。在Istio中,Pilot负责维护服务发现数据。如图4所示为Istio负载均衡的流程,Pilot将服务发现数据通过Envoy的标准接口下发给数据面Envoy,Envoy则根据配置的负载均衡策略选择一个实例转发请求。Istio当前支持的主要负载均衡算法包括:轮询、随机和最小连接数算法。 图4 Istio负载均衡的流程 在Kubernetes上支持Service的重要组件Kube-proxy,实际上也是运行在工作节点的一个网络代理和负载均衡器,它实现了Service模型,默认通过轮询等方式把Service访问转发到后端实例Pod上,如图5所示。 图5 Kubernetes的负载均衡 本篇内容节选及改编自《云原生服务网格Istio:原理、实战、架构与源码解析》本书购买链接:https://item.jd.com/12538407.... 将本篇内容转发至朋友圈集齐6个赞,并截图于“京东云开发者社区”公众号后台进行回复。 我们将为第6、66、99位回复者送出《云原生服务网格Istio:原理、实战、架构与源码解析》。 本期获奖名单将于本周日(7月7日)揭晓,快快点击“好看”,并且转发到朋友圈吧! 推荐阅读 干货 | 三分钟带你挑选专属负载均衡 干货 | 京东云应用负载均衡(ALB)多功能实操

July 5, 2019 · 1 min · jiezi

让Istio比你想象中简单Rancher新版本宣布支持Istio

近日,Rancher Labs宣布在Rancher 2.3 Preview2版本上支持Istio,简化了Istio的安装和配置,让部署和管理Istio的旅程变得简单而快速。 近日,业界领先的容器管理软件提供商Rancher Labs(以下简称Rancher)宣布在Rancher 2.3 Preview 2版本上支持Istio,让部署和管理Istio的旅程变得简单而快速。 为什么选择Istio? Istio,以及整个Service Mesh技术,是近一两年来Kubernetes生态系统中最亮眼的明星之一。Istio增加了容错、金丝雀部署、A/B测试、监控、跟踪和可观察性、身份认证和授权,开发人员无需再测试或编写特定代码,即可实现上述功能。如此一来,开发人员可以只专注于他们的业务逻辑,将剩下的工作交给Kubernetes和Istio。 上面这些说法其实并不新鲜。早在大约10年前,PaaS供应商们就提出了类似的说法,甚至在一定程度上兑现了这一要求。但问题在于,他们的产品需要特定的语言和框架,并且在大部分情况下只能用于非常简单的应用程序。用户的工作负载也会和供应商独特的方案关联在一起。这就意味着如果您希望应用程序使用PaaS服务,您可能会被锁定相当长的一段时间。 但如今,对于容器和Kubernetes而言,这些限制、这些被锁定的风险都不复存在。只要您将您的应用程序容器化,Kubernetes就可以为您运行它。 Istio在Rancher 2.3 Preview 2中如何工作 大量Rancher用户喜欢Rancher平台的原因,就是Rancher让管理和操作Kubernetes及相关的工具和技术变得极其简单,且用户们不必担心会被特定的云供应商锁定。而如今对于Istio,我们采取了同样的方法,致力于带给用户同样的体验。 在Rancher 2.3 Preview中,我们为用户提供了一个简单而友好的用户界面,在UI中使用工具菜单,即可启动Istio。系统提供了合理的默认配置,用户也可以根据需要进行修改: 为了监控流量,Istio需要注入Envoy sidecar。在Rancher 2.3 Preview当中,用户可以为每个空间名称注入自动sidecar。一旦您勾选了这个选项,Rancher会将sidecar容器注入到每个工作负载当中: Rancher简化了Istio的安装和配置,内置了一个支持Kiali的仪表盘,用于流量和遥测的可视化,然后用Jaeger进行追踪,甚至还有自己的Prometheus和Grafana(与用于高级监控的实例不同)。 在启用自动sidecar注入的命名空间中部署工作负载后,您可以跳转到Istio菜单目录,观察微服务应用程序的流量: 点击Kiali、Jaeger、Prometheus或者Grafana,您将进入每个工具相应的用户界面,您可以在其中找到详细信息和选项: 正如前面所提到的,Istio的强大之处在于它能为您的服务带来诸如容错、断路、金丝雀部署等功能。要启用这些功能,您需要开发和应用适当的YAML文件。目前Windows工作负载还不支持Istio,因此不应在Windows集群中启用它。 结 语 Istio是当前Rancher及Kubernetes社区中最受关注的功能之一。但是,如何最达到Istio部署和管理的最佳实践,前路仍然漫长。在Rancher 2.3 Preview 2中,我们的目标是沿袭Rancher一如既往的理念,让部署和管理Istio的旅程变得简单而快速。 2019年6月20日,在Rancher于北京举办的千人容器技术盛典“2019企业容器创新大会”上,Rancher大中华区研发经理张浩在演讲中分享了Rancher 2.3 Preview的一系列新功能,包括正式支持Windows Kubernetes、镜像仓库、镜像扫描、服务网格、Google登陆、集群模版、集群安全扫描和集群自动扩缩容等等,并且demo了如何在Rancher中使用Istio进行金丝雀发布。您可在Rancher微信公众号后台回复“ECIC”获取大会完整PPT下载,更可文末点击“阅读原文”回看大会视频喔~ 有关发行说明和安装步骤,请访问GitHub: https://github.com/rancher/ra...

July 2, 2019 · 1 min · jiezi

Istio开启mtls请求503问题分析

背景 为测试Istio流量管理,将两个服务sleep、flaskapp的两个版本v1、v2(部署文件见参考链接)部署到Istio环境中,通过sleep-v1向flaskapp发起调用http://flaskapp/env/version,正常结果会交替打印出结果v1和v2,然而在调用过程中报错503 reset reason: connection failure,故将问题的步骤、现象、分析、验证整理于此。 步骤 部署sleep、flaskapp应用,同时Istio平台开启mTls,命名空间kangxzh开启自动注入,部署如下图所示: kubectl apply -f sleep.istio.yaml -n kangxzhkubectl apply -f flask.isito.yaml -n kangxzh#查看pod创建情况kubectl -n kangxzh get pod -wflaskapp-v1-775dbb9b79-z54fj 2/2 Running 0 13sflaskapp-v2-d454cdd47-mdb8s 2/2 Running 0 14ssleep-v1-7f45c6cf94-zgdsf 2/2 Running 0 19hsleep-v2-58dff94b49-fz6sj 2/2 Running 0 19h 现象 在sleep应用中发起http请求,调用flaskapp,curl http://flaskapp/env/version,如下所示: #export SOURCE_POD=$(kubectl get pod -l app=sleep,version=v1 -o jsonpath={.items..metadata.name})# 进入sleep发起http请求kubectl -n kangxzh exec -it -c sleep $SOURCE_POD bashbash-4.4# curl http://flaskapp/env/version# 响应upstream connect error or disconnect/reset before headers. reset reason: connection failure 背景 ...

July 1, 2019 · 3 min · jiezi

10倍DB交付效率飞贷金融科技的数据库生产容器化实践

2019年6月20日,由Rancher Labs(以下简称Rancher)主办的第三届企业容器创新大会(Enterprise Container Innovation Conference, 以下简称ECIC)在北京喜来登大酒店盛大举行。本届ECIC规模宏大,全天共设置了17场主题演讲,吸引了近千名容器技术爱好者参加,超过10000名观众在线上直播平台观看了本次盛会。 来自Rancher、阿里云、百度云、平安科技、中国联通、飞贷金融科技、中国人寿、SmartX、华泰保险、厦门航空、JFrog、新东方、Cisco等十多家企业的技术负责人出席了本届ECIC,现场带来关于企业容器项目实践经验的精彩分享,为参会的容器技术爱好者带来企业容器化的经验分享。 飞贷金融科技副总裁陈定玮 大会现场,飞贷金融科技作为金融行业数据库容器化的典型案例,为现场的容器爱好者带来了题为《金融领域数据库生产容器化及Istio应用》的实践经验分享。 对于飞贷金融科技而言,生产容器化及数据库应用的难点在于,如何针对金融领域生产容器化及数据库容器应用进行实践创新,如何结合研发及业务场景落地,提升资源利用效率、提升产品研发、运维管理效率。 飞贷金融科技副总裁陈定玮表示:“金融行业数据具有相较于其他行业更为严格的安全高标准,在安全合规的情况下用飞贷自研中间件,解决金融领域DB应用场景难题,带来10x的DB交付效率,极致的弹性扩容能力。” 演讲实录 飞贷金融科技成立于2010年,是移动信贷整体技术服务商。我们以科技创新作为企业发展的动力,在科技创新的道路上不断前行。 2011年到2015年,飞贷做的是传统的小微金融业务。2015年,我们决定进行线上互联网化转型。到2017年,我们整个公司进行了战略升级,为金融行业客户提供互联网服务。迄今为止,飞贷为人保、北京银行、华润信托、通联支付等多家金融行业企业提供了全链路的科技服务。 2018年,我们登上了美国《时代周刊》,被《时代周刊》称为“全球金融科技最佳实践”。同年,我们还拿到了世界银行和G20共同推出的首届全球小微金融奖最高荣誉——“年度产品创新”铂金奖。 接下来,我会和大家详细介绍一下,飞贷作为一家互联网金融科技企业,是怎样和容器化相结合,又是怎么在业务上应用容器化的。 飞贷应用容器化与前面分享的企业一致,同样也是基于整个企业的容器化应用。值得一提的是,飞贷做的是金融领域,所以我们对安全、对容错、对高恢复的部分相较于其他行业的企业而言更加在意。我们关注的不仅仅是应用,更多的会关注到如何迅速地进行灾难的恢复。 我们利用容器进行了整体的架构部署,从大家比较熟悉的DevOps,到我稍后会重点介绍的DB Mesh的部分。我们划分了几大平台,包括容器化平台、产品研发平台和数据平台。下面的是应用安全、数据安全、网络安全、容器安全、运维安全等部分。容器对我们而言帮助非常大,现在我们的RD都是基于容器Kubernetes做应用开发。在这一部分,飞贷在金融领域已经达到了领先的水平。 下图是飞贷的容器发展路线图。我们从2015年开始研究容器,2016年开始投产在RD环境上。在当时我们还没能完全选定Kubernetes还是另外一个容器技术,所以暂时停留在RD阶段。2017年,Kubernetes技术越来越成熟、越来越稳定,我们就把整体的方向往Kubernetes方向进行迁移。到了今年,我们的生产环境已经可以大量运用容器技术进行多个方向上的应用了。 刚才Rancher的CEO梁胜博士提到,现在Rancher已经可以做到多K8S集群管理和部署,多数据中心。这是和我们的业务发展比较贴合的。我们提供基于飞贷的金融云服务,同时我们有多租户集群管理的业务需求。目前,我们已经可以针对K8S多集群进行应用服务、中心服务、数据库服务等多个方向的多集群管理,同样,我们也可以做到多租户网络隔离。 从客户的角度来说,在客户和我们合作之前或者是过程当中,他们先前可能并不了解小贷的业务运营是这样的,所以银行会把他们的整体服务放在我们公司,飞贷就变成了一家金融云厂商。而飞贷的特殊之处就在于,我们专注于和我们业务发展相关的内容,我们为客户提供的不是一个整体的平台,而是应用。 刚才提到的所有内容都是和容器息息相关的,容器的特性包括安全审计、动态存储、高可用灰度发布等等,我们把容器的特性应用到了飞贷生产环境上,并且发挥到了极致。 下图是飞贷容器化的平台组件。无论是我们的RD还是外面的人员,飞贷会为他们提供应用商店,他们要做什么事情,就在我们的管理平台点击一下,我们会自动生产一个容器的应用帮他们进行处理。我们镜像仓库的部分是在一起的。 除了这几个部分,我们还有Prometheus和Jenkins,这些体系和我们研发的相关度比较高,现在飞贷能实现自动集成、自动打包、自动发布和自动部署,这是我们研究了两年多的平台组件成果。 飞贷为什么要让DB容器化?因为微服务部分的应用层已经发展得比较好了,但是对于DB而言还有很多的问题。假如DB宕机了,我想要迅速恢复这个DB,让业务生产能够正常运行,我们需要花费多长的时间呢?如果DB非常大,这个启动时间是非常久的。这就是为什么银行或者是大型金融机构没有小型机,不敢用开源的MySQL或者是MangoDB等资料库,因为他们要保证安全和持续运作,这是一个比较大的挑战。 这就是我今天要重点讲述的几个问题,为什么要MySQL容器化?MySQL容器化安全稳定吗?容器化MySQL的具体实现是样的? 我们刚才介绍了飞贷要做多集群管理的容器,里面存在一些限制以及要求。第一,会涉及非常复杂的网络结构;第二,故障要频繁地切换,我们认为这在金融行业是非常重要的一个部分,因为一旦发生故障,金融行业的业务基本上就会停摆了;第三,要控制容量大小;第四则是要依赖网络存储。 我们之所以要做这个部分,有三个方面的原因。第一,我们需要实现标准化快速部署,因为应用快速部署完之后,如果DB部署很慢的话,对于我们而言,整体效率还是一样地低,这是站在整体效率的部分而言的;第二就是微服务场景,我们现在的系统已经是全部为服务化进行终端的调整,在这种场景下,如果数据场景不能微服务化,那我上层所做的内容毫无意义,我们不希望数据库成为业务弹性伸缩以及管理的短板;第三就是MySQL服务化、自动化、网络化和智能化的需求。 我们进行MySQL容器化的效果很明显。第一,我们可以实现高效弹性伸缩、扩容、备份、导入、导出、恢复、快照、迁移;第二,我们可以实现整体数据库的性能监控和审计;第三,分布式存储、资源、数据多副本可以实现实时同步。我们在大数据应用的部分可能和一般的公司也有所区别,我们生产环境的一些数据和大数据实时数据是拆分开的,但我们做到了实时同步;第四就是计算资源分布式,多节点,技术设施高可用;第五是拥有故障自愈的功能。我的MySQL如果宕机,我们可以迅速恢复。 下图是我们MySQL DB的架构,底下的应用服务对应的是中间件,我们所有的中间件对应每一个单独的库。我们为了实现DB容器,把库做到了非常大的空间压缩,并且把库进行了容量限制,这样才有可能在库故障的时候,可以迅速的启动它。这部分考验了我们整体的业务运作部分,数据分表分库的能力、读写分离的能力。而这部分都是通过我们自行研发的中间件完成的。如果没有我们自行研发的中间件,DB Mesh这部分内容是我们也无法完成的。 以上基本就是飞贷DB的网络发散图,架构特征包括几个部分,一是高并发、低延迟,每秒10000事务处理,延迟小于100毫秒;二是支持IDC多活;三是支持数据路由;四是可以自动化或者人格化决策切换;五是数据多副本。 截至目前,飞贷的DB量级是PB级别的,我们大概是十几个PB这种应用数量,可对外同步实施,故障容器数目大于二分之一可以自动回复,这就是为什么我们要做DB Mesh的原因。 另一部分是关于我们容器化整合Istio的,右边是我们生产应用的图形界面,可以看到注册进去之后,我们就可以进行自动追踪,了解库的健康程度。但是里面还有一些小问题,当DB断掉再恢复之后,这个服务就不见了,需要再次手工注入。关于这个问题,我们研究了Istio的很多文档,但还没有克服这一问题。所以在DB这一部分,我们只做到在生产的时候,一开始可以注入,但是当它挂掉之后,我们还是需要手工处理,暂时没有办法自动恢复。 而在应用和管理服务的部分,我们已经做到了完全自动化,整合Istio实现微服务Service Mesh,实现了微服务访问、安全加固、控制、观察。服务追踪、限速、熔断、调度、负载等部分。 以上是飞贷整体服务的应用部署,从应用服务到中间件,这是我们整体部署的发布图,所以现在我们的RD人员基本上只负责开发,开发之后,所有一切都通过我们的平台去进行集成、发布和管理,上了生产环境之后,也会由我们的运维来处理,不会由RD来处理。在这一点上,我们做的还比较符合银行的要求。 最后,我想介绍一下飞贷容器化带来的成果: 第一是提升飞贷整体生产力。飞贷80%的基础运维都是自动化的;其次,交付能力也有所提升,一小时我们可以交付上百套的服务应用,目前来说有上千台容器在我们整个生产环境上面运作,如果我们没有进行微服务容器化的话,微服务架构部署时间会非常长;最后一个是我们具备生产环境上数百个MySQL的实例,这也是我们的一个容器化成果; 第二就是研发和扩展,可以按照容器的pod、物理主机节点、机柜及数据中心级别做扩展,这块我们也结合了很多CMDB的内容,但在这里就不详表了; 第三是IT成本的投入,这也是我们企业比较关注的一个内容,我们之前的私有云是用CloudStack作为平台去搭建的,现在我们全部换成了容器。这大约节约了我们40%的资源,节省了60%的人力投入。以前我们要部署一个应用还需要提供虚拟主机在RD上面部署,现在容器一键部署就可以完成了。另外项目研发投入时间也节省了40%,因为部署应用之类的内容现在已经不需要RD人员来处理了,都是由我们平台自动化处理的; 第四是安全、敏捷、高效,这部分业余数据的全量备份我们也是分钟级的,我们的库缩得足够小,所以我们可以在几分钟内迅速备份;第二在容灾故障的时候,我们的业务运用一键恢复也是分钟级的,数据快照是秒级的,资源利用率提升10倍,数据库交付能力提升近百倍,我们整个应用有上百个MySQL节点,如果一个个部署非常慢,我们现在已经把镜像做起来了,所以部署是非常迅速的; 最后一点是运维变得非常简单,自动化、极致的、弹性容器的调度,灰度发布、预发布、蓝绿部署、持续交付。

June 28, 2019 · 1 min · jiezi

一文读懂微服务与服务网格WHAT-WHY-and-HOW-TO-DO

作者注:联系方式 leontian1024@gmail.com || github.com/XinyaoTian新人入行,非常期待能与各位大牛们讨论,感谢各位的阅读,希望对您有所帮助。一切都要从云计算和容器技术的出现说起...相信每一位老道的开发者和软件工程师们都会有过,曾经( 也许现在仍然 )被庞大且复杂的软件系统所支配的恐惧。随着软件版本的迭代和开发团队人员规模的扩大,曾经那个小巧别致、设计精良的软件或应用一去不返,如今已经变得遍地狼藉,惨不忍睹——混乱的接口、不规范的调用、像贴狗皮膏药一般贴上去的新功能组件……曾经那个赏心悦目的应用,如今看了就反胃。这一切都预示着一个问题:开发软件的方式需要改变。 纵使有那么多种软件开发模式,但如果不能从底层技术上实现对设计的约束,问题将会随着时间的推移,最终暴露出来。譬如“高内聚,低耦合”的设计理念,如果不能从底层就实现模块间的隔离,而依靠开发时的技巧和经验,那么最终这个软件依旧会变得一团糟( 因为团队会有新人的加入、即使经验老道的开发者也会有头脑发昏的时候…… )。因此,“不这么写就无法运行”这样的硬性要求就很有必要了。 云计算和容器技术的出现,非常及时地帮助我们解决了这一难题。云计算的高弹性和按需分配、容器技术的快速启停和隔离,都很好的帮助了我们减少运维开销,且对于不同模块实现操作系统级别的隔离。在这两种关键技术出现前后,软件架构的差别如下图所示: ( 上图: 单体应用 与 微服务应用 )以 Web 应用为例,按照之前的开发方式,我们往往会选用一个功能齐全但相当复杂的开发框架( 比如JAVA开发常用的 SpringBoot ),然后在这个框架的基础上,根据开发经验和框架的功能将整个应用分层( 比如最常用的表示层、业务逻辑层和数据资源层的分层方法 ),之后根据需求分析得出的各个功能,通过不同目录、文件和函数的方式分别开发,最终一个完整的 Web 应用被开发出来。其过程如下图所示。 ( 上图: 基于框架的软件开发架构网格 )通过使用框架,我们把软件在层次上分为三层,而之后的每个功能,就相当于纵向地添加一个新列。如果以这种方式看待一个应用,那么我们就可以将任何基于这种开发方法的应用看作一个3行n列的表格或矩阵了。 然而,这种非常普及的开发方式仍然有一些问题...虽然这种开发方式已经非常普及,非常成熟,但其仍有许多有待改进的地方。比如: 依赖和库过于庞杂。理想情况下,我们希望针对每一个模块,单独管理其相应的依赖和库,而不是以整个应用作为单位来管理。 无法改变层次结构。某种层次结构对于某些业务需求来说很棒,但对于另外一些也许就显得不那么合适了。使用这种方式开发,几乎所有功能都要遵从这种既定的层次开发( 比如写 UI、写业务逻辑、写数据库层 )。而对于目前日渐快速的迭代和敏捷的开发思想,我们需要一种更加灵活轻便的方式进行开发。 无法实现跨语言开发。我们知道,几乎每种编程语言都有自己最擅长的领域。也许某些功能选用其他编程语言的开发效率更高,运行效果更好。然而,使用这种方式我们往往只能使用选定的框架所支持的语言。 模块的独立性不足。单纯通过函数和文件来进行隔离,隔离性仍然不够。一个疏忽或是加急上线就会让之前良好的高内聚低耦合的良好软件结构灰飞烟灭。因此,我们需要更加底层的机制来硬性约束我们实现“高内聚低耦合”,把“应该这么做”变为“必须这么做”。 而伴随着云计算和容器技术的发展,微服务的出现,恰巧将这些问题迎刃而解。 ( 上图: 容器技术的基本层次结构 )先来说说容器技术的代表 —— DockerDocker 可以看作是轻量级的虚拟机——它可以通过“容器镜像”快速启动和停止预先配置好的相应运行环境。每一个容器都可以被看作一个独立的操作系统,相互隔离,互不干扰。因此,借助docker 我们就可以针对一个应用中不同的功能,为其独立定制运行环境,独立装载依赖和工具库,独立运行独立停止,独立升级,每个功能可以使用其最适合的编程语言进行开发,也将整个应用拘泥于一种框架了。利用 docker 将每个模块在操作系统层面进行隔离,对于每个模块都可以独立管理其生命周期了,这就是“微服务”中“微”字的具体含义。 微服务开发的重点基于这种开发方式,每个功能模块可以被独立开发,独立部署,独立运行,独立进行版本控制,等等。而对于规模比较庞大的系统来说,这种利用微服务架构所开发的应用,其天然的优势就更能体现出来了——即每个模块可以独立的团队由单独负责。因此,微服务开发中的第一个重点,就是要有非常明确的需求,以及一个经验丰富的架构师,在设计之初就对各个功能模块进行合理的规划和拆分。 在整个应用设计之初由总设计师或架构师设计好各个功能模块后,第二个重点就来了:设计微服务中各个模块间的调用接口——通常由 Rest API 或者 gRPC 组成——来负责模块之间的交互,这就是微服务的第二个重点。良好的接口设计将会使你的应用结构清晰,开发起来事半功倍。而且每个独立团队在开发时都能感受到明显的模块边界,且可以放心利用模拟数据和测试数据进行开发( 只要符合接口规则的数据就能用,不用操心其他模块是如何实现的 ),从而真正实现每个团队富有效率的并行开发。 利用微服务架构开发除了上述好处之外,在运维方面的优势也非常直观——我们可以清晰地观测到整个系统的资源瓶颈在何处( 哪个容器的资源开销最大 ),从而实现有针对性的“定向扩缩容”。利用微服务架构前后的扩缩容机制如下图所示意。 ( 上图: 单体应用和微服务应用最直观的差别:定向扩缩容 示意图 )将庞大的单体应用逐步改造成微服务应用在看完上面的介绍后,相信饱受单体应用折磨的各位读者已经对微服务开发已经跃跃欲试了。但是,对于一个正在运行并使用的应用来说,完完全全从零开始开发并不现实。对于一个已经成熟并正在使用的单体应用系统来说,我们可以通过自己的努力,将一个单体应用在几次迭代过程中,逐渐改变为微服务应用。如何办到呢?下面放一张图片来帮助您激发灵感: ...

June 25, 2019 · 2 min · jiezi

故障注入-Sidecar自己设计并实现的故障注入微服务非常欢迎各位大佬批评指正

“故障注入 Sidecar“——为您的微服务注入故障以验证集群性能! 由于导师和实验室师兄们的科研需要,本人专门以 Sidecar的模式设计了一个用于错误注入的微服务模块。该模块可以与任何微服务应用共同部署运行,为其模拟cpu、内存等错误。 本项目的 Github地址: https://github.com/iscas-micr...我的联系方式: leontian1024@gmail.com || 或直接留言 欢迎您提出问题批评指点!项目背景目前,本人正在中科院软件所的微服务研究组从事部分研究工作。由于本人所在科研小组的研究内容( 微服务自动扩缩容相关 ),需要经常使微服务应用处于"高 CPU 利用率" 和 "高内存使用"的状态。因此,为了方便导师和实验室的各位师兄进行实验,本人特地开发了一个可以注入进 Pod 中的错误注入容器,来模拟上述的高负载状态。 导师和师兄们使用后对我的工作给予了肯定,因此我准备将开发过程和简单使用方法写成文章做个记录( 也就是本文 ),一来方便自己日后工作学习,二来也方便有类似实验需求的其他同仁们使用这个小项目,为大家的研究节省时间。更具体的安装和使用方法,可以移步本项目 Github 的代码仓库,其中有非常详细的说明。 知识储备什么是微服务中的"Sidecar 运行模式?" 上图: 以 Sidecar 模式部署并运行的微服务单元Sidecar 运行模式是最近两年比较火的一种微服务部署和运行方法,它由目前流行的 ServiceMesh(服务网格) 架构推广而来。 具体而言,Sidecar 运行模式是一种"将不属于业务应用的功能以独立的容器运行于业务容器旁边",在 K8s 中表现出的样子就是将具有不同功能的模块封装成不同的镜像,并以不同的容器运行在同一个 Pod 中。这种说法非常形象,因为 Sidecar 这个单词的本意就是三轮摩托侧面的"跨斗",这里形容独立于业务应用但又与业务应用部署在一起非常合适。 上图: Sidecar ,中文意思为摩托车的跨斗,不由赞叹命名的非常生动主要设计思想架构设计本项目的错误注入模块也采用了 Sidecar 这种设计思想,将用于模拟 CPU、内存等故障的模块独立封装成一个镜像,并在 Pod 启动时以 Sidecar 的形式运行在主业务容器旁边。这样,不用它时他就会安安静静地当个美男子,完全不用担心它会影响到正常业务的运行;一旦需要它模拟错误产生,由于与业务容器同处于一个 Pod 之中(而 K8s 又以 Pod 为基本单元),因此他模拟出的错误亦被 K8s 集群视为业务应用所在 Pod 产生而被监测到。 上图: Pod 中的每个容器都有自己的端口映射到外部主机,因此不会相互影响注入方式设计本项目在设计之初是采用“在容器内修改环境变量”的方式对容器注入故障的,但事实证明这种方法太low,而且非常麻烦。因此在后续设计和实现中采用了目前较为流行的通过 REST API 传递 POST 请求的方式使容器模拟错误,这样就极大地方便了师兄们展开实验,而且也可以模拟出“微服务间调用而产生错误”的场景( 上游服务调用错误注入的 API 而模拟下游服务产生错误 )。 ...

June 22, 2019 · 3 min · jiezi

Istio-在阿里云容器服务的部署及流量治理实践

目标在阿里云容器服务 Kubernetes 集群上部署 Istio 服务网格实践灰度发布、故障注入、熔断等 Istio 流量管理特性准备工作安装和设置 kubectl 客户端,请参考不同的操作系统,如果已经安装请忽略:macOScurl -LO https://kubectl.oss-cn-hangzhou.aliyuncs.com/macos/kubectlchmod +x ./kubectlsudo mv ./kubectl /usr/local/bin/kubectlkubectl --helpLinuxcurl -LO https://kubectl.oss-cn-hangzhou.aliyuncs.com/linux/kubectlchmod +x ./kubectlsudo mv ./kubectl /usr/local/bin/kubectlkubectl --helpWindows把 https://kubectl.oss-cn-hangzhou.aliyuncs.com/windows/kubectl.exe 放到系统PATH路径下 kubectl --help配置 kubectl 连接 Kubernetes 集群的配置,可参考文档 通过kubectl连接Kubernetes集群 实验步骤部署Istio登录容器服务控制台,在集群列表中选择一个集群,打开更多 - 部署 Istio 保持默认配置,点击"部署 Istio" 等待完成后,Istio 已经成功部署在 Kubernetes 集群中使用 kiali 查看服务网格可视化kubectl port-forward -n istio-system "$(kubectl get -n istio-system pod --selector=app=kiali -o jsonpath='{.items..metadata.name}')" 20001在本地浏览器中访问 http://localhost:20001 ,使用默认账户 admin/admin 登录 灰度发布创建命名空间并开启 Sidecar 自动注入:单击左侧导航栏中的集群 > 命名空间,进入命令空间页面,创建一个名称为 demo 的命名空间,并为其添加一个 istio-injection:enabled 的标签 单击左侧导航栏中服务网格 > 虚拟服务,进入虚拟服务(Virtual Service)页面,点击创建,创建一个简单的示例应用,指定应用名称为istio-app,指定应用版本为v1,选择刚刚创建的命名空间 demo 配置应用容器,使用如下镜像:registry.cn-beijing.aliyuncs.com/test-node/node-server:v1 ...

June 19, 2019 · 2 min · jiezi

解析envoy处理http请求上filter架构

2019-06-17 13:24 灵雀云 分类:istio 阅读(22) 评论(0) [编辑]Envoy是istio的核心组件之一,以sidecar的方式与服务运行在一起,对服务的流量进行拦截转发。 具有路由,流量控制等等强大特性。 Envoy利用libevent实现了基于事件触发的异步架构,所有的网络阻塞操作包括 accept,read, connect, write 都是由eventloop进行callback触发。 本文以istio1.1所对应的Envoy版本进行源码流程分析。 名词解释: 下游: 发送请求给Envoy的服务,client上游:接收Envoy发送的请求,并返回响应的服务, serverFilter流程图下面的流程图为istio架构下,访问80端口的http服务的流程。 Client向Envoy的15001 port建立连接,被转到80 port的Listener2.Client发送请求给Envoy,Envoy经过路由后找到上游Server,并发送请求 3.上游Server返回响应给Envoy,Envoy利用event_active立即返回响应给下游的client Client主动断开下游到Envoy的连接 Server主动断开Envoy到上游的连接 Filter分类 ListenerFilterlistener.listener_filters 用于接收到下游新连接的时候回调 接口: onAccept(callback)内置类型: envoy.listener.original_dst (istio中的15001端口常用)根据iptables转换之前的dst port,查找到真实的Listener,查找到Listener会根据新的Listener的配置继续处理 envoy.listener.tls_inspector注册read callback,识别tls和进行tls握手,握手结束后会进行下一步的filterChain的处 注册filter: ReadFilterlistener.filter_chains.filters 用于接受到下游新连接的时候回调上游或者下游连接上有数据可以读取的时候的回调,一般用于协议的解析接口: onNewConnection()onData(data, end_stream)… 内置类型: Envoy::Http::CodecClient 只在向上游的连接用到,且向上游的连接只有这个filter,用于读取响应envoy.http_connection_manager处理http请求的主要filter envoy.tcp_proxyenvoy.redis_proxy… 注册filter: WriteFilterlistener.filter_chains.filters 用于向上游的连接写入数据的时候回调(目前内置的writeFilter没有http相关的) 接口: onWrite(data, end_stream)内置类型: envoy.filters.network.dubbo_proxyenvoy.mongo_proxyenvoy.filters.network.mysql_proxyenvoy.filters.network.zookeeper_proxy注册filter: StreamDecodeFilter ( envoy.http_connection_manager下独有的filter)listener.filter_chains.filters[envoy.http_connection_manager].http_filters 用于解析http请求各个部分的时候回调执行 接口: decodeHeaders(headers, end_stream)decodeData(data, end_stream)decodeTrailers(HeaderMaps& trailers)decodeComplete()… 内置类型: envoy.corsenvoy.faultenvoy.router… 注册filter: ...

June 17, 2019 · 1 min · jiezi

在生产中使用Istio我们学到了什么

首先,给大家简单介绍一下Istio,Istio是一个Service Mesh的开源框架,来自Google,大部分使用Go语言来开发,是Service Mesh的集大成者。 Istio数据层面主要使用envoy,Istio开发了一些 filter 扩展envoy的功能,这些功能主要集中在mixer上。Istio是新鲜出炉的技术,2017年5月0.1 release版本横空出世,不过版本更新迭代很快,最新的版本是今年3月发布的,1.1.3版。 Istio简介 Istio在逻辑架构上由数据平面和控制平面组成。数据平面是经典的实现方式,由一组以 sidecar 方式部署的智能代理(Envoy)组成。这些代理可以调节和控制微服务及 Mixer 之间所有的网络通信。 在每一个容器中注入了一个sidecar,Istio的sidecar称之为Istio proxy,相当于envoy 加上Istio开发的envoy filter。Istio proxy可以拦截整个容器的入口和出口流量。根据sidecar从数据层面接受到的规则和策略,进行一系列对于网络流量的配置和管理,比如路由管理,加密,遥测数据收集。控制平面负责管理和配置代理来路由流量,此外,控制平面还配置 Mixer 以实施策略和收集遥测数据。 Istio有几大块功能,首先是流量控制,这个基本上是通过Istio里的pilot组件来实现的。从图上我们可以看到,rules api就是pilot提供的抽象API,用户通过api来配置相应的规则。Paltform Adapter主要是兼容不同的平台。用户针对不同的平台实现服务发现等功能。基于用户的规则和从平台收集的数据,通过envoy api把具体的规则下发到各个容器的Istio proxy。 这里实现了大部分我们需要的流量管理功能,例如负载均衡策略,路由控制。我们可以把本来发给服务A的请求,都导向另一个服务。 故障注入,为测试进行模拟。以及熔断,url重写,重试,超时等等。 Istio的第二块,主要是安全机制。我们可以对网格内的微服务通讯进行tls加密。在发起请求的Istio proxy对请求使用tls证书加密,在接受请求的Istio proxy对这个请求解密,这对于应用的开发者是无感的。Istio最优秀的地方就是对于业务开发者的基本无感。这些网络调用相关的功能和策略被抽离出来,不用再放在应用的代码里。 Istio还提供了类似k8s rbac的权限实现方式。在servicerole定义使用service api的权限,通过service role binding绑定在k8s service account上,然后当应用通过service accout启动后, 该应用就有service role里定义的访问其他服务的权限。 下面一块是策略和遥测,这个是Istio中争议非常大的一个功能。好的方面是设计非常干净。Istio proxy只需要把它收集到的attribute发给mixer,mixer的Adapter基于attribute来做相应的操作。一类attribute用来做策略检查,例如Qouta,另一类用来做遥测数据收集,如promothues。 这其中体验不好之处就在策略检查上面。因为每个请求都需要做这个检查,这个检查目前看来会影响整体的性能。1.1开始,Istio提供了简单的方式可以关闭全局这个检查。如果你对性能要求比较高,目前最好还是先关闭。 Istio 1.1的发布对性能进行了大幅优化。官方提供的数据是:1000 k8s service, 2000个sidecar,每秒70000个请求在这个mesh网格中。这时候每个proxy使用0.6个CPU,50M内存来支持每秒1000个请求。Istio的遥测,就是mixer需要0.6个cpu来支持每秒1000次的请求。这个地方并没有说是不是包括策略检查。我感觉是不包含的。pilot需要1个cpu和1.5G的内存来做服务下发。最后,Istio proxy对服务间调用的性能影响是tp90 8ms。 微服务体系带来的问题 原来的微服务体系中都面临哪些难题呢? 首当其冲是定位和调试困难。当遇到bug或者性能问题,原来的方式基本都是逐级排查,从客户遇到问题的地方开始。因为一个深层次的微服务会引起一系列的上层微服务出现问题。如果发现两个服务直接之间的整体调用性能不好,这个时候哪怕你找到某一次性能差的日志或数据,基于这个数据和日志找出来的原因不一定是root cause。这种排查问题的方式就像烽火台,你只看到了最近的烽火台,并不知道起点在哪。 第二,测试时数据会有遗漏,缺少完整的测试数据。 最好的测试数据是线上的真实数据。但是线上的请求采集下来还需要独立开发相应的程序,整体实现很麻烦。另外,如果测试微服务的错误处理,对于QA的黑盒测试来说,这还需要一个可配置的错误生成器。这点对于测试也是一个独立的工作。 第三,缺少上线流程。 我们原来使用独立的微服务作为开关,来判断是否加载新功能。在新的功能代码外层加上调用该微服务的代码,根据返回值来判断是否执行新功能代码,上线完成后再把开关代码删掉,的确有点麻烦。上线前需要修改源码增加控制,上线完成后还需要在源码中删除这些逻辑。没有简单、无侵入的金丝雀和灰度发布的实现方式。 第四,微服务间的网络调用策略配置不灵活。 不同的客户环境需要使用不同的网络策略,例如重试,超时等等设置,如果对应的设置没有通过配置文件暴露出来,就只能对代码进行修改。而且这些代码在业务代码里,统一的维护和升级都需要独立的流程。 灵雀云ASM如何解决上述问题? 灵雀云从去年就开始有针对性地在ASM产品中解决这些问题。下面是我们ASM的总体架构图: ...

June 10, 2019 · 1 min · jiezi

Linkerd-or-Istio哪个Service-Mesh框架更适合你

翻译 | 宋松原文 | https://medium.com/solo-io/li... 本周我开始写一篇比较Istio和Linked的帖子,并且告诉我自己:我将用一个表格来比较两者的特性,这将会很棒,人们会爱上它,这个世界将会幸福几秒钟。我向自己承诺这将是一个公平的比较,没有任何偏见。虽然比较的表格仍然存在,但我转移了文章的终点:目标不再是哪个更好,而是哪个更适合你、你的应用程序和你的组织。 在职业生涯的一段时间中,我曾担任某公司的售前架构师,记得有很多次我们被要求填写产品比较表。我经常需要运用创造力来确保产品看起来很好,几乎不惜一切代价避免表格中令人不愉快的“不支持”的框。考虑到诚信工作,但是有时候不得不这样做。 站在评价者的角度来看,我理解他们(希望)的目的是进行公平的比较,在这种程度上,对比的表格似乎是一种可靠的方式。我们知道一个项目的成功可以预测职业的发展,我们都喜欢这一点。但问题是:如果评估的最终目标是产品对比表格,而不是能让企业更有竞争力的高质量软件,那么这个评估的最后将只是一些“表格”的工作。 产品比较并不是最终目的,通过比较知道哪些对你的用例最好才是最终目的。因此让我们通过七个方面来深入研究Service Mesh,主要是以下几个方面: 流量管理安全安装/配置支持的环境监测策略管理性能对于上述七个方面中的每一个,我都将发表个人观点,希望我的观点能够帮你做出更接近于简洁的决策。 流量管理需要强调的是,Istio和Linkerd的区别在于数据平面使用了两种不同的代理技术。 Istio使用Envoy作为其代理。Envoy是C++编写的,最初是由Lyft构建,以便以非Kubernetes方式促进微服务的流量管理。许多公司已经将Envoy扩展为Kubernetes的ingress技术。 Linkerd(v2)使用的是一种名为Linkerd-proxy的专用服务网格代理。这个代理是使用Rust编写的,与该代理一起,许多低级代理(网络客户机与服务器)功能在另一个也是由rust编写名为Tower的项目中实现。Tower依赖于Tokio,Tokio是一个由Rust编写的事件驱动非阻塞I/O库。如果你和我一样欣赏统计学,那么Rust已经连续四年(2016、2017、2018、2019)一直是Stack-overflow最受欢迎的语言。 Istio是构建与Envoy之上的因此在流量管理方面它是占据优势的,Envoy已经包含了重要的IMHO功能,比如子集路由。用户仍然可以使用Linkerd实现金丝雀/蓝绿/a-b发布,但必须依靠单独的Kubernetes服务和能够分发流量的集群ingress技术,比如Gloo(gloo.solo.io)。 Linkerd团队在最近一次社区会议上公开表示,计划在未来的版本中实现更加高级的L7流量管理功能。 安全关于安全,我正在考虑保护通信通道的能力。Istio和Linkerd两者都提供了合理的安全保护功能。 Istio和Linkerd都依赖于外部根证书,因此两者都能保证进行安全通信。这听起来像是一个很好的周末项目,你觉得呢? 安装和配置 鉴于Istio可以安装在许多不同的平台上,安装说明可能会存在很大的不同。在写这篇文章的时候,关于Linkerd的安装,我对一些预先需要安装功能的检查印象很深刻。有很多次我在共享的Kubernetes集群中安装一些Linkerd功能时,我不清楚我是否拥有必要的权限。对于Linkerd,pre-check(或check-pre)检查你是否拥有在安装过程中创建Kubernetes所需资源的权限。 环境支持和部署模型对于是选择kubernetes或者是非Kubernetes安装,这是一个很直接的问题,Linkerd2是用基于kubernetes方式构建的,至少目前是这样的,而Istio收到了一下其他的公司的贡献,希望istio能在非kubernetes环境中运行。 考虑多集群部署,客观来说对于它的解释可能很棘手。从技术上来讲,共享根CA证书的多个不同集群(具有不同的控制平面)上的服务之间可以有效的通信。 Istio扩展了上述概念,因为它支持不同情形下的多个集群: 单个控制平面即可满足不同集群之间网络连接和pod之间IP寻址。通过使用具有单个控制平面的集群边界网关(egress和ingress)即可访问多个集群上的kubernetes API服务器。在上述两种情况下,包含控制平面的集群将成为mesh管理的SPOF(single point of failure)。在我们这个可以在同一区域下的多个可用区域上部署单个集群的世界中,这将不再是一个问题,但仍然不能完全忽略它。 监测 可以说Istio的管理控制台是一个缺失的部分。 Kiali Observability Console确实解决了一些管理员对service mesh所需的一些需求。 Kiali()是一个希腊词,意思是望远镜,从Kiali的网站上可以清楚的看到它打算成为一个可监测性的控制台,而不仅仅是一个Service Mesh管理控制台。 Linkerd控制台还不完整,但是社区决定也要构建一个管理仪表盘的目标是一个优势。 Linkerd未能提供请求追踪。想要以非侵入方式查看请求追踪跨度必须等待Linkerd实现该功能。Istio利用了Envoy支持添加追踪headers的事实。 应该提醒用户,应用程序需要准备好转发跟踪headers,如果没有准备,代理可以生成新的跟踪IDS,这可能会无意中将单个请求分割为多个请求跨度使请求之间失去必要的关联性。大多数开发框架都有转发headers的选项,而无需用户编写大量的代码。 策略管理Istio的爱好者,请欢欣鼓舞!Istio的策略管理能力令人印象深刻。 该项目构建了一个可扩展的策略管理机制,允许其他技术可从多个方面与Istio集成,请参阅下面的“template”列表以及一些集成的提供者。你可以认为“template”是一种集成。 为了突出其他策略类型,Istio也可适用于rating和limiting以及提供对主体身份验证的开箱即用支持。Linkerd用户依赖集群ingress控制器提供rating和limiting。 对于主体身份验证,我一直认为它应该委托给应用程序。请记住#4分布式计算的谬论:网络是安全的。对此持零信任策略。 Istio令人印象深刻的策略管理能力是需要代价的。考虑到他的广泛性,管理众多的选项增加了本已昂贵的运营成本。 Istio(Mixer)的策略管理组件也增加了显著的性能,我们将在下面详细讨论。 性能对比表在哪里?幸运的是,就在最近,发布了两个很棒的博客,对Istio和Linkerd的性能进行了比较,我在下面引用了其中一些结论: 对于这种综合工作负载,Istio的Envoy代理使用比Linkerd多50%的CPU。Linkerd的控制平面使用了一小部分Istio,特别是在考虑“core”组件时。 ——Michael Kipper — Benchmarking Istio & Linkerd CPU(https://medium.com/@ihcsim/li...) And… 在本实验中,与基线设置相比,Linkerd2-meshed设置和Istio-meshed设置都经历了更高的延迟和更低的吞吐量。在Istio-meshed设置中产生的延迟高于在Linkerd2-meshed设置中观察到的延迟。Linkerd2-Meshed设置能够处理比Istio-Meshed设置更高的HTTP和GRPC ping吞吐量。 ——Ivan Sim — Linkerd 2.0 and Istio Performance Benchmark(https://medium.com/@ihcsim/li...) ...

April 30, 2019 · 1 min · jiezi

Istio 1.1安装部署实践

3月20日,Istio 1.1版本正式发布,我们已在《全方位解读 | Istio v1.1正式发布》一文中为大家进行了简单介绍。本文将给大家带来详细的部署过程详解,需要说明的是,本文针对单集群安装部署,多集群安装部署会在后续文章中详细说明。前提条件正确安装配置Kubernetes集群CentOS Linux release 7.5.1804安装下载istio 1.1版本[root@vm157 ~]# wget https://github.com/istio/istio/releases/download/1.1.1/istio-1.1.1-linux.tar.gz ……2019-03-26 09:39:06 (483 KB/s) - ‘istio-1.1.1-linux.tar.gz’ saved [15736205/15736205]Istio安装有多种方式,本文根据helm template生成istio部署的配置文件,其他部署方式请参考官方文档。[root@vm157 ~]# cd istio-1.1.1/[root@ruffy istio-1.1.1]# helm template ../install/kubernetes/helm/istio-init –name istio-init –namespace istio-system > istio-init.yaml[root@ruffy istio-1.1.1]# kubectl get crds | grep ‘istio.io|certmanager.k8s.io’ | wc -l[root@ruffy istio-1.1.1]# InternalIp=10.20.1.175[root@ruffy istio-1.1.1]# helm template install/kubernetes/helm/istio –namespace istio-system &gt; –set global.mtls.enabled=true &gt; –set global.controlPlaneSecurityEnabled=true &gt; –set gateways.istio-ingressgateway.type=NodePort &gt; –set grafana.enabled=true &gt; –set servicegraph.enabled=true &gt; –set servicegraph.ingress.enabled=true &gt; –set servicegraph.ingress.hosts={servicegraph-istio-system.${InternalIp}.nip.io} &gt; –set tracing.enabled=true &gt; –set tracing.jaeger.ingress.enabled=true &gt; –set tracing.jaeger.ingress.hosts={jaeger-query-istio-system.${InternalIp}.nip.io} &gt; –set tracing.ingress.enabled=true &gt; –set tracing.ingress.hosts={tracing-istio-system.${InternalIp}.nip.io} &gt; –set kiali.enabled=true &gt; –set kiali.ingress.enabled=true &gt; –set kiali.ingress.hosts={kiali-istio-system.${InternalIp}.nip.io} &gt; –set kiali.dashboard.grafanaURL=http://grafana-istio-system.${InternalIp}.nip.io &gt; –set kiali.dashboard.jaegerURL=http://jaeger-query-istio-system.${InternalIp}.nip.io &gt; –name istio > ruffy/istio-${InternalIp}.yaml[root@vm175 istio-1.1.1]# cd ruffy[root@vm175 ruffy]# lsistio-10.20.1.175.yaml istio-init.yaml namespace.yaml根据配置模板部署Isito组件[root@vm175 istio-1.1.1]# kubectl apply -f ruffy/namespace.yamlnamespace/istio-system created [root@vm175 istio-1.1.1]# kubectl apply -f ruffy/istio-init.yamlconfigmap/istio-crd-10 createdconfigmap/istio-crd-11 createdserviceaccount/istio-init-service-account createdclusterrole.rbac.authorization.k8s.io/istio-init-istio-system configuredclusterrolebinding.rbac.authorization.k8s.io/istio-init-admin-role-binding-istio-system configuredjob.batch/istio-init-crd-10 createdjob.batch/istio-init-crd-11 created[root@vm175 istio-1.1.1]# kubectl apply -f ruffy/istio-10.20.1.175.yamlpoddisruptionbudget.policy/istio-galley createdpoddisruptionbudget.policy/istio-ingressgateway createdpoddisruptionbudget.policy/istio-policy createdpoddisruptionbudget.policy/istio-telemetry createdpoddisruptionbudget.policy/istio-pilot created……rule.config.istio.io/promhttp createdrule.config.istio.io/promtcp createdrule.config.istio.io/promtcpconnectionopen createdrule.config.istio.io/promtcpconnectionclosed createdhandler.config.istio.io/kubernetesenv createdrule.config.istio.io/kubeattrgenrulerule createdrule.config.istio.io/tcpkubeattrgenrulerule createdkubernetes.config.istio.io/attributes createddestinationrule.networking.istio.io/istio-policy createddestinationrule.networking.istio.io/istio-telemetry created查看Isito部署状态[root@vm175 istio-1.1.1]# kubectl -n istio-system get allNAME READY STATUS RESTARTS AGEpod/grafana-7b46bf6b7c-xr2lw 1/1 Running 0 2mpod/istio-citadel-5878d994cc-kfm7p 1/1 Running 0 2mpod/istio-cleanup-secrets-1.1.1-wlk7p 0/1 Completed 0 2mpod/istio-galley-6db4964df6-9lpsl 1/1 Running 0 2mpod/istio-grafana-post-install-1.1.1-44lv7 0/1 Completed 0 2mpod/istio-ingressgateway-cd5df7bc6-sgh5m 0/1 Running 0 2mpod/istio-init-crd-10-q5kvp 0/1 Completed 0 3mpod/istio-init-crd-11-kdd25 0/1 Completed 0 3mpod/istio-pilot-597dd58685-hsp72 1/2 Running 0 2mpod/istio-policy-67f66c8b5c-8kqwm 2/2 Running 5 2mpod/istio-security-post-install-1.1.1-gcjrm 0/1 Completed 0 2mpod/istio-sidecar-injector-59fc9d6f7d-j9prx 0/1 ContainerCreating 0 2mpod/istio-telemetry-c5bfc457f-qqzb5 2/2 Running 4 2mpod/istio-tracing-75dd89b8b4-2t2hl 0/1 ContainerCreating 0 2mpod/kiali-5d68f4c676-bdltq 1/1 Running 0 2mpod/prometheus-89bc5668c-7kp8b 0/1 Init:Error 1 2mpod/servicegraph-57bfbbd697-6tldj 0/1 Running 0 2m……NAME DESIRED SUCCESSFUL AGEjob.batch/istio-cleanup-secrets-1.1.1 1 1 2mjob.batch/istio-grafana-post-install-1.1.1 1 1 2mjob.batch/istio-init-crd-10 1 1 3mjob.batch/istio-init-crd-11 1 1 3mjob.batch/istio-security-post-install-1.1.1 1 1 2m增加grafana和prometheus的ingress文件Istio-grafana.yaml[root@vm175 ruffy]# cat istio-grafana-ingress.yamlapiVersion: extensions/v1beta1kind: Ingressmetadata: name: grafana namespace: istio-system labels: app: grafana annotations:spec: rules: - host: granafa-istio.10.20.1.175.xip.io http: paths: - path: / backend: serviceName: grafana servicePort: 3000 Isito-prometheus-ingress.yaml[root@vm175 ruffy]# cat istio-prometheus-ingress.yamlapiVersion: extensions/v1beta1kind: Ingressmetadata: name: istio-prometheus namespace: istio-systemspec: rules: - host: prometheus-istio.10.20.1.175.xip.io http: paths: - path: /prometheus backend: serviceName: prometheus servicePort: 9090查看部署的组件访问路径[root@vm175 ruffy]# kubectl -n istio-system get ingNAME HOSTS ADDRESS PORTS AGEgrafana granafa-istio.10.20.1.175.xip.io 80 5mistio-prometheus prometheus-istio.10.20.1.175.xip.io 80 5mistio-servicegraph servicegraph-istio-system.10.20.1.175.nip.io 80 56mistio-tracing tracing-istio-system.10.20.1.175.nip.io 80 56mkiali kiali-istio-system.10.20.1.175.nip.io 80 56m访问kiali时,出现secret不存在的情况,需要通过kiali-secret.yaml文件创建secret,并且重启kiali服务。Kiali-secret.yaml文件[root@vm175 ruffy]# cat kiali-secret.yamlapiVersion: v1kind: Secretmetadata: name: kiali namespace: istio-system labels: app: kiali type: Opaquedata: username: “YWRtaW4=” passphrase: “YWRtaW4=“访问Kiali浏览器输入地址:http://kiali-istio-system.10….用户名/密码:admin/admin访问servicegraph浏览器输入地址:http://servicegraph-istio-sys…访问tracing浏览器输入地址:http://servicegraph-istio-sys…访问granafa浏览器输入地址:http://granafa-istio.10.20.1….至此 Istio1.1及其依赖组件搭建完毕。 ...

March 27, 2019 · 2 min · jiezi

华尔街见闻基于istio的服务网格实践

距离2017年的见闻技术架构调整接近2年,随着业务线的发展,见闻技术部的项目数量、项目架构类型、基础设施规模、服务变更频率都在不断地增长,带给SRE的挑战是如何能更快地助力于开发人员更快更稳定地部署服务,保障线上服务的稳定。我们的后端开发团队仍然以Golang为主,不同业务线的技术选型不尽相同,同时存在Python,Java服务,这就需要SRE提供更易接入的微服务基础组件,常见的方案就是为每种语言提供适配的微服务基础组件,但痛点是基础组件更新维护的成本较高。为了解决痛点,我们将目光放到服务网格,它能利用基础设施下沉解决多语言基础库依赖问题,不同的语言不需要再引入各种不同的服务发现、监控等依赖库,只需简单的配置并运行在给定的环境下,就能享有以上功能,同时网络作为最重要的通信组件,可以基于它实现很多复杂的功能,譬如根据不同可用区进行的智能路由、服务熔断降级等。为此,我们调研了一些服务网格方案,包括Istio、Linkerd,基于我们的当前的后端架构特点:服务通信协议主要基于gRPC、HTTP基于Kubernetes的Docker部署拥抱开源,使用了Prometheus、Grafana作为监控,Zipkin作为链路追踪等对比下来,Istio拥有更多活跃的开源贡献者,迭代速度快,以及Istio架构可行性讨论,我们选择Istio作为实践方案。架构这张图介绍了见闻典型的服务网格架构,左半图介绍了一个用户请求是如何处理,右半图介绍运维系统是如何监控服务,若无特殊说明,服务都是部署在腾讯云托管Kubernetes。组件一览Go(1.11) 后端语言。Docker(17.12.1-ce) 容器技术。Kubernetes(1.10.5,托管于腾讯云容器平台) 容器编排工具。Istio(1.0.0) 服务网格开源方案,支持与Kubernetes集成。Ingress, Proxy(Istio 1.0.0)服务流量转发、智能代理,基于Envoy实现,Istio二次开发Proxy。Pilot Discovery(Istio 1.0.5)负责服务发现,通过监听Kubernetes中Service、Pod等资源维护服务映射表。Mixer Policy(Istio 1.0.5)管理服务之间访问权限,提供gRPC形式的Check接口。Mixer Telemetry(Istio 1.0.5)负责接收服务指标数据,提供gRPC形式的Report接口。Citadel负责管理代理证书。Dashboard 基于Kubernetes Dashboard二次开发的Istio Dashboard,负责管理Istio服务发布,配置变更等。Grafana 负责监控数据可视化。Prometheus 时序数据库,常用于监控系统。Jaeger 负责服务链路追踪,组件包括collector、Jaeger UI。Cassandra 分布式NoSQL数据库,用于Jaeger指标数据存储。用户请求分析我们先从用户请求端开始,用户的请求通过Tencent 4层LB转发到基于Envoy的Istio Ingress,Ingress根据配置将请求路由到Service A所在的PodService A所在Pod接收Ingress请求访问Service A的请求会先到达Proxy再由它转发到Service A进程Service A向Service B发出的请求被iptables路由到Proxy(下文会提到iptables的初始化)Proxy进程发起对Service B所在Pod的请求Proxy进程同步请求Mixer Policy服务,检查是否允许访问Service B,检查通过,开始请求Proxy进程记录请求的指标(QPS,Latency,Status Code分布等),异步并批量上报到Mixer Telemetry服务,这里是客户端指标。Service B所在Pod接收请求Service B Proxy接收请求并路由到Service B所在进程Proxy进程记录请求的指标(QPS,Latency,Status Code分布等),异步并批量上报到Mixer Telemetry服务,这里是服务端指标。Service B进程处理完请求并返回数据原路返回到用户端以上的流程可以观察到,服务之间通信完全依靠Proxy进程完成,Proxy进程接管同一个Pod中服务的出入流量,完成请求的路由。架构可行性通过架构图以及以上流程,我们拆分出以下关键组件,观察其性能、可用性、拓展性。Istio Ingress高性能,可拓展Istio Ingress用来处理用户入流量,使用Envoy实现,转发性能高。挂载在负载均衡后,通过增加实例实现可拓展。Istio Proxy随应用部署,轻微性能损耗,可随应用数量拓展Istio Proxy以Sidecar形式随应用一起部署,增加2次流量转发,存在性能损耗。性能: 4核8G服务器,上面运行Proxy服务和API服务,API服务只返回ok字样。(此测试只测试极限QPS)单独测试API服务的QPS在59k+,平均延时在1.68ms,CPU占用4核。通过代理访问的QPS7k+,平均延时14.97ms,代理CPU占用2核,API服务CPU占用2核。CPU消耗以及转发消耗降低了QPS,增加了延时,通过增加机器核数并增加服务部署数量缓解该问题,经过测试环境测试,延时可以接受。可用性:基于Envoy,我们认为Envoy的可用性高于应用。依赖Pilot Discovery进行服务路由,可用性受Pilot Discovery影响。拓展性:Sidecar形式,随应用数拓展Istio Policy服务可拓展,但同步调用存在风险Istio Policy需要在服务调用前访问,是同步请求,会增加服务调用延时,通过拓展服务数量增加处理能力。属于可选服务,见闻生产未使用该组件。性能: 未测试可用性:若开启Policy,必须保证Policy高可用,否则正常服务将不可用拓展性:增加实例数量进行拓展Istio Telemetry监控收集服务性能: 从监控上观察Report 5000qps,使用25核,响应时间p99在72ms。异步调用不影响应用的响应时间。可用性:Telemetry不影响服务可用性拓展性:增加实例数量进行拓展Pilot Discovery性能: 服务发现组件1.0.5版本经过监控观察,300个Service,1000个Pod,服务变更次数1天100次,平均CPU消耗在0.01核,内存占用在1G以内。可用性: 在服务更新时需要保证可用,否则新创建的Pod无法获取最新路由规则,对于已运行Pod由于Proxy存在路由缓存不受Pilot Discovery关闭的影响。拓展性:增加实例数量可以增加处理量。可以看到各个组件的可用性、拓展性都有相应的策略达到保障,我们认为Istio是具有可实施性的。Istio流量控制背后Pilot Discovery: Istio的交通大脑Pilot Discovery负责Istio服务发现,支持在Kubernetes里部署,它读取K8S资源配置,并生成Proxy可用的路由表。以下面的Service A服务为例,介绍Istio如何进行精细路由。Discovery与对应K8S集群的API server相连,拉取全量资源信息,并使用Watch方法对增量变更进行同步。根据Service A的配置,生成对应Service A的路由配置,通过gRPC形式的ADS接口提供给Proxy。Proxy同步到最新配置,热更新后配置生效。要知道如果在Istio访问一个服务,必须得声明K8S Service。Istio通过K8S CRD拓展K8S已有的服务访问能力,我们列举网络相关常用的配置:Gateway控制Istio Ingress的路由转发及TLS证书绑定。VirtualService服务流量控制,实现如A/B测试、错误注入、服务保护等。DestinationRule用于目标服务的版本管理,根据Pod的Label区分目标服务的版本,联合VirtualService进行流量控制。以下举个例子介绍如何利用它们配置同样大小流量到服务的不同版本,# serviceA.yamlkind: ServiceapiVersion: v1metadata: name: serviceA labels: app: serviceAspec: ports: - name: http-8080 protocol: TCP port: 8080 targetPort: 8080 selector: app: serviceA type: ClusterIP # virtualServiceA.yamlapiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata: name: serviceAspec: hosts: - serviceA http: - route: - destination: host: serviceA subset: v1 - route: - destination: host: serviceA subset: v2 —# destinationRuleapiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata: name: serviceAspec: host: serviceA subsets: - labels: version: v1 name: v1 - labels: version: v2 name: v2以上实现了Istio服务调用serviceA时,会随机地50%概率到serviceA的v1版本,50%概率到serviceA的v2版本。可以看到,VirtualService通过hosts关联serviceA,在http区域有两个route,分别是subset v1, subset v2,v1,v2依赖DestinationRule来定义,同样用host来标注该DestinationRule控制哪个host的访问,以及通过pod label中version来划分不同版本。流量控制方面,Istio有相当丰富的功能支持,同时也带来了相当的复杂度,建议用户根据日常的使用频率在后台实现相应的前端控制台,利用自动化来完成流量控制。Proxy工作机制自动注入在K8S 1.9之后的版本,Istio利用K8S提供的MutatingAdmissionWebhook在K8S创建Pod前回调Istio提供的istio-sidecar-injector动态修改Pod配置,添加以Sidecar形式运行的Proxy。这里开启自动注入有两个维度,一是namespace,namespace需要添加istio-injection : enabled标签,这样实现该namespace下的所有Pod自动注入Proxy;二是deployment可以设置annotation关闭自动注入。如果K8S版本不够,可以利用命令行工具修改Deployment的配置。接管Pod流量Service A所在Pod至少运行Service A应用容器以及用于代理的Envoy容器,创建Pod时proxy-init命令负责获取Pod监听的端口和具体协议,以此初始化网络,利用iptables将容器网络出入流量都转发到Proxy监听的localhost端口。 若Service A的Pod声明servicePort为8080:HTTP,最终Proxy将会接收8080端口的Pod入流量和全部的Pod出流量。服务发现Proxy基于Envoy,与Pilot Discovery连接,动态同步Kubernetes集群中所有的服务信息:服务与Pod IP、端口之间的映射表,通过路由信息实现智能路由,从而使服务发现从业务代码中剥离。链路追踪Proxy支持设置Zipkin URL,异步上报链路追踪数据。服务质量监控Proxy将属性包上报给Telemetry服务,Telemetry根据用户的配置生成指标数据并由Prometheus收集。适配Istio我们目前的服务部署在腾讯云托管Kubernetes,节点使用16核32G的网络增强型机器,所有的后端服务都以Docker部署,K8S集群外部署高可用ETCD支持集群内服务发现,数据库以MySQL、Cassandra、MongoDB为主,消息队列采用Kafka、NSQ。在应用Istio的过程中,我们对基础库进行了修改,删减了Istio已提供的功能并完成了对Istio的适配。前情提要见闻旧后端服务架构,所有Golang服务以打包成Docker镜像,以"gRPC"协议通信。去"框架"见闻Golang后端使用go-micro框架,一个支持多插件的Golang微服务框架,作者将组件分成transport,server,client,registry,codec等,通过组合不同类型的组件非常灵活地配置微服务技术栈。对于有定制需求的微服务架构,是值得推荐的选择。通信协议作为服务互通的基石,Istio对gRPC和HTTP非常友好,根据协议Istio能解析HTTP头中的信息,支持提取指标以供分析。go-micro只是利用HTTP和gRPC作为通信协议,但是协议的解析逻辑是协议无关的,所以可以说它只是用了这些通信协议的外壳,传输的报文内容是"micro方言",这就导致了Golang暴露的服务无法被其它语言其它框架调用。为了将协议能在多语言中完全统一,也为了更好地使用Istio的监控统计功能,这个时候我们开始对go-micro的存留有一些新的思考,我们是否还需要go-micro?经过近2年的生产实践,我们是不是可以更精简我们的框架?经过这些思考过后,我们的决定是去go-micro框架,拥抱更轻量级的基础框架,这个框架只要支持:gRPC纯原生即可Istio支持Istio的基础功能,譬如一些HTTP header转发等改动尽量小我们已经存在上百个Golang项目,避免改动Golang项目代码,将改动放到基础库为佳go-micro通过定义自制protobuf插件的方式在stub代码中集成框架功能,经过对逻辑的梳理,我们决定复写protobuf插件,生成兼容micro的stub代码,通过对micro接口的向后兼容,开发人员不需要修改代码,只需要在CI阶段运行protoc即时生成新版代码。详情可见再见,micro运维流程右半图描述运维人员如何利用运维后台运维Kubernetes集群,Istio的运维必须有自动化的工具来减少人工配置带来的错误,见闻的旧运维后台基于腾讯云容器平台暴露的开放API,在引入Istio后,功能依赖于更细节的label以及CRD(Custom Resource Definition),于是得依托更细粒度的Kubernetes API,新的后台需要能完成基本的Kubernetes运维,而且结合Istio的实际进行日常更新,经过选型,见闻基于Kubernetes Dashboard二次开发了Istio部分的一些功能(APP部署、更新,Istio配置更新等),利用Istio Dashboard实现APP创建、部署接口,并由此重构原有的运维后台。最终,SRE提供两个后台,精细控制的Istio Dashboard;提供给开发人员日常更新使用的简化版后台。服务发布日常最重要、最高频的功能,服务版本变更。服务创建服务创建包括对老服务的改造,一个K8S服务要经过一些配置上的更新才能成为Istio APP。一个Kubernetes服务需要满足以下要求来获得Istio的功能支持:Service资源声明服务监听的端口号以及协议这里的服务端口声明中name字段值需要以协议名为起始值,譬如grpc、http、tcp、udp等,istio识别前缀,用于初始化Proxy,譬如grpc-svc,http-svc,不正确的端口命名会引起Proxy的异常行为,以及监控服务无法捕获该协议下的指标。服务探活接口每个后端服务提供一个HTTP探活接口,这样服务启动时,不至于让其它服务访问到未就绪的状态。对于HTTP探活接口的定义包括Proxy以及APP是否初始化完成,见闻的实践是在基础镜像中打入一个探活程序:检测Proxy是否初始化通过Proxy的配置同步时间与Pilot Discovery的配置更新时间对比,相同时认为其就绪。APP自定义接口APP可以在指定端口提供就绪API。# serviceA.yamlkind: ServiceapiVersion: v1metadata: name: serviceA namespace: default labels: app: serviceAspec: ports: - name: grpc protocol: TCP port: 10088 targetPort: 10088 selector: app: serviceA type: ClusterIPDeployment资源要求有必要的两个label:app和version,明确定义流量控制中的目标服务。可以看例子中deployment的app为serviceA,version为v1。声明对外服务的端口,要求Proxy对指定端口入流量的接管。例子中ports声明了10088端口。# deploymentA.yamlkind: DeploymentapiVersion: extensions/v1beta1metadata: name: serviceA-v1 labels: app: serviceA version: v1spec: replicas: 1 selector: matchLabels: app: serviceA version: v1 template: metadata: labels: app: serviceA version: v1 spec: containers: - name: serviceA image: ‘some-image’ ports: - containerPort: 10088 protocol: TCP resources: requests: cpu: 1000m livenessProbe: httpGet: path: /health port: 54321 scheme: HTTP initialDelaySeconds: 1 timeoutSeconds: 2 periodSeconds: 5 successThreshold: 1 failureThreshold: 3 terminationMessagePath: /dev/termination-log terminationMessagePolicy: File imagePullPolicy: Always securityContext: privileged: false restartPolicy: Always terminationGracePeriodSeconds: 30 dnsPolicy: ClusterFirst符合以上要求,服务能正确接入Istio系统并获得服务发现和监控的能力。服务更新Istio提供流量控制,给运维带来方便的A/B测试,用于根据指定规则迁移流量。见闻的服务更新依靠Istio流量迁移功能,发布服务的新版本,并将流量通过Istio规则迁移到新版本,实际细节如下:更新流量控制将流量指向已有版本以下实例利用VirtualService将ServiceA的服务流量全部指向已存在的v1版本# virtualServiceapiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata: name: serviceAspec: hosts: http: - route: - destination: host: serviceA subset: v1—# destinationRuleapiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata: name: serviceAspec: host: serviceA subsets: - labels: version: v1 name: v1```部署新版本的Deployment查找符合app label的deployment,运维人员基于该deployment创建v2版本的deployment,并向destinationRule中增加v2版本。# destinationRuleapiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata: name: serviceAspec: host: serviceA subsets: - labels: version: v1 name: v1 - labels: version: v2 name: v2更新流量控制将流量指向新版本以下实例利用VirtualService将ServiceA的服务流量全部指向v2版本# virtualServiceapiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata: name: serviceAspec: hosts: - serviceA http: - route: - destination: host: serviceA subset: v2下线v1版本的deployment,删除DestinationRule中的v1使用Istio Dashboard来实现上述流程Ingress配置为什么使用Istio Ingress作为新的Ingress方案?过去我们使用腾讯云托管的Kubernetes Ingress,为了对Ingress流量控制而引入Istio Ingress。我们之前提到Istio Ingress是基于Envoy,它读取Istio控制的配置进行路由,与其它内部服务一样方便地接入Istio所有功能。除了VirtualService和DestinationRule,Istio定义了Gateway来控制实例支持的Host和证书。具体的流程是:创建Istio Ingress提供的Deployment和Service创建Deployment ingressgateway时,以ConfigMap的形式挂载Ingress需要的证书。配置Gateway配置Ingress接收具体域名(如wallstreetcn.com)的流量,以及对应的TLS证书位置,这里的证书路径已经挂在到Ingress的Deployment上。以下是一个典型的Gateway配置。apiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata: name: wallstreetcn-com namespace: istio-systemspec: selector: istio: ingressgateway servers: - hosts: - wallstreetcn.com port: name: http number: 80 protocol: HTTP - hosts: - wallstreetcn.com port: name: https number: 443 protocol: HTTPS tls: mode: SIMPLE privateKey: /etc/istio/ingressgateway-certs/tls.key serverCertificate: /etc/istio/ingressgateway-certs/tls.crt配置完成后,再配合VirtualService的路由控制,控制Ingress的反向代理到default命名空间下的gateway服务80端口,如下所示:apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata: name: wallstreetcn-com namespace: istio-systemspec: gateways: - wallstreetcn-com hosts: - wallstreetcn.com http: - route: - destination: host: gateway.default.svc.cluster.local port: number: 80监控指标Istio支持Prometheus拉取集群指标,并提供Grafana看板展示。这里建议初期使用Istio自带的Grafana看板配置,并且注意Kubernetes主机的类型划分,Prometheus服务适合放在内存型机器。可以与Dashboard集成,在发布服务过程中即时查看指标。服务质量Istio自带一些默认的Grafana面板,统计所有可以被访问的HTTP/gRPC服务的返回码以及延时情况。对于返回码,认为5xx为错误,并在面板上使用label_join((sum(rate(istio_requests_total{reporter=“destination”, response_code!~“5.”}[1m])) by (destination_workload, destination_workload_namespace) / sum(rate(istio_requests_total{reporter=“destination”}[1m])) by (destination_workload, destination_workload_namespace)), “destination_workload_var”, “.”, “destination_workload”, “destination_workload_namespace”)计算服务错误率。对于延时情况采用histogram_quantile获取多维度p50、p90、p95、p99的延时分布。链路追踪之前提到Proxy由Envoy实现,Envoy支持设置Zipkin上报API,Proxy在收发请求时将链路指标上报到Zipkin,为了实现链路追踪,Proxy在流量转发中解析协议中的HTTP或gRPC请求头,找出其中的追踪头,组装成指标。所以应用端需要在收到调用方请求时解析出请求头,并持续携带该请求头向后传递。由于见闻在Ingress之后映射一个HTTP gateway,请求从Ingress转发到HTTP gateway,再发送到后续的gRPC服务,所以HTTP gateway有段代码生成gRPC请求头。import ( “github.com/labstack/echo” gmeta “google.golang.org/grpc/metadata”)// Create a gRPC context from Echo.func NewContextFromEcho(ec echo.Context) context.Context { md := gmeta.MD{} for _, header := range []string{ “x-request-id”, “x-b3-traceid”, “x-b3-spanid”, “x-b3-parentspanid”, “x-b3-sampled”, “x-b3-flags”, “x-ot-span-context”, } { md.Set(header, ec.Request().Header.Get(header)) } md.Set(“x-b3-parentspanid”, ec.Request().Header.Get(“x-b3-spanid”)) return gmeta.NewOutgoingContext(context.Background(), md)}在后续的gRPC服务调用中使用该Context,至于gRPC服务之间的调用,我们发现会自动将context传递到下一个服务,所以没有做类似处理。这里追踪的数据如果全量捕获将会是非常大的,并且对于监控来说也不必要,所以可以设置抽样率,Istio提供ConfigMap中设置抽样率,一般来说设置成1%即可。实践中的宝贵经验在Istio实践过程中,有哪些需要注意的问题。API server的强依赖,单点故障Istio对Kubernetes的API有很强的依赖,诸如流量控制(Kubernetes资源)、集群监控(Prometheues通过Kubernetes服务发现查找Pod)、服务权限控制(Mixer Policy)。所以需要保障API server的高可用,我们曾遇到Policy组件疯狂请求Kubernetes API server使API server无法服务,从而导致服务发现等服务无法更新配置。 为避免这种请求,建议使用者了解与API server直接通信组件的原理,并尽量减少直接通信的组件数量,增加必要的Rate limit。* 尽量将与API server通信的服务置于可以随时关闭的环境,这是考虑如果部署在同一Kubernetes集群,如果API server挂掉,无法关闭这些有问题的服务,导致死锁(又想恢复API server,又要依靠API server关闭服务)服务配置的自动化服务配置是Istio部署后的重头戏,避免使用手动方式更改配置,使用代码更新配置,将常用的几个配置更新操作做到运维后台,相信手动一定会犯错的事实。关于Pilot DiscoveryPilot Discovery 1.0.0版本有很大的性能问题,1.0.4有很大的性能提升,但引入了一个新bug,所以请使用1.0.5及以上的版本,该版本在见闻的平均CPU负载从10核降到了0.5核,大大降低了Proxy同步配置的延时。关于Mixer Policy 1.0.0这个组件曾导致API server负载过高(很高的list pods请求),所以我们暂时束之高阁,慎用。性能调优在使用Proxy、Telemetry时,默认它们会打印访问日志,我们选择在生产上关闭该日志。时刻观察Istio社区的最新版本,查看新版本各个组件的性能优化以及bug修复情况,将Istio当做高度模块化的系统,单独升级某些组件。上面就提到我们在Istio1.0的基础上使用了1.0.5版本的Policy、Telemetry、Pilot Discovery等组件。服务平滑更新和关闭Istio依靠Proxy来帮助APP进行路由,考虑几种情况会出现意外的状态:* APP启动先于Proxy,并开始调用其它服务,这时Proxy尚未初始化完毕,APP调用失败。* Service B关闭时,调用者Service A的Proxy尚未同步更新Service A关闭的状态,向Service B发送请求,调用失败。第一种情况要求APP有重试机制,能适当重试请求,避免启动时的Proxy初始化与APP初始化的时差。第二种情况,一种是服务更新时,我们使用新建新服务,再切流量;一种是服务异常退出,这种情况是在客户端重试机制。希望使用Istio的开发人员有更好的解决方案。下一步计划见闻Istio化已于去年10月份完成并上线,我们的线上集群中Istio和非Istio的APP混合部署,上千的Pod数量曾对不够健壮的服务发现组件造成巨大的压力,在这期间曾遇到Istio的一些惊喜,并不断总结经验,希望给之后使用Istio的同学一些借鉴。之后的过程中,SRE的目标依然是保障线上服务的健壮性。Istio Dashboard优化APP部署流程,考虑自动部署的功能,通过服务指标自动完成灰度发布和流量迁移。PrometheusPrometheus的高可用、可拓展方案的探索。 ...

March 12, 2019 · 3 min · jiezi

深度解析Istio系列之流量控制篇

得益于良好的模块化设计,Istio的各个组件设计清晰,分工明确,几个大的组件之间甚至可以独立工作,所以接下来我们将逐一深入分析Istio的各个组件。本文首先详细分析一下我们最常用的流量管理功能所对应的模块——Pilot和Envoy。Istio基本架构Istio基本架构图如下图所示,网格东西向及南北向的流量控制,核心思路是由Pilot维护管理策略,并通过标准接口下发到Envoy Proxy中,由Envoy最终实现流量的转发。Istio服务网格逻辑上分为数据平面和控制平面:数据平面:由一组以Sidecar方式部署的智能代理(Envoy)组成,这些代理可以调节和控制微服务之间所有的网络通信。控制平面:服务管理和配置代理来路由流量。其中与流量管理相关的主要包括控制层面的Pilot以及数据层面的Envoy Proxy。控制平面组件——PilotPilot的基本架构如下图所示。Pilot功能根据上图,Pilot主要实现下述功能:1.统一服务模型统一服务模型主要功能是从底层平台获取服务相关信息以及通过RuleAPI定义的服务间流量规则,以kubernetes为例,统一服务模型从平台上获取注册在Pod、Service、Node以及流量规则信息,获取到各种信息后转变成数据平面上可理解的数据格式存储在Abstract Model中。2.标准数据平面API获取到各种服务信息以及流量规则之后,会通过该API下发到数据面的Sidecar中。3.业务DSL语言(Domain Specific Language)SL语言提供了面向业务的高层抽象,可以被运维人员理解和使用。运维人员使用该DSL定义流量规则并下发到Pilot,这些规则被Pilot翻译成数据面的配置,再通过标准API分发到Envoy实例,可以在运行期对微服务的流量进行控制和调整。Pilot的规则DSL是采用K8S API Server中的Custom Resource (CRD)实现的,因此和其他资源类型如Service Pod Deployment的创建和使用方法类似,都可以用Kubectl进行创建。通过运用不同的流量规则,可以对网格中微服务进行精细化的流量控制,如按版本分流,断路器,故障注入,灰度发布等。2Pilot实现与Pilot相关的服务主要有两个:(1)Discovery Service对应的docker为gcr.io/istio-release/pilot,进程为pilot-discovery,该组件的功能包括:从Service Provider中获取服务信息,除了这里主要介绍的Kubernetes之外,Istio还支持Consul作为Service Provider。从Kubernetes API Server中获取流量规则(Kubernetes CRD Resource)。将服务信息和流量规则转化为数据面可以理解的格式,通过标准的数据面API下发到网格中的各个Sidecar中。(2)Kubernetes API Server提供Pilot相关的CRD Resource的增、删、改、查。和Pilot相关的CRD有以下几种:Virtualservice:用于定义路由规则,如根据来源或 Header 制定规则,或在不同服务版本之间分拆流量。DestinationRule:定义目的服务的配置策略以及可路由子集。策略包括断路器、负载均衡以及 TLS 等。ServiceEntry:用 ServiceEntry 可以向Istio中加入附加的服务条目,以使网格内可以向Istio 服务网格之外的服务发出请求。Gateway:为网格配置网关,以允许一个服务可以被网格外部访问。EnvoyFilter:可以为Envoy配置过滤器。由于Envoy已经支持Lua过滤器,因此可以通过EnvoyFilter启用Lua过滤器,动态改变Envoy的过滤链行为。我之前一直在考虑如何才能动态扩展Envoy的能力,EnvoyFilter提供了很灵活的扩展性。数据平面组件——Envoy1Envoy实现Istio通过K8s的Admission Webhook机制实现了sidecar的自动注入,Istio集群中的每个微服务会被加入Envoy相关的容器。下面是官方示例productpage微服务的Pod内容,可见除productpage之外,Istio还在该Pod中注入了两个容器gcr.io/istio-release/proxy_init和gcr.io/istio-release/proxyv2。1.初始化容器器proxy_initProductpage的Pod中有一个InitContainer proxy_init,InitContrainer是K8S提供的机制,用于在Pod中执行一些初始化任务,在Initialcontainer执行完毕并退出后,才会启动Pod中的其它container。在proxy_init中执行iptables.sh脚本,该脚本的作用是通过配置iptable来劫持Pod中的流量。2.运行时Sidecar容器器proxyv2Envoy的大部分配置都是dynamic resource,包括网格中服务相关的service cluster, listener, route规则等。这些dynamic resource是通过xDS接口从Istio控制面中动态获取的。但Envoy如何知道xDS server的地址呢?这是在Envoy初始化配置文件中以static resource的方式配置的。在Proxyv2容器运行时,有两个进程pilot-agent和envoy。1)pilot-agent进程该进程根据K8S API Server中的配置信息生成Envoy的配置文件,并负责启动Envoy进程。注意Envoy的大部分配置信息都是通过xDS接口从Pilot中动态获取的,因此Agent生成的只是用于初始化Envoy的少量静态配置。2)envoy进程Envoy由Pilot-agent进程启动,启动后,Envoy读取Pilot-agent为它生成的配置文件,然后根据该文件的配置获取到Pilot的地址,通过数据面标准API的xDS接口从pilot拉取动态配置信息,包括路路由(route),监听器器(listener),服务集群(cluster)和服务端点(endpoint)。Envoy初始化完成后,就根据这些配置信息对微服务间的通信进行寻址和路由。Envoy相关概念数据面组件中涉及的概念比较多,这里列举如下。Host:能够进行网络通信的实体(在手机或服务器等上的应用程序)。在 Envoy 中主机是指逻辑网络应用程序。只要每台主机都可以独立寻址,一块物理硬件上就运行多个主机。Downstream:下游(downstream)主机连接到 Envoy,发送请求并或获得响应。Upstream:上游(upstream)主机获取来自 Envoy 的链接请求和响应。 Cluster:集群(cluster)是Envoy 连接到的一组逻辑上相似的上游主机。Envoy 通过服务发现发现集群中的成员。Envoy 可以通过主动运行状况检查来确定集群成员的健康状况。Envoy 如何将请求路由到集群成员由负载均衡策略确定。Mesh:一组互相协调以提供一致网络拓扑的主机。Envoy mesh 是指一组 Envoy 代理,它们构成了由多种不同服务和应用程序平台组成的分布式系统的消息传递基础。运行时配置:与 Envoy一起部署的带外实时配置系统。可以在无需重启 Envoy 或更改 Envoy 主配置的情况下,通过更改设置来影响操作。Listener: 侦听器(listener)是可以由下游客户端连接的命名网络位置(例如,端口、unix域套接字等)。Envoy 公开一个或多个下游主机连接的侦听器。一般是每台主机运行一个 Envoy,使用单进程运行,但是每个进程中可以启动任意数量的 Listener(监听器),目前只监听 TCP,每个监听器都独立配置一定数量的(L3/L4)网络过滤器。Listenter 也可以通过 Listener Discovery Service(LDS)动态获取。Listener filter:Listener 使用 listener filter(监听器过滤器)来操作链接的元数据。它的作用是在不更改 Envoy 的核心功能的情况下添加更多的集成功能。Listener filter 的 API相对简单,因为这些过滤器最终是在新接受的套接字上运行。在链中可以互相衔接以支持更复杂的场景,例如调用速率限制。 Envoy 已经包含了多个监听器过滤器。Http Route Table:HTTP 的路由规则,例如请求的域名,Path 符合什么规则,转发给哪个 Cluster。Health checking:健康检查会与SDS服务发现配合使用。但是,即使用其他服务发现方式,也有相应需要进行主动健康检查的情况。xDS:xDS是一个关键概念,它是一类发现服务的统称,通过对 xDS 的请求来动态更新 Envoy 配置,其包括如下几类:CDS:Cluster Discovery ServiceEDS:Endpoint Discovery ServiceSDS:Service Discovery ServiceRDS:Route Discovery ServiceLDS:Listener Discovery ServiceEnvoy配置Envoy的配置包含两部分,初始化配置和动态更新的配置。1.Envoy初始配置Pilot-agent进程根据启动参数和K8S API Server中的配置信息生成Envoy的初始配置文件,并负责启动Envoy进程。从ps命令输出可以看到Pilot-agent在启动Envoy进程时传入了pilot地址和zipkin地址,并为Envoy生成了一个初始化配置文件envoy-rev0.json。2.Envoy动态更新配置通过管理接口获取完整配置。从Envoy初始化配置文件中,我们可以大致看到Istio通过Envoy来实现服务发现和流量管理的基本原理。即控制面将xDS server信息通过static resource的方式配置到Envoy的初始化配置文件中,Envoy启动后通过xDS server获取到dynamic resource,包括网格中的service信息及路由规则。详细流程如下:Pilot-agent根据启动参数和K8S API Server中的配置信息生成Envoy的初始配置文件envoy-rev0.json,该文件告诉Envoy从xDS server中获取动态配置信息,并配置了了xDS server的地址信息,即控制面的Pilot。Pilot-agent使用envoy-rev0.json启动Envoy进程。Envoy根据初始配置获得Pilot地址,采用xDS接口从Pilot获取到Listener,Cluster,Route等d动态配置信息。Envoy根据获取到的动态配置启动Listener,并根据Listener的配置,结合Route和Cluster对拦截到的流量进行处理。服务间交互流程下图表述了服务与服务之间通过sidecar进行交互的流程。基本流程分析如下:Productpage发起对Details的调用:http://details:9080/details/0 。请求被Pod的iptable规则拦截,转发到15001端口。Envoy的Virtual Listener在15001端口上监听,收到了该请求。请求被Virtual Listener根据原目标IP(通配)和端口(9080)转发到0.0.0.0_900这个listener。根据0.0.0.0_9080 listener的http_connection_manager filter配置,该请求采用"9080" route进行分发。“9080"这个route的配置中,host name为details:9080的请求对应的cluster为outbound|9080||details.default.svc.cluster.local。outbound|9080||details.default.svc.cluster.local cluster为动态资源,通过eds查询得到其endpoint为192.168.206.21:9080。请求被转发到192.168.206.21,即Details服务所在的Pod,被iptable规则拦截,转发到15001端口。Envoy的Virtual Listener在15001端口上监听,收到了该请求。请求被Virtual Listener根据请求原目标地址IP(192.168.206.21)和端口(9080)转发到192.168.206.21_9080这个listener。根据92.168.206.21_9080 listener的http_connection_manager filter配置,该请求对应的cluster为 inbound|9080||details.default.svc.cluster.local 。inbound|9080||details.default.svc.cluster.local cluster配置的host为127.0.0.1:9080。请求被转发到127.0.0.1:9080,即Details服务进行处理。参考链接https://zhaohuabing.com/post/…https://istio.io/zh/docs/conc...https://www.cnblogs.com/xishu… ...

March 11, 2019 · 1 min · jiezi

[译] 使用 Kubernetes 和 Istio 管理微服务

当一个分布式的微服务架构不断地变得庞大和复杂之后,理解和管理服务之间的网络调用变得越来越艰难。然而,服务的监控、A/B 测试、金丝雀发布、访问控制、端到端认证等等又都是一些常见的必须的要求。”服务网格(service mesh)“这个概念,便是用来描述一个微服务之间的网络层,并用于解决这些问题。这篇文章会先给予服务网格一个简略的概述,然后用一个 Kubernetes 和 Istio 的简单应用来展示如果使用它来管理流量,注入错误(inject faults)和监控服务。服务网格概述一个服务网格就是在服务的请求/响应之上的一个通信层(communication layer),用于提供一些保证服务健康的功能:零信任安全模型(zero-trust security),用于保证服务间通信的安全链路追踪,用于展示服务之间的通信状态。错误容忍和注入,用于试验和论证应用的可用性。高级路由,用于执行 A/B 测试,版本切换等需求。一个服务网格可能存在于 Kubernetes 集群中的好几个地方:作为一个依赖包存在于微服务应用的代码中。作为一个 Node Agent 或 Deamon 存在于 Kubernetes 的节点中。作为一个附属容器(Sidecar container)和应用容器跑在同一个 pod 里。作为一个依赖包在这种实现下,每一个微服务应用都会引入一个实现了服务网格功能的依赖包(比如 Hystrix 和 Ribbon)。这种实现的一个好处便是由于代码是真实运行在微服务的容器中的,执行服务网格功能的资源分配是由操作系统分配的。另一个好处是服务网格并不需要了解底层的基础设施,例如,一个容器的运行并不需要知道底层服务器的细节。这种实现的一个主要缺陷是如果要支持各种编程语音的微服务,这个依赖包要使用各种编程语言被实现好多次,同一套功能逻辑被反复重复实现。作为 Kubernetes 节点的 Node Agent在这种实现下,每一个 Kubernetes 节点上都会运行一个独立的 Node Agent ,这种实现和 Kubernetes 集群中每一个节点都会存在一个默认的 kube-proxy 很类似。这种实现可以忽略下层各种微服务具体实现的编程语言,释放了很多重复劳动的生产力。与依赖包的实现相反,这种实现需要和底层的基础设施合作。应用需要将它们的网络代理到 Agent 中。作为一个附属容器在这种实现下,每一个应用容器的 pod 内,都会被部署上一个附属容器,这个附属容器会负责处理应用容器的所有网络流量。这个模型正是 Istio 正在使用的。这种实现更像是基于前两种实现优缺点的中庸方案,比如,部署附属容器不需要在每个 Kubernetes 节点中部署 Node Agent(因此也需要和底层的基础设施合作)。但是,你会需要在集群中运行多份同样的容器。所以这种实现的缺点是相比以上两种方案,又能会有些许计算资源的重复浪费。不过因为 应用-附属容器 通信相比 应用-节点代理 通信要简单的多,并且这种方案更容易无缝的集成进现有的集群中,所以这些缺点在一定程度上可以被妥协。Istio 的功能和架构Istio 提供一下一些跨服务网络的核心功能:流量管理提供了路由规则,重试,熔断,错误注入等流量管理功能。也支持服务级别的配置,如基于百分比流量的 A/B 测试,金丝雀发布,状态回滚。安全提供基于身份(identity)的服务至服务通信加密。监控自动收集性能指标,日志,记录服务调用链路,以及集群入口和出口的流量。跨容器治理平台Istio 目前支持部署在 Kubernetes,Consul 和个人虚拟机上。架构一个 Istio 服务网格在逻辑上可以被分为数据部分和控制部分:数据部分(data plane)由一系列的作为附属容器的智能代理组成(Envoy Proxy)。这些代理根据中继并控制所有微服务之间的网络通信。控制部分(control plane)用于管理和配置微服务间的流量路由规则。飞行员组件(Pilot)为 Envoy 附属容器提供服务发现功能,并且把配置的路由规则转换成 Envoy 内部可识别的配置。城堡组件(Citadel)提供服务至服务和服务至用户的安全认证。收集器组件(Mixer)用来从智能代理中收集流量特征和性能指标。一个基于 Kubernetes + Istio 服务网格的例子要体验一下基于 Kubernetes + Istio 服务网格的例子,可以使用官方的 书籍信息应用 。将其部署在 Kubernetes 集群中,然后使用 Istio 来进行流量控制和错误注入。首先需要下载 Istio :curl -L https://git.io/getLatestIstio | sh -cd istio-1.0.2export PATH=$PWD/bin:$PATH然后将其安装在 Kubernetes 里(简单起见,没有开启 TLS 认证):kubectl apply -f install/kubernetes/helm/istio/templates/crds.yamlkubectl apply -f install/kubernetes/istio-demo.yaml这会在一个名叫 ”istio-system“ 的 kubernetes 命名空间下创建一系列的 kubernetes services 和 kubernetes pods 。这个书籍信息应用 包含以下四个微服务:产品主页服务:调用书本细节服务和书本评价服务,用于页面展示。书本细节服务:保存书籍详细信息。书本评论服务:保存书籍的评论。它也会调用书本打分服务(v1 版本不会调用打分服务,v2 会调用打分服务并且展示黑色星星,v3 也会调用打分服务并且展示红色星星)。书本打分服务:保存书本评论服务所需要的打分信息。启动对应应用的容器:# 为 default 命名空间添加 istio-injection=enabled 标记来开启附属容器自动注入kubectl label namespace default istio-injection=enabled# 部署应用kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml# 定义不同版本应用的路由规则kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml然后打开浏览器,将 URL 设置为应用的主页 URL ,可以看到一个包含书籍信息的页面,每一次刷新都会展示不同的书籍(并且同时包含了 v1 v2 v3 的书本打分服务):配置请求路由为了将请求到路由到同一个版本的服务,需要为微服务配置一个 VirtualService 资源,并在里面指定默认版本:apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata: name: ratingsspec: hosts: - ratings http: - route: - destination:host: ratingssubset: v1然后创建该资源:kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml现在,由于所有的请求都被指向了默认的 v1 书本评论服务,所以所有展示都没有了星星。接下来,我们为指定的用户配置指定的微服务版本:apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:name: reviewsspec:hosts: - reviewshttp:- match: - headers: end-user: exact: jasonroute:- destination: host: reviews subset: v2- route:- destination: host: reviews subset: v1因为产品主页服务会在请求书本评论服务时自动添加 end-user 请求头,所以是成立的。当以 jason 用户的身份登录时,我们能看到评论中有了黑色星星:总结一下,我们首先把 100% 的流量路由到了 v1 版本的书本评论中,然后又选择性地把以 jason 用户身份登录的请求路由到了 v2 版本的书本评论中。错误注入如果想测试微服务的弹性延迟(resiliency delays)和不可用的场景的话,我们可以通过错误注入来模拟一个逻辑错误或过载的微服务。在我们的例子里,我们将会为以 jason 身份登录的请求注入一个 7 秒的延迟:apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata: name: ratingsspec: hosts:- ratings http: - match: - headers: end-user: exact: jason fault: delay: percent: 100 fixedDelay: 7s route: - destination: host: ratings subset: v1 - route: - destination: host: ratings subset: v1现在我们希望的情况是以 7 秒左右的时间打开主页,然后没有任何的报错。但是,我们发现评论区出现了一个报错信息。这是书本评论页面的错误处理机制有问题,书本评论页面过早的超时并抛出了错误。所以在这个错误注入的场景下,它帮助我们发现了一个微服务的问题,并且让我们可以在不影响用户的情况下解决它。流量分发在修复了问题之后,我们希望让一部分用户先体验我们新版本的服务。首先,我们把 50% 的流量分发到 v3 的书本评论服务中:apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata: name: reviewsspec: hosts: - reviews http: - route: - destination: host: reviews subset: v1 weight: 50 - destination: host: reviews subset: v3 weight: 50待经过一段时间的观察之后,我们就可以将流量全量的分发至 v3 的书本评论服务中了。收集性能指标并展示Istio 的 Mixer 组件提供了多种基础设施的后端组件用来收集性能指标,比如 Prometheus ,Datadog 和 Fluentd。可以使用 Servicegraph 插件来使调用链路数据可视化:可以使用 Grafana 来使性能指标可视化在一个看板上:安全Istio 支持多种服务到服务和服务到终端用户的认证机制,既支持 RBAC 也提供了审计工具。这些话题的讨论超过了本文的范畴,如果想进一步了解可以参阅官方文档。总结总结一下,本文中我们描述了什么是服务网格以及如何实现它。同时也展示了如何在 Kubernetes 集群中安装 Istio 并且部署一个简单应用。在书籍信息应用的例子里展示了如何为不同的用户路由至不同版本的服务,另外,我们也学习了如何进行错误注入来发现微服务中潜在的问题。最后,还给出了收集性能指标和图形化展示它们的方法。原文链接https://medium.com/kreuzwerke… ...

October 26, 2018 · 2 min · jiezi