Istio 服务网格部署实践


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

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

准备工作

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。

Istio 安装文件

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

1、这里我们使用 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。

2、切换到 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 主要提供了以下三种安装方式,用户可以根据自己的实际需要进行选择。

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

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

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

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

部署 Istio

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

Istio 官方提供了针对不同场景的配置文件,这些内置的配置文件提供了对 Istio 控制平面和数据平面的定制内容。用户可以根据实际场景选择特定的配置文件,然后结合自定义选项完成定制化安装。当前提供以下几种内置配置文件包括:
  • default:根据默认的安装选项启用组件,建议用于生产环境的部署。
  • demo:用于展示 Istio 的基本功能,支持运行 Bookinfo 应用程序和相关任务。
  • minimal:使用 Istio 的流量管理功能所需的最少组件。
  • remote:用于配置多集群服务网格场景下的远程集群。
  • empty:不部署任何组件,可用于自定义配置的基础文件。
  • preview:包含实验性功能,用于探索 Istio 新功能,但无法保证稳定性。


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

这里为了测试方便,我们直接使用内置的 demo 配置文件进行安装,执行以下命令即可:
$ istioctl install --set profile=demo
Detected 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 组件。

2、查看组件状态

然后查看 Kubernetes 服务是否已经成功创建:
$ kubectl  get svc -n istio-system
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                                                                      AGE
istio-egressgateway    ClusterIP      172.18.2.116     <none>         80/TCP,443/TCP,15443/TCP                                                     5m35s
istio-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   5m35s
istiod                 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-system
NAME                                    READY   STATUS    RESTARTS   AGE
istio-egressgateway-7bf76dd59-vtsj9     1/1     Running   0          5m46s
istio-ingressgateway-586dbbc45d-2l6sz   1/1     Running   0          5m46s
istiod-6cc5758d8c-mgdcb                 1/1     Running   0          6m13s

3、开启自动注入

Istio 安装完成后,在部署应用之前,需要首先开启 sidecar 的自动注入,这里可以通过为命名空间添加标签实现,执行以下命令即可:
$ kubectl label namespace default istio-injection=enabled
namespace/default labeled

部署 Bookinfo 示例应用

在下载的 Istio 安装文件中,包括多种示例应用,这里我们以 Bookinfo 为例,介绍服务的部署使用过程。该应用由四个单独的微服务构成:
  • productpage:该服务会调用 details 和 reviews 两个微服务,用来生成页面。
  • details:该服务包含了书籍的信息。
  • reviews:该服务包含了书籍相关的评论,会调用 ratings 微服务。
  • ratings:该服务包含了由书籍评价组成的评级信息。


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

1、使用 kubectl 部署示例应用

进入 istio 安装目录 istio-1.7.3,执行下面的命令完成应用部署。
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created

2、查看服务和实例是否正常创建
$ kubectl  get svc
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   172.18.44.247    <none>        9080/TCP   26s
kubernetes    ClusterIP   172.18.0.1       <none>        443/TCP    35m
productpage   ClusterIP   172.18.106.238   <none>        9080/TCP   26s
ratings       ClusterIP   172.18.2.59      <none>        9080/TCP   26s
reviews       ClusterIP   172.18.10.251    <none>        9080/TCP   26s

$ kubectl  get pod
NAME                              READY   STATUS    RESTARTS   AGE
details-v1-5974b67c8-cpw96        2/2     Running   0          3m31s
productpage-v1-64794f5db4-svfk2   2/2     Running   0          3m30s
ratings-v1-c6cdf8d98-skc4q        2/2     Running   0          3m30s
reviews-v1-7f6558b974-cwsh9       2/2     Running   0          3m30s
reviews-v2-6cb6ccd848-5fzgc       2/2     Running   0          3m31s
reviews-v3-cc56b578-qqmn2         2/2     Running   0          3m31s

可以看到,服务和实例都已经创建成功。

3、确定 Ingress 的 IP 和端口

在 Bookinfo 服务正常启动并运行之后,需要设置 Istio 网关,这样可以在 Kubernetes 集群外部访问应用。
$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created

这里我们使用的 Kubernetes 集群支持外部负载均衡器,可以看到已经分配到 EXTERNAL-IP:
$ kubectl get svc istio-ingressgateway -n istio-system
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                                                                      AGE
istio-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

4、应用访问

在浏览器端打开地址 http://${GATEWAY_URL}/productpage,这里我们获取到的地址是154.85.54.75:80,可以看到界面如下。
1.png

查看组件面板

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

1、安装组件

执行以下命令安装 Istio 组件:
$ kubectl apply -f samples/addons

可以查看组件部署状态:
$ kubectl get pod -n istio-system
NAME                                    READY   STATUS    RESTARTS   AGE
grafana-767c5487d6-d4rdm                1/1     Running   0          9m53s
istio-egressgateway-7bf76dd59-vtsj9     1/1     Running   0          37m
istio-ingressgateway-586dbbc45d-2l6sz   1/1     Running   0          37m
istiod-6cc5758d8c-mgdcb                 1/1     Running   0          37m
jaeger-566c547fb9-brgcm                 1/1     Running   0          9m53s
kiali-89fd7f87b-7vcgx                   1/1     Running   0          9m53s
prometheus-788c945c9c-btvwz             2/2     Running   0          9m53s

可以看到,Grafana、Jaeger、Kiali 和 Prometheus 组件都已经安装完成。

2、访问 Kiali 组件

通过下面的命令可以在本地访问 Kiali 界面:
$ istioctl dashboard kiali
http://localhost:20001/kiali

3、观察 Kiali 面板

多次刷新 Bookinfo 页面,通过如下命令打开 Kiali 面板,可以看到 Bookinfo 服务拓扑如下图所示。
2.png

小结

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

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

原文链接:https://mp.weixin.qq.com/s/CKS6h5VQweoQ_SJEz0N66Q

0 个评论

要回复文章请先登录注册