【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

使用 K8s 遇难题?Istio 来帮您!

  • 2020-05-18
  • 本文字数:3471 字

    阅读完需:约 11 分钟

使用K8s遇难题?Istio来帮您!

如果你正在使用容器,特别是 Kubernetes,那么你应该也听说过 Istio。对于初学者来说,Istio 是 Kubernetes 的服务网格(service mesh)。所谓服务网格,它是一个网络层,并且可以动态管理服务流量,然后以安全的方式进行管理。


如何充分使用 Istio,这不是一篇博客文章能阐述清楚的。因此,在本文中我将介绍一些它的特性,更重要的是,你可以通过这篇文章,了解到一些方法来自动化解决某些实际问题。


Istio 可以让你使用一组自定义 Kubernetes 资源来管理网络流量,并且可以帮助你保护和加密服务之间以及集群内外的网络流量。它全面集成了 Kubernetes API,这意味着可以使用与其他 Kubernetes 配置完全相同的方式来定义和管理 Istio 设置。

权衡利弊,再做选择

如果要开始使用 Istio,首先应该问自己为什么。Istio 提供了一些非常有价值的功能,如金丝雀发布等,但是如果不增加一些复杂性,就无法使用它们。你还需要投入一定的时间来学习它。也就是说,如果你的情况合适使用它,你可以(并且应该)在自己的集群中谨慎且逐步地采用 Istio 的功能。


如果你要从头开始构建新环境,并且经过利弊权衡决定继续使用 Istio,那么一定要从一开始就使用严格的相互 TLS 对其进行设置,并积极使用其强大的功能。具体操作请参考:


https://istio.io/docs/setup/install/kubernetes/#installation-steps


为了使一切都有价值并且具有一定的性价比,我们需要在实际应用程序的上下文中考虑 Istio,但是如果没有快速免责声明的话,最好不要这样做。如果你只需要管理少量服务(且位于单个集群内),那么引入 Istio 的性价比相对而言没有那么高。


本文中的代码示例不一定能够完全帮助你解决你的问题,但是如果你需要所有的代码以及如何使用它的详细说明都可以在 GitLab 上找到:


https://gitlab.com/ContainerSolutions/k8s-deployment-mtl/


接下来是你在 Cloud Native 旅程中可能遇到的两个常见问题,以及如何使用 Istio 来解决这些问题。

问题 1:我不相信我的测试

如果测试范围并没有完全涵盖你所更改的应用程序,那么你可能会很快采取行动进行新一轮测试,但也有可能应用程序无法正常运行了。


在理想状况下,我们都想要确保每个代码经过全面的测试,否则就不会将功能添加到应用程序中。但是现实总归是骨感的,我们常常被 ddl 追赶,可能还未编写或者更新测试,功能就得上传到项目中了。

解决方案:放慢速度

那么,如何确保我绝大多数用户不受代码中潜伏的任何错误的影响,又如何进行更改和部署新功能呢?答案是通过先将新版本部署到最少数量的用户来最大程度地减少这些小问题的辐射范围。


如果更改能够按照预期工作的话,你可以缓慢增加使用新版本的用户百分比。如果各项指标出现问题,你可以轻松回滚你的更改,然后重试。


在没有 Istio 的情况下可以在 Kubernetes 上运行金丝雀部署吗?当然没问题,但是如果要自动化这一过程,你需要完全将自己的精力放在 web 服务器代码和自定义自动化脚本方面。这样的操作方式性价比并不高。


Istio 有一些十分优雅的流量分配解决方案,我们可以使用它们在恰当的时间为合适的版本提供适当的客户端服务,并且我们只需调整其中的 1 个或 2 个参数。


为了实现这一点,你需要设置一个网关入口(Ingress gateway)、一个虚拟服务(virtual service)和一个 destination rule。这将位于一般的部署和服务之上,并为你分配流量。


apiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata:  name: http-gatewayspec:  selector:    istio: ingressgateway  servers:  - port:      number: 80      name: http      protocol: HTTP    hosts:    - "*"---apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: my-appspec:  hosts:    - "*"  gateways:    - http-gateway  http:  - match:    - uri:        prefix: "/my-app"    rewrite:      uri: "/"    route:      - destination:          host: my-app          subset: v1          port:            number: 80        weight: 90      - destination:          host: my-app          subset: v2          port:            number: 80        weight: 10---apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:  name: my-appspec:  host: my-app  subsets:  - name: v1    labels:      version: v1.0.0  - name: v2    labels:      version: v2.0.0 
复制代码


