转载

Kubernetes Istio微服务架构部署和使用

什么是Istio

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

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

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

  • Data Plane:作用是处理网格内服务间的通信,并完成服务发现、负载均衡、流量管理、健康检查等功能;
  • Control Plane:作用是管理和配置智能代理用于路由流量,同时配置Mixers来应用策略、收集指标。

Istio核心组件:

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

Istio可视化管理组件:

  • Vistio:用于近乎实时地监控应用程序和集群之间的网络流量。可以参考: https://www.yangcs.net/posts/v ... eral/
  • Kiali:提供可视化服务网格拓扑、断路器和请求率等功能。Kiali还包括 Jaeger Tracing,可以提供开箱即用的分布式跟踪功能。可以参考: https://jimmysong.io/istio-han ... .html
  • Jaeger:用于展示Istio微服务调用链关系,以及微服务工作状态监测。注意,在生产环境中,你应当使用Elasticsearch或Cassandra持久化存储Jaeger数据。可以参考: https://blog.csdn.net/ywq935/a ... 99297
    https://mathspanda.github.io/2 ... ploy/
    https://blog.frognew.com/2017/ ... .html

其中,Kiali、Jaeger、Prometheus、Grafana管理工具,将和Istio一并部署。 如果你想和更多Istio技术专家交流,可以加我微信liyingjiese,备注『加群』。群里每周都有全球各大公司的最佳实践以及行业最新动态

使用Helm部署Istio

依赖环境:

  • Helm > 2.10
  • Kubernetes > 1.9

下载并解压缩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: true

servicegraph:

enabled: true

kiali:

enabled: true

grafana:

enabled: true

首先,创建名称为kiali的secret。

# echo -n 'admin' | base64

YWRtaW4=
# echo -n '1f2d1e2e67df' | base64

MWYyZDFlMmU2N2Rm
# cat <<EOF | kubectl apply -f -

apiVersion: v1

kind: Secret

metadata:

name: kiali

namespace: istio-system

labels:

app: kiali

type: Opaque

data:

username: YWRtaW4=

passphrase: MWYyZDFlMmU2N2Rm

EOF

执行helm安装命令。

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

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

# kubectl get pod -n istio-system

NAME                                      READY   STATUS      RESTARTS   AGE

grafana-59b8896965-5f9j2                  1/1     Running     0          23m

istio-citadel-6f444d9999-s9jrc            1/1     Running     0          23m

istio-egressgateway-6d79447874-ssbc4      1/1     Running     0          23m

istio-galley-685bb48846-mvf5w             1/1     Running     0          23m

istio-grafana-post-install-6m256          0/1     Completed   0          23m

istio-ingressgateway-5b64fffc9f-mrl9t     1/1     Running     0          23m

istio-pilot-8645f5655b-k6fcz              2/2     Running     0          23m

istio-policy-547d64b8d7-6dgkp             2/2     Running     0          23m

istio-sidecar-injector-5d8dd9448d-zfdsb   1/1     Running     0          23m

istio-telemetry-c5488fc49-qwwcv           2/2     Running     0          23m

istio-tracing-6b994895fd-4vjfx            1/1     Running     0          23m

kiali-5f9ffff7cf-jqk8p                    1/1     Running     0          23m

prometheus-76b7745b64-xjzmm               1/1     Running     0          23m

servicegraph-cb9b94c-mlhjm                1/1     Running     0          23m

Istio以一个项目的形式部署到Kubernetes集群中。我们可以看到,部署好的Pod中,除了有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 <your-app-spec>.yaml

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

kubectl create -f <(istioctl kube-inject -f <your-app-spec>.yaml)

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等等。为了便于统一管理Kubernetes集群中的服务暴露,笔者更倾向使用Traefik Ingress。

使用Ingress暴露Istio服务。

编写ingress yaml文件,如下

# cat istio-ingress.yaml 

---

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

name: jaeger-query

namespace: istio-system

annotations:

kubernetes.io/ingress.class: traefik

spec:

rules:

- host: istio.jaeger-query.com

http:

  paths:

  - path: /

    backend:

      serviceName: jaeger-query

      servicePort: 16686



---

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

name: prometheus

namespace: istio-system

annotations:

kubernetes.io/ingress.class: traefik

spec:

rules:

- host: istio.prometheus.com

http:

  paths:

  - path: /

    backend:

      serviceName: prometheus

      servicePort: 9090



---

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

name: grafana

namespace: istio-system

annotations:

kubernetes.io/ingress.class: traefik

spec:

rules:

- host: istio.grafana.com

http:

  paths:

  - path: /

    backend:

      serviceName: grafana

      servicePort: 3000



---

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

name: kiali

namespace: istio-system

annotations:

kubernetes.io/ingress.class: traefik

spec:

rules:

- host: istio.kiali.com

http:

  paths:

  - path: /

    backend:

      serviceName: kiali

      servicePort: 20001

执行部署命令:

kubectl apply -f istio-ingress.yaml

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

172.16.0.180 istio.prometheus.com

172.16.0.180  istio.jaeger-query.com

172.16.0.180  istio.grafana.com

172.16.0.180  istio.kiali.com

访问Jaeger

浏览器访问Jaeger之前可以多次刷新productpage页面以便产生访问请求等。选择productpage.default可以查看整个调用链。使用istio.jaeger-query.com域名访问,结果展示:

Kubernetes Istio微服务架构部署和使用

访问kiali

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

Kubernetes Istio微服务架构部署和使用

访问Prometheus

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

Kubernetes Istio微服务架构部署和使用

访问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参考资料:

原文  http://dockone.io/article/8916
正文到此结束
Loading...