写点什么

使用 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:01735

评论

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

软件测试 | 测试开发 | Docker 镜像构建可以分享的快乐

测吧(北京)科技有限公司

测试

Hibernate 缓存与 MyBatis 缓存的理解以及比较

codeshero

Java hibernate 缓存 mybatis缓存 9月月更

国庆福利:6大云原生落地指南、100余页实用转型干货 免费下载!

York

容器 DevOps 微服务 云原生 应用现代化

西安Java培训班哪家比较好

小谷哥

软件测试 | 测试开发 | Git 实战(三) | Github 必会高频基础命令与 IDE 的 Git 集成

测吧(北京)科技有限公司

测试

开放算力,云启未来!与龙蜥一起开启 2022 云栖大会之旅

OpenAnolis小助手

开源 科技 峰会 云栖大会 龙蜥社区

DAPP系统开发Web3合约技术

薇電13242772558

dapp web3

软件测试 | 测试开发 | Dubbo-admin+Zookeeper 的环境搭建实操与 Could-not-extract-archive 报错踩坑

测吧(北京)科技有限公司

测试

西安前端培训班学习哪家比较好

小谷哥

Java | interface 和 implements关键字【接口,看这篇就够了】

Fire_Shield

Java 接口 9月月更

隐私计算大规模落地场景的解决之道:分布式计算架构

Jessica@数牍

隐私计算 分布式技术 分布式计算框架

软件测试 | 测试开发 | Git实战(五)| 让工作更高效,搞定Git的分支管理

测吧(北京)科技有限公司

测试

武汉web前端开发培训机构学费多少

小谷哥

资源画像,看得见的容器资源优化助手

阿里巴巴云原生

阿里云 容器 云原生 ACK

软件测试 | 测试开发 | BAT大厂都在用的Docker。学会这三招,面试、工作轻松hold住

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | 30 分钟轻松搞定正则表达式基础

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | Jenkins 踩坑 | job 创建、参数化、定时构建及时区偏差问题解决

测吧(北京)科技有限公司

测试

IoT数据倾斜如何解决——实践类

阿里云AIoT

算法 流计算 物联网 数据处理 并行计算

关于事务注解中的常用参数详解

codeshero

Java 后端 事务 注解 9月月更

软件测试 | 测试开发 | BAT 大厂最流行的性能压测、监控、剖析技术体系解析

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | Junit5 架构、新特性及基本使用(常用注解与套件执行)

测吧(北京)科技有限公司

测试

SBOM:缓解软件供应链风险的关键

SEAL安全

DevSecOps 软件供应链 SBOM 软件供应链安全

【开发者说】携住数智酒店,用原子化服务创造全新入住体验

HarmonyOS开发者

HarmonyOS

小间距LED显示屏未来十大发展方向

Dylan

LED显示屏 led显示屏厂家 户内led显示屏

数字孪生实操——实践类

阿里云AIoT

物联网 数据采集 传感器 数字孪生

NFT 离商业化还有多远?

One Block Community

区块链 程序员 NFT 商业化

软件测试 | 测试开发 | Git实战(四)| Git分支管理实操,搞定在线合并和本地合并

测吧(北京)科技有限公司

测试

十分钟速成DevOps实践

华为云开发者联盟

后端 开发

Java培训技术学习哪个前景不错

小谷哥

大数据开发培训机构怎么选择

小谷哥

链上自动化何以成就更好的 Web3 | 对话 OAK Network

One Block Community

区块链 自动化 专访 波卡生态

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