最新!最全面!Istio 服务网格部署实践

做为处理服务通信的基础设施层,ServiceMesh 技术经过引入轻量级网络代理,实现了服务访问、流量治理、可观察性等关键功能,受到了社区的高度关注。Istio 是开源的 ServiceMesh 产品,提供了一个完整的知足微服务应用多种需求的解决方案。git

本文基于最新发布的 Istio1.7.3 版本,从安装和部署出发,介绍 Istio 的安装部署过程,并结合 Bookinfo 示例应用,方便读者认识 Istio 的各个组件及其功能。github

准备工做


Kubernetes 集群

在安装以前,须要首先准备一套可用的 Kubernetes 集群,这里咱们使用 Istio 1.7.3 进行安装,官方推荐的 Kubernetes 版本包括 1.16, 1.17, 1.18。编程

本文使用的是百度智能云提供的容器引擎服务 CCE,该服务提供了对容器的生命周期管理,可以知足 Istio 的安装部署要求。选用的 Kubernetes 版本是 1.16.8,包括两个节点,配置为 CentOS 7.3 x86_64 (64bit),4核12G。json

Istio 安装文件浏览器

下载 Istio,下载内容包括安装文件、示例和 istioctl 命令行工具。微信

一、这里咱们使用 MAC 系统,能够经过如下命令下载最新版本的 Istio:网络

$ curl -L https://istio.io/downloadIstio | sh -

