天天看点

微服务开发及部署_在 Kubernetes 中部署微服务架构 Istio

微服务开发及部署_在 Kubernetes 中部署微服务架构 Istio

什么是 Istio

Istio 是 Service Mesh(服务网格)的主流实现方案。该方案降低了与微服务架构相关的复杂性,并提供了负载均衡、服务发现、流量管理、断路器、监控、故障注入和智能路由等功能特性。

其中,Sidecar 模式是一种将应用功能从应用本身剥离出来作为单独进程的方式。该模式允许我们向应用无侵入添加多种功能,避免了为满足第三方组件需求而向应用添加额外的配置代码。从某种意义上来说,服务对于网络是无感知的,只知道所附加的 Sidecar 代理,它将网络依赖抽象成了 Sidecar。

在 Service Mesh 中,我们需要了解 Data Plane 和 Control Plane 两个概念:

  • Data Plane:作用是处理网格内服务间的通信,并完成服务发现、负载均衡、流量管理、健康检查等功能;
  • Control Plane:作用是管理和配置策略用于路由流量,同时也在运行期执行策略。

Istio 核心组件

  • Envoy:Istio 使用 Envoy调解服务网格中所有服务的入站和出站流量。属于数据平面。
  • Mixer:负责在服务网格上执行访问控制和使用策略,以及收集从Envoy和其他服务自动监控到的数据。
  • Pilot:为 Envoy sidecar 提供服务发现功能,为智能路由(例如 A/B 测试、金丝雀部署等)和弹性(超时、重试、熔断器等)提供流量管理功能。属于控制平面。
  • Citadel:提供访问控制和用户身份认证功能。

Istio 可视化管理组件

  • Vistio:用于近乎实时地监控应用程序和集群之间的网络流量。可以参考:https://www.yangcs.net/posts/vistio-visualize-your-istio-mesh-using-netflixs-vizceral/
  • Kiali:提供可视化服务网格拓扑、断路器和请求率等功能。Kiali还包括 Jaeger Tracing,可以提供开箱即用的分布式跟踪功能。可以参考:https://jimmysong.io/istio-handbook/setup/istio-observability-tool-kiali.html
  • jaeger:用于展示istio微服务调用链关系,以及微服务工作状态监测。注意,在生产环境中,你应当使用Elasticsearch或cassandra持久化存储jaeger数据。可以参考:

    https://blog.csdn.net/ywq935/article/details/80599297

    https://mathspanda.github.io/2018/09/19/jaeger-deploy/

    https://blog.frognew.com/2017/12/opentracing-jaeger-3.html

其中,Kiali、Jaeger、Prometheus、Grafana 管理工具,将和 Istio 一并部署。

使用 Helm 部署 Istio

依赖环境

  • 本文使用 Helm 安装,所以请确保 Helm 已安装,且版本最好 > 2.10。
  • Kubernetes 版本 > 1.9。

如果你还不会使用 Helm,可以先阅读「Helm 入门指南」和「利用 Helm 快速部署 Ingress」这两篇文章对 Helm 先做一个基本的了解。

下载并解压缩 Istio 的发布包。

$ wget https://github.com/istio/istio/releases/download/1.0.6/istio-1.0.6-linux.tar.gz$ tar -zxvf istio-1.0.6-linux.tar.gz$ cd istio-1.0.6
           

Istio 的 Chart 在 istio-1.0.6/install/kubernetes/helm 目录中,这个 Chart 包含了下面的代码文件。

$ tree install/kubernetes/helm/istio............31 directories, 139 files
           

如果安装的 Helm 版本高于 2.10,就不再需要手动使用 kubectl 安装 Istio 的 CRD。反之,则需要执行如下命令安装。

$ kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml
           

查看安装的 CRD。

$ kubectl get CustomResourceDefinition
           

通过各个组件在 vaule file 的 enabled flag 启用或禁用,下面创建名称为 istio.yaml 的 vaule file,将几个默认禁用的组件也启用。

tracing:  enabled: trueservicegraph:  enabled: truekiali:  enabled: truegrafana:  enabled: true
           

首先,创建名称为 Kiali 的 Secret。

$ echo -n 'admin' | base64YWRtaW4=
           
$ echo -n '1f2d1e2e67df' | base64MWYyZDFlMmU2N2Rm
           
$ cat <apiVersion: v1kind: Secretmetadata:  name: kiali  namespace: istio-system  labels:    app: kialitype: Opaquedata:  username: YWRtaW4=  passphrase: MWYyZDFlMmU2N2RmEOF
           

执行 Helm 安装命令。

$ helm install install/kubernetes/helm/istio --name istio --namespace istio-system -f istio.yaml
           

安装完成后确认各个组件的 Pod 已正常运行。

