Kubernetes 部署 Istio

前言

kubernetes 虽然已经解决了运维上的大部分问题,拥有着优秀的自动运维机制。例如:动态扩容,调度,镜像管理,容器宕机重启,计算节点监控等问题。但k8s在应用层上的监控与流量管理,应用之间的相互调用调用协调,注册中心,配置中心等功能并未提供。

于是便出现了基于Service-Mech架构的代表产品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安装。

Helm在K8S集群中处于包管理工具。如果不太熟悉Helm的同学可以去官网查看一下描述,简单来描述就是声明K8S的各种资源例如:Server,Pod,Ingress这类资源时需要编写Yaml文件,但过多的微服务和各种集群,redis集群,mysql高可用集群,Hadoop集群等需要编写各种各样的Yaml文件,并且有编写错误的风险,最重要的是编写一次之后,如果随着业务增长其他的地域也部署了K8S集群,异地多活场景下,又需要再次部署一些Pod,这个时候Helm就可以很好解决此类问题,Heml中的Chart,就包含了一个完整的服务所需要的所有Yaml文件配置。

Heml优势

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

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

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

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

开始执行安装: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 内核版本是否符合要求

$ 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 项目 Book-Info 微服务,用于体验Istio的各种能力。

bookinfo

官网地址:Istio / Bookinfo 应用

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

文章目录

随心笔记

技术无止境 创新不停驻