也能够直接访问 Istio release(https://github.com/istio/istio/releases/tag/1.7.3) 页面下载与当前操做系统对应的安装文件。架构

注意:当前的最新版本为 1.7.3,若是须要下载安装历史版本,在命令行中指定环境变量 ISTIO_VERSION 便可,若是下载特定系统架构的安装包,则须要设置环境变量 TARGET_ARCH。app

二、切换到 Istio 包所在目录。这里咱们的目录名为 istio-1.7.3,该安装目录包含以下内容:负载均衡

$ cd istio-1.7.3/
  • manifests/ 目录:安装 istio 相关的清单文件,包括 charts、profiles 等

  • samples/ 目录:包含一组示例应用,覆盖多种应用场景

  • bin/ 目录:包含 istioctl 的客户端文件。istioctl 命令行工具用于手动注入 Envoy sidecar 代理

  • tools/ 目录:istio 安装和使用过程相关的脚本

将 istioctl 客户端路径增长到 path 环境变量中,在 MAC 系统下执行如下命令:

$ export PATH=$PWD/bin:$PATH

Istio部署实践


Istio 主要提供了如下三种安装方式,用户能够根据本身的实际须要进行选择。

一、使用 Istioctl 安装:istioctl 是支持多种自定义选项的的命令行工具,用户能够灵活配置,实现 Istio 组件的定制化安装。Istio 官方推荐使用该方式进行安装部署,可用于生产环境。

二、使用 Helm 自定义安装:这种安装方式使用 Helm charts 定义 Istio 的安装选项,目前该安装方式已被弃用。

三、安装独立的 Operator:该方式使用独立的 Istio operator 来安装 istio,以声明式的方式管理安装配置,目前仍处于实验阶段,不推荐在生产环境使用。

下面咱们以 istioctl 安装方式为主,介绍istio的安装步骤和组件信息。

部署 Istio

一、使用 demo 配置文件进行安装

Istio 官方提供了针对不一样场景的配置文件,这些内置的配置文件提供了对 Istio 控制平面和数据平面的定制内容。用户能够根据实际场景选择特定的配置文件,而后结合自定义选项完成定制化安装。当前提供如下几种内置配置文件包括:

  • default: 根据默认的安装选项启用组件,建议用于生产环境的部署。

  • demo: 用于展现 Istio 的基本功能,支持运行 Bookinfo 应用程序和相关任务。

  • minimal:使用 Istio 的流量管理功能所需的最少组件。

  • remote:用于配置多集群服务网格场景下的远程集群。

  • empty:不部署任何组件,可用于自定义配置的基础文件。

  • preview:包含实验性功能,用于探索 Istio 新功能,但没法保证稳定性。

在选定上述配置文件以后,能够在安装 Istio 时在命令行添加一个或多个 --set <key>=<value> 选项,完成 Istio 安装插件的其余选项配置。

这里为了测试方便,咱们直接使用内置的 demo 配置文件进行安装,执行如下命令便可:

$ istioctl install --set profile=demoDetected that your cluster does not support third party JWT authentication. Falling back to less secure first party JWT. See https://istio.io/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for details.✔ Istio core installed✔ Istiod installed✔ Egress gateways installed✔ Ingress gateways installed✔ Installation complete

该命令表示在 Kubernetes 集群上按照 default 配文件的描述安装 Istio 组件。 

二、查看组件状态

而后查看 Kubernetes 服务是否已经成功建立:

$ kubectl get svc -n istio-systemNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEistio-egressgateway ClusterIP 172.18.2.116 <none> 80/TCP,443/TCP,15443/TCP 5m35sistio-ingressgateway LoadBalancer 172.18.177.126 154.85.54.75 15021:30059/TCP,80:31088/TCP,443:31806/TCP,31400:30831/TCP,15443:32665/TCP 5m35sistiod                 ClusterIP      172.18.167.120   <none>         15010/TCP,15012/TCP,443/TCP,15014/TCP,853/TCP                                6m1s

查看 Kubernetes pod 是否已经正常部署,且处于 Running 状态:

$ kubectl get pod -n istio-systemNAME READY STATUS RESTARTS AGEistio-egressgateway-7bf76dd59-vtsj9 1/1 Running 0 5m46sistio-ingressgateway-586dbbc45d-2l6sz 1/1 Running 0 5m46sistiod-6cc5758d8c-mgdcb 1/1 Running 0 6m13s

三、开启自动注入

Istio 安装完成后,在部署应用以前,须要首先开启 sidecar 的自动注入,这里能够经过为命名空间添加标签实现,执行如下命令便可:

$ kubectl label namespace default istio-injection=enablednamespace/default labeled

部署 Bookinfo 示例应用

在下载的 Istio 安装文件中,包括多种示例应用,这里咱们以 Bookinfo 为例,介绍服务的部署使用过程。该应用由四个单独的微服务构成:

  • productpage:该服务会调用 details 和 reviews 两个微服务,用来生成页面。

  • details:该服务包含了书籍的信息。

  • reviews:该服务包含了书籍相关的评论,会调用 ratings 微服务。

  • ratings:该服务包含了由书籍评价组成的评级信息。

这些微服务使用不一样的编程语言实现,实现了一个简单的在线书店平台,用于展现书籍的描述、评级等基本信息。

一、使用 kubectl 部署示例应用

进入 istio 安装目录 istio-1.7.3,执行下面的命令完成应用部署。​​​​​​​

$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yamlservice/details createdserviceaccount/bookinfo-details createddeployment.apps/details-v1 createdservice/ratings createdserviceaccount/bookinfo-ratings createddeployment.apps/ratings-v1 createdservice/reviews createdserviceaccount/bookinfo-reviews createddeployment.apps/reviews-v1 createddeployment.apps/reviews-v2 createddeployment.apps/reviews-v3 createdservice/productpage createdserviceaccount/bookinfo-productpage createddeployment.apps/productpage-v1 created

二、查看服务和实例是否正常建立​​​​​​​

$ kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEdetails ClusterIP 172.18.44.247 <none> 9080/TCP 26skubernetes ClusterIP 172.18.0.1 <none> 443/TCP 35mproductpage ClusterIP 172.18.106.238 <none> 9080/TCP 26sratings ClusterIP 172.18.2.59 <none> 9080/TCP 26sreviews ClusterIP 172.18.10.251 <none> 9080/TCP 26s
$ kubectl get podNAME READY STATUS RESTARTS AGEdetails-v1-5974b67c8-cpw96 2/2 Running 0 3m31sproductpage-v1-64794f5db4-svfk2 2/2 Running 0 3m30sratings-v1-c6cdf8d98-skc4q 2/2 Running 0 3m30sreviews-v1-7f6558b974-cwsh9 2/2 Running 0 3m30sreviews-v2-6cb6ccd848-5fzgc 2/2 Running 0 3m31sreviews-v3-cc56b578-qqmn2 2/2 Running 0 3m31s

能够看到,服务和实例都已经建立成功。

三、肯定 Ingress 的 IP 和端口

在 Bookinfo 服务正常启动并运行以后,须要设置 Istio 网关,这样能够在 Kubernetes 集群外部访问应用。​​​​​​​

$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yamlgateway.networking.istio.io/bookinfo-gateway createdvirtualservice.networking.istio.io/bookinfo created

这里咱们使用的 Kubernetes 集群支持外部负载均衡器,能够看到已经分配到 EXTERNAL-IP:​​​​​​​

$ kubectl get svc istio-ingressgateway -n istio-systemNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEistio-ingressgateway   LoadBalancer   172.18.177.126   154.85.54.75   15021:30059/TCP,80:31088/TCP,443:31806/TCP,31400:30831/TCP,15443:32665/TCP   14m

设置 ingress IP 和端口:​​​​​​​

$ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}') $ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}') $ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

