跳到主要内容

Kubernetes 部署 Istio

· 阅读需 6 分钟

kubernetes 已经解决了运维上的大部分问题,拥有优秀的自动运维机制:动态扩容、调度、镜像管理、容器宕机重启、计算节点监控等。但 k8s 在应用层上的监控与流量管理、应用之间相互调用的协调、注册中心、配置中心等功能并未提供,于是便出现了基于 Service Mesh 架构的代表产品 Istio。

Istio 是 Google、IBM、Lyft 三家联合开发的框架,主要作用是在 k8s 环境中对微服务之间的流量进行控制、连接、保护、设置和观测,使得我们开发微服务时可以抛弃掉繁琐、复杂、维护性低、强耦合的底层微服务 SDK。

Istio架构

在架构上 Istio 分为数据平面与控制平面。

数据平面的核心思维就是 Sidecar(边车模式):在同一个 pod 中添加 proxy 代理容器,接管我们的业务容器流量,在不对业务代码有任何入侵的前提下,实现各种功能。例如:负载均衡、流量加密、监控、策略(灰度发布、蓝绿发布)、熔断、降级、远程服务调用、配置中心、注册中心等常用的微服务功能(但不负责分布式事务的管理,这个按道理确实也不属于 Istio 应该接管的范畴)。

控制平面则负责管理和配置代理来路由流量。此外控制平面配置 Mixer 以实施策略和收集遥测数据进行展示,提供分析服务调用链路、服务拓扑图等功能。

由于业务代码不再依赖具体的微服务 SDK,例如 SpringCloud、Dubbo、Motan、ServiceComb 等强耦合性框架,我们可以根据业务场景选择对应的开发语言,让不同语言的开发团队进行业务开发,提高整体效率,把琐碎的注册、配置与远程调用的管理全部交给 Istio。

组件介绍

citadel:负责身份认证和证书管理的核心安全组件。

galley:负责配置管理的组件,如验证配置文件格式和内容的正确性,并将这些配置信息提供给 pilot 和 mixer。

pilot:控制中枢,包含了服务发现和规则转化与下发。

proxy:由 C++ 开发的 Envoy 与 Pilot-agent 实现,提供了动态服务发现、负载均衡、TLS、熔断、健康检查、流量拆分、灰度等功能,另外生成遥测数据,为微服务提供可观测能力。

Ingressgateway:入口处的 gateway,即网格外访问网格内的服务就是通过这个 gateway 进行的。

详细中文官网文档:Istio / 文档

部署流程

我这里使用最简单的 Helm 安装。

1)为什么用 Helm

Helm 在 K8S 集群中处于包管理工具的角色。声明 K8S 的各种资源,例如 Service、Pod、Ingress 时,都需要编写 Yaml 文件。但随着微服务增多,加上 redis 集群、mysql 高可用集群、Hadoop 集群等,需要编写的 Yaml 文件越来越多,并且有写错的风险。更重要的是,如果随着业务增长在其他地域也部署了 K8S 集群,异地多活场景下又需要再次部署一批 Pod。这个时候 Helm 就可以很好地解决此类问题:Helm 中的 Chart 包含了一个完整服务所需要的所有 Yaml 文件配置。

Helm 的优势:

  • 实现 yaml 文件的高效复用。
  • 可以将大量 yaml 文件作为一个整体进行管理。
  • 实现应用级别的版本管理。

之后我们也可以搭建企业内部的 Chart 仓库。这样企业需要什么服务,不用再进行繁琐的 Yaml 文件编写,只需要通过 Helm 执行 Chart,即可在 K8S 集群部署对应 Pod,得到对应的功能服务。

2)安装 Helm

使用 Helm 需要先进行安装(官方网址):掌舵|文档 (helm.sh)

安装时注意 Helm 与 Kubernetes 的版本支持:Helm | Helm版本支持策略

3)安装 Istio

开始执行安装:Istio / 使用 Helm 安装

为 Istio 组件创建命名空间 istio-system

$ kubectl create namespace istio-system

安装 Istio base chart,它包含了 Istio 控制平面用到的集群范围的资源:

# 官网没有贴出对应chart仓库,我这里进行了补充
$ helm repo add istio https://istio-release.storage.googleapis.com/charts
$ helm install istio-base istio/base -n istio-system

安装 Istio discovery chart,它用于部署 istiod 服务:

$ helm install istiod istio/istiod -n istio-system --wait

(可选项)安装 Istio 的入站网关:

Linux 内核必须是 4.11 以上,可自行查看 Linux 内核版本是否符合要求。

# 创建入口网关的命名空间,并开启 sidecar 自动注入
$ kubectl create namespace istio-ingress
$ kubectl label namespace istio-ingress istio-injection=enabled
$ helm install istio-ingress istio/gateway -n istio-ingress --wait

部署好 Istio ingress 之后,即可部署 Istio 官方 demo 项目 Bookinfo 微服务,用于体验 Istio 的各种能力。

Bookinfo

官网地址:Istio / Bookinfo 应用

Bookinfo 微服务使用了 Istio 进行边车部署,使用了 4 种不同的语言程序,并且 Java 语言开发的 Reviews 服务提供了 3 个不同版本的应用,可以很好地体现出 Istio 在多版本控制、流量管理、迁移、整合方面的能力。

小结

Istio 把服务治理从业务代码里剥离出来:数据平面用 Sidecar 接管流量,控制平面统一下发路由与策略,业务方不再绑定某个语言的微服务 SDK。部署上借助 Helm,三条 install 命令就能装好 base、istiod 和入口网关,比手写一堆 Yaml 省事得多。装完之后跑一遍官方的 Bookinfo 示例,多语言、多版本的流量管理能力基本就能体验到了。后续再结合自身业务,逐步把灰度发布、熔断这类能力用起来。

评论 / COMMENTS