Istio 与 Kubernetes:资源管理与协同解析
本文分享自华为云社区《istio资源介绍以及和kubernetes资源扭转关系》,作者:可以交个朋友。
一、istio 原理
Istio 的原理是拦截 Kubernetes 中创建 Pod 的事件,然后向 Pod 中注入一个包含 Envoy 的容器,进出 Pod 的流量会被 “劫持” 到 Envoy 进行处理。由于流量被 “劫持” 了,所以 Istio 可以对流量进行分析例如收集请求信息,以及一系列的流量管理操作,也可以验证授权信息。当 Envoy 拦截流量并执行一系列操作之后,如果请求没问题,就会转发流量到业务应用的 Pod 中。
二、istio 架构
istio 的架构分为 控制平面 、 数据平面 、出入口网关。
控制平面:控制平面为 istiod,默认部署在 istio-system 命名空间。进入 istiod 容器可以看到主进程的名字为 pilot。所以我们可以得知控制平面的主体是 pilot,其他组件如 citadel Galley,是被 pilot 管理启动的。pilot 作为 istio 控制面的核心,主要有两个职责:1)监听 k8s 平台获取 svc , endpoint , virtualservice , gateway , destinationrule 等资源信息,这些信息是做流量转发必须依赖的;2)把获取到的信息抽象聚合,生成为 envoy 能识别的配置结构,最终通过 xds 协议下发配置到数据平面 envoy。envoy 创建了一套 envoy 动态下发配置并热生效的协议,被统称为 xds。 pilot 内实现了 xds 服务器,把已聚合转换的配置信息下发给数据面的 envoy,实现流量策略的热生效。
数据平面:安装完 istio 之后,需要进行如下操作才会自动注入数据平面。
开启自动注入后,istio 会向 pod 中注入 sidecar 容器,一个是修改 pod 内 iptables 的 initcontainer,另一个即是 istio 数据平面 istio-proxy。进入到 istio-proxy 中可以看到,主进程的名字为 pilot-agent。envoy 以子进程的形式被 pilot-agent 启动管理。pilot-agent 有两个职责:1)pilot-agent 会与 pilot 交互, pilot 下发的 xds 请求正是由 pilot-agent 接收;2)启动管理 envoy 进程,并根据接收到的配置对 envoy 进行热更新。
出入口网关:istio-ingressgateway 和网格内的 sidecar 一样,核心处理组件也是一个 envoy,它作为网格的入口允许从服务从网格外部访问服务网格内部的服务,起到了类似 nginx-ingress 的作用。
istio-ingressgateway 的主要包括以下作用:1)接收集群外部的流量,并根据 Istio 的配置将请求路由到适当的内部服务(起到网关的作用);2)负载均衡和流量控制功能,包括请求路由、重试、超时、熔断等(流量治理);3)支持 TLS 配置,以便在流量进入服务网格之前进行加密(给域名配置证书);4)支持双向 TLS 身份验证,以提高服务网格的安全性(服务间通讯);5)提供 Metrics、Tracing 和 Logging 收集,以便更好地观察和监控流量(需要自己安装对应的组件)
三、istio 常用 CRD 资源
3.1 gateway
在 istio 中,定义“监听信息与入口网关“绑定关系的资源叫 Gateway
3.2 virtualService
主要提供:1)路由功能:声明一个后端服务,及这个后端服务的路由信息;2)流量管控:镜像流量、故障注入、跨域配置等;3)绑定网关:通过 spec.gateways 字段绑定网关,在网关上生效路由规则和流量管控规则;4)绑定后端:spec.http.route.destination 字段,声明了每种路由的转发地址。
注意事项:
spec.http.route.destination.host 尽量使用 FQDN(全限定域名)
uri 匹配时,大小写敏感
istio 的 vs 的 url 匹配顺序是从上向下,而不是最长匹配。在生产环境中建议使用一个无条件的规则作为最后规则,确保流量始终会匹配到最少一条规则,防止意外情况的方式
当为已存在的 host 创建第二个及更多的 VirtualService 时,istio 会将额外的路由规则合并到 host 现有配置中,这种合并不保证匹配顺序性,可能会造成与预期匹配效果不一致。所以建议一个 host 的路由配置写在一个 virtualService.yaml 文件中
3.3 destinationRule
通过 VistualService 的 spec.http.route.destination 字段,VistualService 与 DestinationRule 形成了绑定关系。
DestinationRule 主要功能:
负载功能:从 host 字段的 service endpoint 列表中 选择一个,成为处理本次请求的真正后端。有轮询、一致性哈希、最少连接数、位置负载均衡等方式。
连接池:对后端服务的连接数等进行限制。
异常点检测:对后端服务进行健康探测,将异常后端点踢出负载。
定义子集版本:通过 label 把 endpoint 分类。
四、istio 资源和 kubernetes 资源的关系
istio 服务网格,他的主要管理对象当然是服务,即 kubernetes 中的 service。istio 控制面 pilot 中包含 informer 用来获取 kubernetes 集群中的 service、endpoint、pod 资源信息,并将其转化为 envoy 的 cluster、endpoint 配置下发给数据面。大多数情况下我们可以把 envoy cluster 理解为 K8s 集群中的一个 service,一个 service 通常对应着一组 pod,envoy 中的 cluster 同样是一种相同后端的集合。
4.1 istio CRD 资源和 kubernetes 资源扭转关系图
istio 的 destinationRule 定义一组负载均衡后端服务地址,通过 spec.host 字段关联 kubernetes 集群中的 service,来获取 kubernetes 中的后端地址列表 endpoint。istio 的 destinationRule 还可以通过关联 pod-label 从 service 中筛选特定 pod,常用于灰度发布。istio-ingressgateway 的本质是一个部署在 istio-system 命名空间的 deployment,运行着 envoy 进程容器。我们一般需要手动创建 LoadBalacne 类型的 kubernetes-service,使其获得对外的 ip。
4.2 istio 需要通过 kubernetes service port 信息获取服务协议
istio 需要知道服务提供什么七层协议,从而来为其配置相应协议的 filter chain,官方建议显式声明协议。如果没有声明,istio 会自动探测,但这个探测能力比较有限(仅能探测识别 http https http2 协议),可能导致无法正常工作。
五、istio 常用资源操作和关联关系展示
5.1 创建 deployment、service 资源
5.2 创建对应 istio 资源
按照 3.1 3.2 3.3 章节 yaml 创建相关 istio 资源
5.3 查看相关资源关联关系
创建 gateway 资源后
创建 virtualservice 资源后
创建 destinationrule 资源后
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/4a3e9fb7c1af033fb6d99bb8f】。文章转载请联系作者。
评论