文档章节

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

RancherLabs
 RancherLabs
发布于 09/24 10:16
字数 2399
阅读 1258
收藏 5

如果你正在使用容器,特别是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/v1alpha3
kind: Gateway
metadata:
  name: http-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hos
ts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-app
spec:
  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/v1alpha3
kind: DestinationRule
metadata:
  name: my-app
spec:
  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/v1alpha3
kind: VirtualService
metadata:
  name: my-app
spec:
  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

© 著作权归作者所有

RancherLabs
粉丝 96
博文 262
码字总数 568538
作品 0
深圳
程序员
私信 提问
加载中

评论(5)

hotsmile
hotsmile
感觉真学不动了
RancherLabs
RancherLabs 博主
只要努力学。。
supperman
supperman
学不动了~~~~
RancherLabs
RancherLabs 博主
努力!加油!
RancherLabs
RancherLabs 博主
欢迎添加微信助手(rancher2),进官方技术群,了解更多Kubernetes使用攻略
二, 跨语言微服务框架 - Istio环境搭建

当我们知道Istio是一个好东西,能够帮助我们快速实现微服务化中的一些关键节点,那么下一步就需要考虑怎么使用Istio了,Istio现在版本是和Kubernetes强关联在一起的,如果大家还不是太了解K...

喵了_个咪
2018/11/12
3.4K
2
k8s(四)、微服务框架istio安装测试

资料: https://www.2cto.com/kf/201805/749007.html https://blog.csdn.net/wenwenxiong/article/details/80068697 一、前言 Istio是Google/IBM/Lyft联合开发的开源项目,2017年5月发布第一......

xiaomin0322
2018/07/14
241
0
Kubernetes 实战教学,手把手教您在 K8s 集群上部署 Istio Mesh(二)

出品丨Docker公司(ID:docker-cn) 编译丨小东 每周一、三、五,与您不见不散! 在上一篇文章《Kubernetes 实战教学,手把手教您在 K8s 集群上部署 Istio Mesh(一)》中,我们已经完成了安...

docker公司
01/30
0
0
Knative:重新定义 Serverless | GIAC 实录

Knative 是Google 发起的 Serverless 项目,希望通过提供一套简单易用的 Serverless 开源方案,将 Serverless 标准化。 本文根据敖小剑在 2018 年上海 GIAC 演讲内容整理,文末有PPT获取地址...

s花苞酱
01/02
0
0
Service Mesh 初体验 - 知乎

前言 计算机软件技术发展到现在,软件架构的演进无不朝着让开发者能够更加轻松快捷地构建大型复杂应用的方向发展。容器技术最初是为了解决运行环境的不一致问题而产生的,随着不断地发展,围...

我是程序员
10/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka实战(五) - 核心API及适用场景全面解析

1 四个核心API ● Producer API 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。 ● Consumer API 允许一个应用程序订阅一个或多个topic ,并且对发布给他们的流式数据进行处...

JavaEdge
17分钟前
5
0
实现线程的第三种方式——Callable & Future

Callable Runnable 封装一个异步运行的任务, 可以把它想象成为一个没有参数和返回值的异步方 法。Callable 与 Runnable 类似, 但是有返回值。Callable 接口是一个参数化的类型, 只有一 个...

ytuan996
今天
8
0
OSChina 周六乱弹 —— 不要摁F了!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 : 朴树写的词曲都给人一种莫名的失落感,不过这首歌他自己却没有唱,换成赵传这种高音阶嘶喊的确很好,低沉但却有力,老男人的呐喊...

小小编辑
今天
10
0
Android Binder机制 - interface_cast和asBinder讲解

研究Android底层代码时,尤其是Binder跨进程通信时,经常会发现interface_cast和asBinder,很容易被这两个函数绕晕,下面来讲解一下: interface_cast 下面根据下述ICameraClient例子进行分析...

天王盖地虎626
昨天
12
0
计算机实现原理专题--存储器的实现(二)

计算机实现原理专题--存储器的实现(一)中描述了一种可以记住输入端变化的装置。现需要对其功能进行扩充,我们将上面的开关定义为置位,下面的开关定义为复位,然后需要增加一个保持位,当保...

FAT_mt
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部