从虚拟服务的权重字段中可以看到,Istio 将根据指定的值在应用程序的两个版本之间分配流量。这些值的总和必须为 100%,否则,API 将拒绝应用该定义。


然后,你(或者理想情况下,在“持续集成/连续交付”流水线中手动执行一个或多个步骤)将调整权重,以将新版本推广给更多用户,直到所有请求由新版本满足为止,并且以前的版本可以停止维护。


通过使用 Istio 的故障注入功能来模拟网络中断和实际流量性能下降,还可以将 Istio 集成到您的集成测试策略中。


如果在生产中进行测试的想法给你留下了心理阴影,那一定是你的做法有所欠缺。例如,尝试在你的虚拟服务规范中添加以下代码片段以添加一些混乱,然后再找一篇文章来看看怎么用 Istio 解决这样的混乱。


spec:  hosts:  - my-app  http:  - fault:      delay:        fixedDelay: 7s        percent: 100   route:    - destination:        host: ratings        subset: v2
复制代码

问题 2:市场策略无法确定发布版本

通常,业务需要针对实际用户测试应用程序的多个版本。但是有时实在无法搞清楚是哪种营销策略可以带来最佳转化率,或者哪种设计选择可以带来最佳的客户留存率。


使用 Kubernetes,你可以将流量分为两个版本,但是要想从练习中获得任何有价值的见解,则再次需要一大堆自定义代码来获取相关信息,并以非技术同事可以理解的方式对其进行处理。

解决方案:使用 Istio 进行 A/B 测试

Istio 的流量分配规则可以再次解决这一问题,它与 Prometheus 和 Grafana 的紧密集成可以帮助你获取直观的 A/B 测试的结果。一般而言,根据传入数据包内容的某些部分,几乎有无数种方法来决定哪些用户可以获取你的应用程序的版本。


在这一示例中,我们将使用 User-Agent 字段为不同的浏览器提供不同的版本。


apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: my-appspec:  hosts:    - "*"  gateways:    - http-gateway  http:  - match:    - headers:        user-agent:          regex: ".*Chrome.*"      uri:        prefix: "/my-app"    rewrite:      uri: "/"    route:      - destination:          host: my-app          subset: v1          port:            number: 80  - match:    - headers:        user-agent:          regex: ".*Mozilla.*"      uri:        prefix: "/my-app"    rewrite:      uri: "/"    route:      - destination:          host: my-app          subset: v2          port:            number: 80
复制代码


从上面的代码中可以看到,使用 Firefox 的用户将获得应用程序的版本 1,而 Chrome 用户将获得版本 2。如果浏览器的“User-Agent”字段不包含“mozilla”或“chrome”,则他们都将不会获得任一版本。


要为其他客户提供服务,您需要添加一条默认路由,我将作为练习留给你。(嘿嘿)


如果你不想安装其他浏览器,只是想尝试一下,则可以使用带有头部标志的 curl 伪装成所需的任何浏览器,例如:


curl /my-app -H "User-Agent: Chrome"
复制代码


通过更改 user-agent 的值,你可以从命令行测试所有不同的路由。

总结

以上两种情况大概能让你体验到 Istio 强大功能的冰山一角。正如上文所说,如果没有 Istio,你依然可以进行金丝雀部署和 A/B 测试,只是你必须自己实现流量分配。但这大大增加了开发部署的复杂性,实属性价比低之选。


我希望这篇文章可以让你对 Istio 的实际应用有很好的理解,并且十分期待你自己尝试一下。如果你想了解更多关于 Istio 的信息,可以访问它们的官网,上面有许多有用的资料:https://istio.io/


值得一提的是,Rancher 2.3 Preview2版本上开始支持Istio,用户可以直接在 UI 界面中启动 Istio 并且可以为每个命名空间注入自动 sidecar。此外,Rancher 简化 Istio 的安装和配置,内置了一个支持 Kiali 的仪表盘,用于流量和遥测的可视化,然后用 Jaeger 进行追踪,甚至还有自己的 Prometheus 和 Grafana(与用于高级监控的实例不同)。这一切让部署和管理 Istio 变得简单而快速。