$ kubectl get pod -n istio-systemNAME                                      READY   STATUS      RESTARTS   AGEgrafana-59b8896965-5f9j2                  1/1     Running     0          23mistio-citadel-6f444d9999-s9jrc            1/1     Running     0          23mistio-egressgateway-6d79447874-ssbc4      1/1     Running     0          23mistio-galley-685bb48846-mvf5w             1/1     Running     0          23mistio-grafana-post-install-6m256          0/1     Completed   0          23mistio-ingressgateway-5b64fffc9f-mrl9t     1/1     Running     0          23mistio-pilot-8645f5655b-k6fcz              2/2     Running     0          23mistio-policy-547d64b8d7-6dgkp             2/2     Running     0          23mistio-sidecar-injector-5d8dd9448d-zfdsb   1/1     Running     0          23mistio-telemetry-c5488fc49-qwwcv           2/2     Running     0          23mistio-tracing-6b994895fd-4vjfx            1/1     Running     0          23mkiali-5f9ffff7cf-jqk8p                    1/1     Running     0          23mprometheus-76b7745b64-xjzmm               1/1     Running     0          23mservicegraph-cb9b94c-mlhjm                1/1     Running     0          23m
           

Istio 以一个项目的形式部署到 Kubernetes 集群中。我们可以看到,部署好的 Pods 中,除了有 istio-citadel、istio-egressgateway、istio-ingressgateway、istio-pilot 等 Istio 本身的功能组件,还集成了微服务相关的监控工具,如:Grafana、Jaeger-agent、Kiali、Prometheus。正是这些功能丰富且强大的监控工具,帮助 Istio实现了微服务的可视化管理。

运行示例 Bookinfo

您可以部署自己的应用或者示例应用程序如 Bookinfo。 注意:应用程序必须使用 HTTP/1.1 或 HTTP/2.0 协议来传递 HTTP 流量,因为 HTTP/1.0 已经不再支持。

如果运行 Pod 的 Namespace 被标记为 istio-injection=enabled 的话,Istio-Initializer 会向应用程序的 Pod 中自动注入 Envoy 容器。

$ kubectl label namespace <namespace> istio-injection=enabled$ kubectl create -n <namespace> -f .yaml
           

如果您没有安装 Istio-initializer-injector 的话,您必须使用 istioctl kube-inject 命令在部署应用之前向应用程序的 Pod 中手动注入 Envoy 容器。

$ kubectl create -f istioctl 
           

Bookinfo 应用由四个单独的微服务构成,用来演示多种 Istio 特性,包含:

  • productpage :productpage 微服务会调用 details 和 reviews 两个微服务,用来生成页面。
  • details :这个微服务包含了书籍的信息。
  • reviews :这个微服务包含了书籍相关的评论。它还会调用 ratings 微服务。
  • ratings :ratings 微服务中包含了由书籍评价组成的评级信息。

reviews 微服务有 3 个版本:

  • v1 版本不会调用 ratings 服务。
  • v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
  • v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。

下图展示了这个应用的端到端架构。

微服务开发及部署_在 Kubernetes 中部署微服务架构 Istio

运行示例 bookinfo,并开启 Sidecar 自动注入。

$ kubectl label namespace default istio-injection=enabled$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml$ kubectl apply -f samples/bookinfo/platform/consul/destination-rule-all.yaml
           

访问 productpage

http://172.16.0.180:31380/productpage

微服务开发及部署_在 Kubernetes 中部署微服务架构 Istio

其中的 31380 端口可以通过命令获取。

$ kubectl -n istio-system get svc istio-ingressgateway -o jsonpath='{.spec.ports[0].nodePort}'
           

使用 Ingress 暴露管理服务

完成 Istio 的安装后,可以看到安装的组件除了 Istio 架构中的数据平面和控制平面的各个核心组件,还部署了 Prometheus、Grafana、Jaeger、Kiali 等辅助组件。 在云原生生态中,我们已经对这些组件很熟悉了。

  • Prometheus:监控系统,收集 Istio 的监控数据。
  • Grafana:监控信息的图表展现,Istio 部署的 Grafana 为我们内置了各个组件相关的 Dashboard。
  • Jaeger:分布式跟踪系统,Istio 中集成 Jaeger 可以对基于 Istio 的微服务实现调用链跟踪、依赖分析,为性能优化和故障排查提供支持。
  • Kiali:Kiali 作为 Istio 的可视化管理工具,可以认为是 Istio 的UI,可以展现服务的网络拓扑、服务的容错情况(超时、重试、短路等)、分布式跟踪等。

这些辅助组件都有自己的 Web 界面,这里我们使用 Ingress 的方式将这些组件暴露到集群外,以便在集群外部访问。Istio 支持使用自带的 istio-ingressgateway 将服务暴露到集群外部,这个和 Kubernetes 中暴露 Ingress Controller 类似,有很多种方式,如 NodePort,LoadBalancer,或直接开启 hostNetwork: true等等。为了便于统一管理K8s集群中的服务暴露,笔者更倾向使用 Traefik Ingress。

1. 使用 Ingress 暴露 Istio 服务

编写 ingress yaml 文件,如下:

$ cat istio-ingress.yaml ---apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: jaeger-query  namespace: istio-system  annotations:    kubernetes.io/ingress.class: traefikspec:  rules:  - host: istio.jaeger-query.com    http:      paths:      - path: /        backend:          serviceName: jaeger-query          servicePort: 16686---apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: prometheus  namespace: istio-system  annotations:    kubernetes.io/ingress.class: traefikspec:  rules:  - host: istio.prometheus.com    http:      paths:      - path: /        backend:          serviceName: prometheus          servicePort: 9090---apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: grafana  namespace: istio-system  annotations:    kubernetes.io/ingress.class: traefikspec:  rules:  - host: istio.grafana.com    http:      paths:      - path: /        backend:          serviceName: grafana          servicePort: 3000---apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: kiali  namespace: istio-system  annotations:    kubernetes.io/ingress.class: traefikspec:  rules:  - host: istio.kiali.com    http:      paths:      - path: /        backend:          serviceName: kiali          servicePort: 20001
           

2. 执行部署命令

$ kubectl apply -f istio-ingress.yaml
           

3. 外部客户端,配置 hosts 地址解析,如下:

172.16.0.180 istio.prometheus.com172.16.0.180  istio.jaeger-query.com172.16.0.180  istio.grafana.com172.16.0.180  istio.kiali.com
           

4. 访问 Jaeger

浏览器访问 Jaeger 之前可以多次刷新 productpage 页面以便产生访问请求等。

选择 productpage.default 可以查看整个调用链。使用 istio.jaeger-query.com 域名访问,结果展示:

微服务开发及部署_在 Kubernetes 中部署微服务架构 Istio

5. 访问 Kiali

使用域名istio.kiali.com访问kiali页面。用户名admin,密码1f2d1e2e67df。

微服务开发及部署_在 Kubernetes 中部署微服务架构 Istio

6. 访问 Prometheus

使用域名 istio.prometheus.com 访问 Prometheus 页面。

微服务开发及部署_在 Kubernetes 中部署微服务架构 Istio

7. 访问 Grafana

使用域名 istio.grafana.com 访问 Prometheus 页面。

微服务开发及部署_在 Kubernetes 中部署微服务架构 Istio

Istio 对 Pod 和服务的要求

要成为服务网格的一部分,Kubernetes 集群中的 Pod 和服务必须满足以下几个要求:

  • 需要给端口正确命名:服务端口必须进行命名。端口名称只允许是[--]模式;
  • Pod 必须关联到 Kubernetes 服务:如果一个 Pod 属于多个服务,这些服务不能再同一端口上使用不同协议,例如 HTTP 和 TCP。
  • Deployment 应带有 app 以及 version 标签:每个 Deployment 都应该有一个有意义的 app 标签和一个用于标识 Deployment 版本的 version 标签。Istio 会用 app 和 version 标签来给监控指标数据加入上下文信息。

总结

本文实践了使用 Istio 官方提供的 Helm Chart 在 Kubernetes上 部署 Istio 1.0.6 的过程,并使用 Traefik Ingress 将 Istio 集成的 Prometheus、Grafana、Jaeger、Kiali 等辅助组件暴露到集群外部,并对进入集群的流量进行管理。

在生产环境中,如果是基于公有云,如阿里云、AWS等运行 Istio,建议Ingress 的 IP 地址使用 ELB 地址;如果是自建的平台,则建议使用HAproxy+Keepalived 提供的 VIP 地址,作为 Ingress 的 IP 地址,实现高可用。

如果 Ingress 服务,需要暴露在公网,应当使用 CA 认证机构颁发的证书 HTTPS 化(如使用 Cert-Manager)。此外建议使用 NFS、Ceph 等方案实现 Istio 监控以及微服务应用的数据持久化存储。

Istio 参考资料

  • https://istio.io/zh/docs/
  • https://jimmysong.io/istio-handbook/
  • http://www.servicemesher.com/

来源:xuchao's blog原文:http://t.cn/EScBrdO题图:来自谷歌图片搜索 

版权:本文版权归原作者所有投稿:欢迎投稿,投稿邮箱: [email protected]

微服务开发及部署_在 Kubernetes 中部署微服务架构 Istio

今日思想

人生是一趟巡礼的旅程。人的一生有多么苦难。然而,我们在这人生的大海里,藉神的使者、爱的天使获得慰藉。但可别忘记,神透过人生那些平凡的事物,教你更高深的事物。

—— 梵高

微服务开发及部署_在 Kubernetes 中部署微服务架构 Istio

推荐阅读

  • 大话高并发架构
  • 图解 Kubernetes 架构
  • 图解 Ansible 自动化运维
  • 谈谈 TCP 的 TIME_WAIT
  • 浅谈几种常用负载均衡架构

微服务开发及部署_在 Kubernetes 中部署微服务架构 Istio
微服务开发及部署_在 Kubernetes 中部署微服务架构 Istio
微服务开发及部署_在 Kubernetes 中部署微服务架构 Istio