我学习了Istio的路由控制和可观测性功能,以下是我自己的学习笔记

这是关于在个人电脑上的Kubernetes集群中运行并验证最新版本的Istio 1.4.2的笔记。

スクリーンショット 2019-12-14 23.25.24.png

Istio 是什么?

在服务网格产品中,Istio是获得星星数最多的,也就是最受欢迎的开源服务网格。其他著名的包括由CNCF支持的LINKERD以及由HashCorp推动的Consul。此外,在2019年5月的KubeCon Barcelona大会上,Microsoft推出了由他们推动的服务网格接口(SMI)开源项目,但从星星数来看,似乎并没有得到太多支持。

Istio是一个由Google、IBM等公司开发的用于监视和操作微服务的工具,是由CNCF的高级成员推动的项目。

servicemesh.png

Istio包括Envoy、Kiali、Jaeger、Grafana等工具,可以进行请求流量控制、微服务关系可视化、分布式追踪和指标管理。

由于每个开源软件(OSS)都是独立的项目,因此需要打开各自的网页界面才能访问。

更改学习环境设置

使用于验证的环境是一个运行于Windows10和macOS的虚拟环境,它是一个由三个节点组成的上游Kubernetes集群,该集群是为了学习而创建的,而不是使用IBM Cloud等公共云或Red Hat的OpenShift。这样的Kubernetes环境容易在个人电脑上运行,无需担心云计算的费用,可以用于个人技能的提升,而且可以轻松地创建和销毁。停止实例后,也不会占用CPU和RAM资源,因此可以利用零散的时间继续学习。在本书中,它被称为学习环境2。

K8s-Book.png

从学习环境2的工作节点默认值修改为2个CPU核心和4GB的RAM分配。由于Istio组件被安装到工作节点上,因此不需要更改主节点的默认分配。

在本地执行git clone https://github.com/takara9/vagrant-kubernetes命令后,克隆Vagrant文件。接下来,需要修改Vagrantfile的参数。以下是需要修改的部分:对于node1和node2进行修改,而对于master没有必要进行更改。

    machine.vm.provider "virtualbox" do |vbox|
      vbox.gui = false
      vbox.cpus = 2
      vbox.memory = 4096
    end

当然,在这个修改中,由于要消耗电脑的CPU核心数和内存容量,所以必须使用具有足够CPU核心数和内存容量的电脑才能执行。在作者的环境中,使用了CPU 8核、内存32GB的Mac。如果有Vagrant和VirtualBox的环境,也可以在Windows10或Linux环境下执行类似的操作。关于在电脑上启动Kubernetes集群的方法,请参考https://github.com/takara9/vagrant-kubernetes进行指导。启动Kubernetes集群后,与公共云的Kubernetes并无差异,因此从下一节开始,可以使用公共云服务来执行相同的操作。

当Kubernetes集群启动并通过以下命令确认存在两个工作节点后,我们可以开始验证Istio的工作状态。

maho:k8s-istio maho$ export KUBECONFIG=`pwd`/kubeconfig/config
maho:k8s-istio maho$ kubectl get node
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   16m   v1.14.3
node1    Ready    <none>   15m   v1.14.3
node2    Ready    <none>   15m   v1.14.3

在公共云的Kubernetes服务中,如GKE、IKS等,虽然无法看到主节点,但这不会影响验证。

安装Istio