有关发行说明和安装步骤,请访问 GitHub:


https://github.com/rancher/rancher/releases/tag/v2.3.0-alpha5


2020-05-18 18:01510

评论

发布
暂无评论
发现更多内容

行走的Offer收割机!首次公布Java10W字面经,Github访问量破百万

做梦都在改BUG

Java java面试 Java八股文 Java面试题 Java面试八股文

前方高能!融云《社交泛娱乐出海作战地图》来袭,前 100 位免费领

融云 RongCloud

图片 社交 融云 泛娱乐 出海

日常节省 30%计算资源:阿里云实时计算 Flink 自动调优实践

Apache Flink

大数据 flink 实时计算

华为云数据库首席专家谈分布式数据应用挑战和发展建议

华为云开发者联盟

数据库 华为云 华为云开发者联盟 企业号 5 月 PK 榜

Istio权威指南,华为云云原生团队倾情巨献!

博文视点Broadview

2023年西藏自治区等级保护测评机构名单看这里!

行云管家

等保 等级保护 西藏

统一门户的快速构建--基于小程序技术的一种可能

FinFish

统一门户 小程序容器 小程序化 小程序技术

看火山引擎DataLeap如何做好电商治理(二):案例分析与解决方案

字节跳动数据平台

短视频 DataLeap 电商治理 达人治理 商品安全

MobPush 创建应用

MobTech袤博科技

IaaS预留实例在线交易策略详解

天翼云开发者社区

云计算 大数据 云服务

真香! GitHub大牛呕心沥血整理的5000页Java学习手册

Java你猿哥

Java MySQL redis Spring Boot java基础

如何选择合适的共享电动车厂商

共享电单车厂家

共享电动车厂家 共享电单车厂商 景区共享电单车 校园共享电动车 共享电动车生产

关于并发编程与线程安全的思考与实践 | 京东云技术团队

京东科技开发者

并发编程 线程安全 java 并发 企业号 5 月 PK 榜

研发效能治理:复杂性

码猿外

研发效能 工程效能

走进南京邮电大学!龙蜥导师面对面分享如何通过开源经历获得实习/工作机会?| 开源之夏 2023

OpenAnolis小助手

操作系统 实习 龙蜥社区 开源之夏 南京邮电大学

【web 开发】快来给你的类定个标准 -PHP 的接口技术(64)

迷彩

php 接口 interface 三周年连更 类扩展

Spring Boot 单体应用一键升级成 Spring Cloud Alibaba

阿里巴巴云原生

阿里云 微服务 云原生 spring cloud alibaba

openEuler 社区 2023 年 4 月运作报告

openEuler

Linux 开源 操作系统 openEuler 资讯

精通Vue.js系列实例教程 │ Vue组件的数据监听

TiAmo

Vue Web Worker 监听 watche

出海无从下手?看社交泛娱乐出海「第一趁手工具」怎么说

融云 RongCloud

互联网 社交 融云 泛娱乐 出海

小微企业是什么意思?如何认定?

行云管家

信息安全 小微企业 小微企业认定

QUIC在京东直播的应用与实践 | 京东云技术团队

京东科技开发者

直播 直播技术 QUIC 企业号 5 月 PK 榜

flutter系列之:做一个修改组件属性的动画

程序那些事

flutter 大前端 程序那些事

解决centos7.0安装mysql后出现access defind for user@'localhost'的错误

北桥苏

MySQL

【自己更换模型】如何用 Serverless 一键部署 Stable Diffusion?

阿里巴巴云原生

阿里云 Serverless 云原生 动态模型

SaaS化开源项目之HouseKeeper云上部署实践

华为云开发者联盟

开源 微服务 华为云 华为云开发者联盟 企业号 5 月 PK 榜

假期充电,用阿里云 Serverless K8s + AIGC 搭建私人代码助理

阿里巴巴云原生

阿里云 Serverless Kubernetes 云原生 AIGC

技术同学如何提高职场话语权

老张

话语权 职场影响力

小程序:技术标准与生态的演变

没有用户名丶

ChatGPT火了,客服产业怎么办?

创智荟

知识计算 客服 ChatGPT 数字员工

专访顶象CEO: 新一代AI如何增强验证码安全性

Geek_2d6073

使用K8s遇难题?Istio来帮您!_文化 & 方法_Rancher_InfoQ精选文章