四、应用访问

在浏览器端打开地址 http://${GATEWAY_URL}/productpage,这里咱们获取到的地址是154.85.54.75:80,能够看到界面以下。

查看组件面板


为了方便对服务网格应用进行观察和管理,Istio能够与不一样的遥测组件进行集成,这些组件在服务拓扑、流量分析、问题定位等方面具备很大帮助。目前Istio提供的组件类型包括:grafana、jaeger、kiali、prometheus。下面咱们以 Kiali 为例,介绍一下组件的安装和使用。

一、安装组件

执行如下命令安装 Istio 组件:

$ kubectl apply -f samples/addons

能够查看组件部署状态:​​​​​​​

$ kubectl get pod -n istio-systemNAME READY STATUS RESTARTS AGEgrafana-767c5487d6-d4rdm 1/1 Running 0 9m53sistio-egressgateway-7bf76dd59-vtsj9 1/1 Running 0 37mistio-ingressgateway-586dbbc45d-2l6sz 1/1 Running 0 37mistiod-6cc5758d8c-mgdcb 1/1 Running 0 37mjaeger-566c547fb9-brgcm 1/1 Running 0 9m53skiali-89fd7f87b-7vcgx 1/1 Running 0 9m53sprometheus-788c945c9c-btvwz 2/2 Running 0 9m53s

能够看到,grafana、jaeger、kiali 和 prometheus 组件都已经安装完成。

二、访问kiali组件

经过下面的命令能够在本地访问kiali界面:​​​​​​​

$ istioctl dashboard kialihttp://localhost:20001/kiali

三、观察 Kiali 面板

屡次刷新 Bookinfo 页面,经过以下命令打开 Kiali 面板,能够看到 Bookinfo 服务拓扑以下图所示。

​​​​​​​

小结


本文介绍了 Istio 1.7.3 的部署过程,并经过 Bookinfo 示例应用介绍了服务网格的使用,目前官方推荐使用 istioctl 进行安装,能够直接使用内置的配置文件完成 Istio 的安装,操做简单方便,本文经过描述 Istio 安装和使用过程,使读者对 Istio 造成初步认识。


做者简介:孙召昌,百度高级研发工程师,现就任于百度基础架构部云原生团队,参与了服务网格、云服务编排、分布式事务等项目的研发工做,并在百度内部完成多个核心业务的规模化落地,对云原生、微服务、Service Mesh、多云等方向有深刻的研究和实践经验。


了解更多微服务、云原生技术的相关信息,请关注咱们的微信公众号【云原生计算】

相关文章
相关标签/搜索