按照Isito的文档(https://istio.io/docs/setup/getting-started/),进行安装。使用curl命令下载Istio客户端命令和用于集群端的清单文件,然后将其解压到计算机的本地目录中。

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

<中略>
Istio has been successfully downloaded into the istio-1.4.2 folder on your system.

Next Steps:
See https://istio.io/docs/setup/kubernetes/install/ to add Istio to your Kubernetes cluster.

To configure the istioctl client tool for your workstation,
add the /Users/maho/vm1/k8s-istio/istio-1.4.2/bin directory to your environment path variable with:
     export PATH="$PATH:/Users/maho/vm1/k8s-istio/istio-1.4.2/bin"

Begin the Istio pre-installation verification check by running:
     istioctl verify-install 

Need more information? Visit https://istio.io/docs/setup/kubernetes/install/ 

进入展开先的目录,并将istioctl命令加入路径中。

maho:k8s-istio maho$ cd istio-1.4.2
maho:istio-1.4.2 maho$ ls
LICENSE     bin     manifest.yaml   tools
README.md   install     samples
maho:istio-1.4.2 maho$ export PATH=$PWD/bin:$PATH

使用istioctl manifest命令,安装Istio所需的组件。命令选项的说明在https://istio.io/docs/reference/commands/istioctl/#istioctl-manifest-apply上。

根据以下命令执行时的消息可知,要执行Istio,需要包含许多参与CNCF的组织的开源软件。您可以使用–set profile=配置文件名称来选择组件。请参考https://istio.io/docs/setup/additional-setup/config-profiles/以获取具体说明。

maho:istio-1.4.2 maho$ istioctl manifest apply --set profile=demo
Preparing manifests for these components:
- Policy
- Prometheus
- Injector
- Galley
- CoreDNS
- Kiali
- Pilot
- PrometheusOperator
- Grafana
- Tracing
- Base
- Citadel
- CertManager
- Telemetry
- IngressGateway
- NodeAgent
- EgressGateway
- Cni

<中略>

Component CertManager installed successfully:
=============================================

Component Telemetry installed successfully:
===========================================

可以看出,Istio已安装了所需的工具,如用于度量监控的Web UI grafana、时序数据库prometheus、分布式追踪工具jaeger等可视化工具Kiali。因此,需要注意节点的CPU核心数和内存量,因为Istio需要较多资源。在我的环境中,工作节点启动时配置为2个CPU核心和4GB内存。

接下来是安装了Istio 1.4.2后的服务列表,除了Istio外,还可以看到grafana、jaeger、kiali、prometheus、zipkin等正常运行。

maho:istio-1.4.2 maho$ kubectl get svc -n istio-system
NAME                     TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)
grafana                  ClusterIP      10.32.0.138   <none>        3000/TCP
istio-citadel            ClusterIP      10.32.0.11    <none>        8060/TCP,15014/TCP
istio-egressgateway      ClusterIP      10.32.0.133   <none>        80/TCP,443/TCP,15443/TCP
istio-galley             ClusterIP      10.32.0.24    <none>        443/TCP,15014/TCP,9901/TCP,1501
istio-ingressgateway     LoadBalancer   10.32.0.201   <pending>     15020:30110/TCP,80:31967/TCP,44
istio-pilot              ClusterIP      10.32.0.164   <none>        15010/TCP,15011/TCP,8080/TCP,15
istio-policy             ClusterIP      10.32.0.151   <none>        9091/TCP,15004/TCP,15014/TCP
istio-sidecar-injector   ClusterIP      10.32.0.43    <none>        443/TCP
istio-telemetry          ClusterIP      10.32.0.96    <none>        9091/TCP,15004/TCP,15014/TCP,42
jaeger-agent             ClusterIP      None          <none>        5775/UDP,6831/UDP,6832/UDP
jaeger-collector         ClusterIP      10.32.0.67    <none>        14267/TCP,14268/TCP,14250/TCP
jaeger-query             ClusterIP      10.32.0.217   <none>        16686/TCP
kiali                    ClusterIP      10.32.0.49    <none>        20001/TCP
prometheus               ClusterIP      10.32.0.243   <none>        9090/TCP
tracing                  ClusterIP      10.32.0.97    <none>        80/TCP
zipkin                   ClusterIP      10.32.0.253   <none>        9411/TCP

在上述服务列表中,存在一个TYPE = LoadBalancer的部分。由于我们所使用的计算机上的Kubernetes集群没有负载均衡器,因此我们将在后文介绍使用NodePort进行访问的方法,所以无需担心它处于Pending状态。

下一个是istio-system命名空间中pod的列表。您可以了解到Istio的主要组件的名称。关于这些组件,我稍后会详细介绍。

maho:istio-1.4.2 maho$ kubectl get pod -n istio-system
NAME                                      READY   STATUS    RESTARTS   AGE
grafana-5f798469fd-hcqnz                  1/1     Running   0          3m46s
istio-citadel-6dc789bc4c-cq7qq            1/1     Running   0          3m47s
istio-egressgateway-75cb89bd7f-qbxtp      1/1     Running   0          3m47s
istio-galley-5bcd89bd9c-878xw             1/1     Running   0          3m46s
istio-ingressgateway-7d6b9b5ffc-8smlp     1/1     Running   0          3m47s
istio-pilot-678b45584b-5ljsk              1/1     Running   0          3m46s
istio-policy-9f78db4cb-hj68b              1/1     Running   4          3m47s
istio-sidecar-injector-7d65c79dd5-6g94x   1/1     Running   0          3m46s
istio-telemetry-fc488f958-bzmg7           1/1     Running   1          3m47s
istio-tracing-cd67ddf8-p4q2c              1/1     Running   0          3m47s
kiali-7964898d8c-zvs26                    1/1     Running   0          3m46s
prometheus-586d4445c7-4928l               1/1     Running   0          3m47s

下一步是显示Istio刚刚部署后的CPU和内存使用情况。在应用程序没有运行的情况下,工作节点的内存使用量已经达到了1.3GB,并且可以看出默认设置无法正常运行。

maho:istio-1.4.2 maho$ kubectl top nodes
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
master   102m         5%     743Mi           83%
node1    99m          4%     1316Mi          34%
node2    89m          4%     1375Mi          35%

请根据https://istio.io/docs/setup/platform-setup/上的说明,安装Istio到主要的公共云平台OpenShift。如有需要,请参考。

Istio的主要组件和功能概述

我想尝试对前面列出的组件进行解释。按照角色将Pod列表进行分组排列,逐个进行说明。

入口网关和出口网关

下一个Pod将负责Istio服务网格的入口和出口。

istio-ingressgateway-7d6b9b5ffc-8smlp     1/1     Running   0          3m47s
istio-egressgateway-75cb89bd7f-qbxtp      1/1     Running   0          3m47s

Kubernetes中常常使用Ingress作为将内部服务公开到外部的方法。然而,在Istio的服务网格中提供了更好的方法。这就是Istio Gateway,通过利用其中的Istio Ingress Gateway,可以对进入集群的流量应用监控、路由控制等功能。而负责出口的则是Istio Egress Gateway。

这是由Envoy实现的,入口流量由pod istio-ingressgateway-xxxx负责,出口流量由pod istio-egressgateway-xxxx负责。

参考URL
+ 网关, https://istio.io/docs/reference/config/networking/gateway/
+ 入口网关, https://istio.io/docs/tasks/traffic-management/ingress/ingress-control/
+ 出口网关, https://istio.io/docs/tasks/traffic-management/egress/egress-gateway/

侧车注入器

以下是一个用来为应用程序的Pod中应用服务网格Istio的命名空间设置一个被称为Sidecar的容器的Pod。

istio-sidecar-injector-7d65c79dd5-6g94x   1/1     Running   0          3m46s

这个Pod的作用是修改部署到目标命名空间的Pod的清单,并配置一个名为Envoy Proxy的Sidecar容器。这个Envoy Proxy的作用是中继来自前述Ingress Gateway的流量,并将其引导到应用程序容器。

Istio 控制平面

接下来,我们将探讨Istio的核心部分,即被称为Istio控制平面的一组Pod。这些Pod是Istio的核心组件,我想解释一下它们各自的作用。

istio-pilot-678b45584b-5ljsk              1/1     Running   0          3m46s
istio-policy-9f78db4cb-hj68b              1/1     Running   4          3m47s
istio-citadel-6dc789bc4c-cq7qq            1/1     Running   0          3m47s
istio-telemetry-fc488f958-bzmg7           1/1     Running   1          3m47s
istio-tracing-cd67ddf8-p4q2c              1/1     Running   0          3m47s
istio-galley-5bcd89bd9c-878xw             1/1     Running   0          3m46s

在下面的注释中,说明 Istio Pod 的名称和功能。每个 Pod 名称的末尾都附加了控制器的哈希值,并且在每次启动时都会发生变化,因此表示为 “-xxxxx”。

    • istio-pilot-xxxx : Proxyのサイドカーの検出、トラフィック管理、サーキットブレイカーなどレジリエンシーを担当

 

    • istio-policy-xxxx : アクセス制御や流量制御などのポリシーをProxyへ提供を担当

 

    • istio-telemetry-xxxx : Proxyからテレメトリデータを取得を担当

 

    • istio-citadel-xxxx : シタデル(Citadel:要塞の意味)は認証局、サービス間とユーザー認証を担当

 

    • istio-tracing-xxxx : 分散トレーシングを担当

 

    istio-galley-xxxx : ギャレー(Galley: 調理室、ゲラ(印刷)の意味)は、構成検証、処理と分散のコンポーネントを担当

在Istio的架构中,中心组件是Mixer,但没有名为Mixer的Pod存在。Mixer负责在整个服务网格中应用访问控制和策略,并从代理等组件收集遥测数据。具体来说,代理会提取请求级别的属性,并将其发送到Mixer进行评估。然后,Mixer通过Policy将访问控制和流量控制等信息发送给代理。

参考网址:
* 架构,https://istio.io/docs/ops/deployment/architecture/
* Istio使用的端口,https://istio.io/docs/ops/deployment/requirements/#ports-used-by-istio

可观测性 (kě cè

以下是有关Metrics、Logs和Distributed Tracing的Pod列表。

grafana-5f798469fd-hcqnz                  1/1     Running   0          3m46s
prometheus-586d4445c7-4928l               1/1     Running   0          3m47s
kiali-7964898d8c-zvs26                    1/1     Running   0          3m46s

注解Pod的名称和功能。

    • grafana-xxxx : メトリックス監視用のウェブUI

 

    • prometheus-xxxx : 時系列データベース

 

    kiali-xxxx : Istioサービスメッシュのための可視化ツール

参考网址:
* Grafana 官网, https://grafana.com/
* Prometheus 官网, https://prometheus.io/
* Kiali 官网, https://kiali.io/

Istio的架构

我们想要审视一下Istio的架构。这里提供两张架构图来展示不同的视角。第一张图表示主要组件之间的关系,而第二张图则是以安全视角来展示Istio的架构。

首先,我们注意到图上部的Service A->Service B的协作。要使用Service A调用Service B,需要通过六边形图标的代理进行中转。这就是Envoy代理。该代理会接收来自Pilot的配置信息,并将其转发到服务的访问地址。例如,当存在多个不同版本的服务时,可以控制请求的分发比例等。Mixer会向代理应用策略,并收集代理传输的遥测数据。Mixer提供了灵活的插件模块,可以与Kubernetes API和云服务API进行协作。

Galley的作用是防止Istio依赖于平台。它收集Kubernetes的配置信息,并向Mixer和Pilot提供这些信息。Citadel负责创建和分发用于加密通信的证书,以及处理服务间的认证和用户认证。

art_of_Istio.png

以下是一个中文的翻译选项:

下图展示了一个以安全性操作为中心的架构图。Istio服务网格从外部接收请求流量,并通过入口代理(Ingress Proxy)进行处理。入口代理预先设定了传输策略,根据策略将请求转发给Service A的边车代理(Sidecar Proxy),从而达到Service A。此外,当Service A需要访问位于其后方的Service B时,也通过Envoy代理进行传输。这些代理之间的路由和认证等操作由Istio控制平面负责。每个代理还会向Mixer发送遥测信息。相反,当Istio服务网格需要访问外部时,会使用出口代理(Egress Proxy)。

security_art_of_istio.png

交通管理

以下是Istio的流量管理功能列表。

Request Routing リクエストをマイクロサービスの複数のバージョンに動的にルーティング

Fault Injection 模擬障害によってアプリケーションの復元力をテストする方法

Traffic Shifting マイクロサービスのあるバージョンから別のバージョンにトラフィックを徐々に移行する方法

TCP Traffic Shifting TCPトラフィックを古いバージョンから新しいバージョンに移行

Request Timeouts Envoyでリクエストタイムアウトを設定する方法

Circuit Breaking コネクションやリクエストの異常値検出時の遮断を構成する方法

Mirroring Istioのトラフィックミラーリング機能

Ingress 入力トラフィックの制御

Egress 出力トラフィックの制御

安全性

这是一种将服务网格保持在安全状态的功能。

Authentication 相互TLSおよびエンドユーザー認証の制御

Authorization Istioサービスへのアクセスを制御する方法

Citadel Configuration Citadel認証局のカスタマイズ

Istio DNS Certificate Management Citadelは、独自の署名キーを維持し、IstioのCAとしても機能。Chironを介してIstioコントロールプレーンコンポーネントのDNS証明書をプロビジョニングおよび管理する方法

Istio Webhook Management Experimental Istioには、GalleyとSidecar Injector の2つのウェブフックがあり、独自のためリスクがある。この対策としてWebhookの構成を安全に管理する方法

政策

这是一个强制执行政策的功能列表。

Enabling Policy Enforcement Istioポリシー適用を有効にする方法

Enabling Rate Limits サービスへのトラフィックを動的に制限する方法

Control Headers and Routing ポリシーアダプターを使用して要求ヘッダーとルーティングを操作する方法

Denials and White/Black Listing 属性ベースまたはIPベースのホワイトリストまたはブラックリストでアクセス制御する方法

可观测性

這是一種從服務網格中收集遙測信息的方法。

Metrics メトリックス収集を構成する方法

Logs ログ収集と処理を構成する方法

Distributed Tracing トレーススパンを収集するためのIstio対応アプリケーションの設定方法

Visualizing Your Mesh Kialiによる様々な側面を視覚化する方法

Remotely Accessing Telemetry Addons クラスター外のテレメトリアドオンを公開してアクセスするようにIstioを構成する方法

示例应用程序 Bookinfo

可以从这里开始,运行Istio包中附带的示例应用程序,以确认具体的操作。安装方法可参考https://istio.io/docs/examples/bookinfo/#deploying-the-application ,可以一并查阅。

用下面的命令指定Istio边车自动注入的命名空间。在这里,我们使用了默认的命名空间,但在实际运营中,应该不使用默认的命名空间来应用Istio。这是因为即使为了调试目的而运行Pod,也会安装Envoy代理,导致处理起来更加麻烦。

maho:istio-1.4.2 maho$ kubectl create namespace bookinfo
namespace/bookinfo created
maho:istio-1.4.2 maho$ kubectl label namespace bookinfo istio-injection=enabled
namespace/default labeled

只需要应用以下的YAML文件即可完成应用的安装。

maho:istio-1.4.2 maho$ kubectl apply -n bookinfo -f samples/bookinfo/platform/kube/bookinfo.yaml

通过这个操作,将会创建4个服务和6个部署。

    • service/productpage created

 

    • service/details created

 

    • service/reviews created

 

    • service/ratings created

 

    • deployment.apps/productpage-v1 created

 

    • deployment.apps/details-v1 created

 

    • deployment.apps/reviews-v1 created

 

    • deployment.apps/reviews-v2 created

 

    • deployment.apps/reviews-v3 created

 

    deployment.apps/ratings-v1 created

产品页面是能够体现该书籍首页整体感的页面。详情页面显示详细信息,评论页面直接展示评论内容,评分页面用于设置评分。评论有v1至v3的版本,显示内容有所不同。服务中只有一个评论,并且通过标签与Pod相对应,v1至v3的评论页面将会随机显示。

以下是显示服务列表的内容。所有的服务都可以被视为微服务。

maho:istio-1.4.2 maho$ kubectl get services -n bookinfo
NAME          TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.32.0.222   <none>        9080/TCP   52s
productpage   ClusterIP   10.32.0.150   <none>        9080/TCP   52s
ratings       ClusterIP   10.32.0.223   <none>        9080/TCP   52s
reviews       ClusterIP   10.32.0.33    <none>        9080/TCP   52s

以下是应用程序Pod列表,这些Pod是从上述服务转发而来的。请注意READY部分。READY列显示为2/2,表示Pod中有两个容器在运行。换句话说,原始应用程序Pod中注入了Envoy代理容器,因此Pod内有两个容器在运行。

maho:istio-1.4.2 maho$ kubectl get pods -n bookinfo
NAME                             READY   STATUS    RESTARTS   AGE
details-v1-c5b5f496d-wvw5q       2/2     Running   0          91s
productpage-v1-c7765c886-c5tks   2/2     Running   0          90s
ratings-v1-f745cf57b-mqzj8       2/2     Running   0          90s
reviews-v1-75b979578c-lpprp      2/2     Running   0          90s
reviews-v2-597bf96c8f-876n6      2/2     Running   0          91s
reviews-v3-54c6c64795-tghf7      2/2     Running   0          91s

使用以下命令来执行简单的访问测试,以确认应用程序正在运行。
如果显示了,则可以认为应用程序正常运行。

maho:istio-1.4.2 maho$ kubectl exec -it $(kubectl get pod -n bookinfo -l app=ratings -o jsonpath='{.items[0].metadata.name}') -n bookinfo -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

Istio 网关的配置

通过前面的操作,启动了已配置Istio代理的应用程序。接下来,需要将其配置为接受来自Istio服务网格之外的流量。

maho:istio-1.4.2 maho$ kubectl apply -n bookinfo -f samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created

Gateway是由Istio扩展的Kubernetes资源,在没有安装Istio的Kubernetes集群中无法使用。

maho:istio-1.4.2 maho$ kubectl get gateway -n bookinfo
NAME               AGE
bookinfo-gateway   18s

根据以下内容中提到的Ingress Gateway在选择器(selector)中的描述,可以看出它与之相互配合。

maho:istio-1.4.2 maho$ kubectl describe gateway -n bookinfo
Name:         bookinfo-gateway
Namespace:    bookinfo
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"networking.istio.io/v1alpha3","kind":"Gateway","metadata":{"annotations":{},"name":"bookinfo-gateway","namespace":"default"...
API Version:  networking.istio.io/v1alpha3
Kind:         Gateway
Metadata:
  Creation Timestamp:  2019-12-11T07:08:34Z
  Generation:          1
  Resource Version:    7509
  Self Link:           /apis/networking.istio.io/v1alpha3/namespaces/default/gateways/bookinfo-gateway
  UID:                 0b7e6b1c-1be5-11ea-9c24-02b444486472
Spec:
  Selector:
    Istio:  ingressgateway
  Servers:
    Hosts:
      *
    Port:
      Name:      http
      Number:    80
      Protocol:  HTTP
Events:          <none>

然而,由于 istio-ingressgateway 的 LoadBalancer 功能没有起作用,所以无法从 Kubernetes 集群外部进行访问。下面将详细说明这个问题的解决方案。

设置NodePort

即使在Kubernetes集群中没有集成LoadBalancer,但是istio-ingressgateway针对每个服务都通过NodePort进行开放,所以可以通过Worker节点的IP地址和NodePort端口号进行访问。

通过在istio-system命名空间下执行kubectl get service -n istio-system istio-ingressgateway -o yaml命令,可以了解NodePort和服务之间的对应关系。

在这里,我们将看一下如何使用jsonpath从JSON格式的输出中提取值。在这里,我们将获取连接到应用程序Pod的HTTP/HTTPS端口号。

maho:istio-1.4.2 maho$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
maho:istio-1.4.2 maho$ echo $INGRESS_PORT
31128

然后,获取运行ingressgateway的工作节点的IP地址。

maho:istio-1.4.2 maho$ export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')
maho:istio-1.4.2 maho$ echo $INGRESS_HOST
172.16.20.13

由于NodePort端口号和Worker节点的IP地址已经准备好,所以我们通过组装环境变量来尝试访问。

maho:istio-1.4.2 maho$ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
maho:istio-1.4.2 maho$ curl -s http://${GATEWAY_URL}/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

通过显示,可以确定通过Istio网关可以访问在Istio服务网格内的应用程序。

如果从浏览器访问,则会显示以下画面。刷新后,屏幕右侧的”图书评价”显示3个部署版本v1、v2、v3依次显示。v1没有星星,v2带有黑色星星,v3带有红色星星。

bookinfo.png

利用可观测性功能

首先,我们从以微服务构建的应用程序的组成开始确认。

要启动嵌入在Istio中的Kiali,需要执行以下命令。计算机的浏览器将启动,并显示Kiali的主页。

maho:istio-1.4.2 maho$ istioctl dashboard kiali
http://localhost:61684/kiali

或者,在https://localhost:61684/kiali/console/overview打开登录页面,使用admin/admin进行登录。

在Kiali的概述页面中,每个命名空间都显示了应用程序的数量,因此请点击”bookinfo”进行下一步。

kiali-1.png

为了以最新状态显示屏幕,并且如果应用程序没有访问记录,则无法显示图形。因此,您可以通过浏览器等在20秒至30秒之间反复重新加载 http://${GATEWAY_URL}/productpage 来在Kiali屏幕上确认状态。

在下一屏幕设置中,可以显示应用程序微服务的结构以及各个区间的等待时间。通过这个,可以确定在哪个微服务网格中花费了时间的应用程序。在这种模式下,三角形图标代表服务,圆形图标代表应用程序的工作负载。

kiali-2.png

接下来可以通过点击屏幕中的圆形图标”productpage-v1″来切换到以该应用的工作负载为中心的放大图。在这里可以看到在”reviews”服务下存在着三种版本的应用程序(Pod):”reviews-v1″、”reviews-v2″和”reviews-v3″。同时,可以通过视觉的方式了解到”reviews-v2″和”reviews-v3″使用了”ratings”服务。

以下屏幕截图显示的是点击productpage-v1后显示的放大图。在绿线的中间,显示了响应时间。这是通过Envoy代理在服务与应用程序容器之间测得的响应时间。通过这个方式,可以在微服务协作中了解具体的问题所在。而对于请求的内容等部分,可以使用分布式追踪工具进行观察。

kiali-3.png

请对请求流量进行控制。

想要确认Itiso的流量管理功能,可以通过控制对两个版本的应用程序 reviews-v1 和 reviews-v2 的分流比例来实现。这是一种有用的功能,可以通过逐步发布而不是在一个阶段上执行新功能的应用程序发布,来实施金丝雀发布。

控制此负载均衡比例使用Istio的两个资源。其中一个是目标规则 (Destination Rule),另一个是虚拟服务 (Virtual Service)。

目标规则定义了在路由发生后应用于服务流量的策略。这些规则可能包括负载均衡算法的选择、连接数限制、检测和排除响应慢的异常主机等。

虚拟服务是Istio流量控制的主要功能之一,与目标规则一起用于配置路由请求到Istio服务网格中。它按顺序评估路由规则,并从匹配的规则中确定最终的路由目标。

下一步是在 Kubernetes 资源中,通过 Istio 的引入扩展了功能的 VirtualService,对于 subset: v1 和 v2,通过 weight 的值指定了权重分配。在其中,v1 的路由比例为 90%,v2 的路由比例为 10%。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 90
    - destination:
        host: reviews
        subset: v2
      weight: 10

上述的子集是指定在DestinationRule中设置的主机的子集之一。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v3
    labels:
      version: v3

要把这些设置从示例代码中应用,可以执行以下命令。

首先,应用DestinationRule的设置。

maho:networking maho$ cd samples/bookinfo/networking/
maho:networking maho$ kubectl apply -f destination-rule-all.yaml -n bookinfo
destinationrule.networking.istio.io/productpage created
destinationrule.networking.istio.io/reviews created
destinationrule.networking.istio.io/ratings created
destinationrule.networking.istio.io/details created
maho:networking maho$ kubectl get destinationrule -n bookinfo
NAME          HOST          AGE
details       details       7s
productpage   productpage   7s
ratings       ratings       7s
reviews       reviews       7s

接下来,执行VirtualService的配置。

maho:networking maho$ kubectl apply -f virtual-service-reviews-90-10.yaml -n bookinfo
virtualservice.networking.istio.io/reviews created
maho:networking maho$ kubectl get -f virtual-service-reviews-90-10.yaml -n bookinfo
NAME      GATEWAYS   HOSTS       AGE
reviews              [reviews]   14s
maho:networking maho$ kubectl get virtualservices -n bookinfo
NAME       GATEWAYS             HOSTS       AGE
bookinfo   [bookinfo-gateway]   [*]         11h
reviews                         [reviews]   33s

你可以通过浏览器访问http://${GATEWAY_URL}/productpage,并通过目视确认。如果想要更准确地了解情况,可以使用Kiali。

以下的屏幕截图显示了从服务评论到评论-v1和评论-v2的比率。根据这些内容,可以看出三角形图标评论上设置了虚拟服务,一个百分之91.1的比率路由到v1,一个百分之8.9的比率路由到v2。为了得到这个结果,我们通过浏览器重新加载了约1分钟,以获得统计上的稳定值。

kiali-4.png

通过更改VirtualService的清单文件virtual-service-reviews-90-10.yaml,可以改变比例并将其应用于v2到v3的金丝雀发布等各种应用。

参考链接:
* 目标规则概念:https://istio.io/docs/concepts/traffic-management/#destination-rules
* 目标规则参考:https://istio.io/docs/reference/config/networking/destination-rule/
* 虚拟服务概念:https://istio.io/docs/concepts/traffic-management/#virtual-services
* 虚拟服务参考:https://istio.io/docs/reference/config/networking/virtual-service/

度量衡监控

在安装Istio时,通过添加选项–set values.grafana.enabled=true或–set profile=demo,可以安装Prometheus和Grafana,从而可以查看度量图形数据。

要访问Grafana,请使用以下命令将服务器端口转发到本机,并通过浏览器进行访问。

maho:networking maho$ kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 3000:3000 &
[1] 98492
maho:networking maho$ Forwarding from 127.0.0.1:3000 -> 3000
Forwarding from [::1]:3000 -> 3000
Handling connection for 3000
Handling connection for 3000

当你使用浏览器访问下面的URL时,将显示Grafana的网页界面:http://localhost:3000/dashboard/db/istio-mesh-dashboard。

在下一个仪表盘中,将汇总并显示整体请求量、成功响应、URL地址等错误响应(4xx系列),以及服务器端错误响应(5xx系列)等。此外,它还会报告服务和工作负载对象的名称,并提供与其配对的响应时间。

grafana-1.png

在Galley的指标显示中,显示了关于内存、CPU、磁盘、Go例程等资源消耗状况和运行时的指标信息。以下是Galley仪表板的示例。

grafana-2.png

参考链接:
安装配置文件,https://istio.io/docs/setup/additional-setup/config-profiles/
使用Grafana可视化指标,https://istio.io/docs/tasks/observability/metrics/using-istio-dashboard/

分散追踪

Jager可以追踪任何应用程序的开发语言、框架和平台。

在Kiali的图形显示中,可以根据服务和工作负载之间的响应时间来确定问题的所在。但是,在应用程序开发阶段,可能会遇到响应慢或发生错误的问题,例如在特定操作或显示特定画面时。在考虑对这种情况采取应对措施时,Kiali的监控方法不够充分。为了了解与每个请求相关的微服务的响应状况,分布式跟踪工具Jaeger是一个选项。Istio不仅支持Jaeger,还支持Zipkin、LightStep等工具,但在这里我们将着重介绍Jaeger。

要在Istio中使用分散追踪功能,只需在安装命令选项中添加–set values.tracing.enabled=true 或 –set profile=demo,即可部署。

当Istio中的Jaeger已经安装好之后,执行以下命令,你的计算机浏览器将会自动启动,并打开Jaeger的网页界面。

maho:istio-1.4.2 maho$ istioctl dashboard jaeger
http://localhost:49763

在下一个界面中,屏幕上方的图表横轴表示时间,纵轴表示响应所需的时间。然后,在下方会显示每个请求的响应时间。如果要对其中的某个请求进行详细分析,只需点击该请求,就会显示该请求的详细信息。

jaeger-1.png

在接收到来自Istio网格外部的请求并返回响应的时间段内,可以查看被层级调用的服务的名称和各自的时间。

jaeger-2.png

总结

Istio以Envoy Proxy为核心,重点提供流量控制和认证功能。在安装时,还打包了方便的工具,如整体结构的展示、指标监控、分布式追踪等。这些工具非常出色。由于有这样的工具支持,预期微服务化的门槛将进一步降低。

如果使用Istio,则按照子系统进行微服务化可能会更容易管理性能并发现故障点,对于负责应用程序开发和维护的人员来说,这可能会带来巨大的利益。

本文介绍的内容只是 Istio 中一些代表性的功能,而不是所有功能。

广告
将在 10 秒后关闭
bannerAds