如何使用Kubernetes安装和使用Istio

服务网格是一个基础结构层,允许您管理应用程序的微服务之间的通信。在本教程中,您将使用Kubernetes的Helm包管理器安装Istio。然后,您将使用Istio通过创建网关和虚拟服务来公开Node.js应用程序。然后,您将访问Grafana遥测插件以显示交通数据。

介绍

服务网格是一个基础结构层,允许您管理应用程序的微服务之间的通信。 随着越来越多的开发人员使用微服务,服务网格已经发展到通过在分布式设置中整合通用管理和管理任务,使工作更轻松,更有效。

使用像Istio这样的服务网络可以简化服务发现,路由和流量配置,加密和身份验证/授权以及监控和遥测等任务。 特别是,Istio旨在在不对现有服务代码进行重大更改的情况下工作。 例如,在使用Kubernetes时 ,可以通过构建与现有应用程序资源一起使用的特定于Istio的对象,为服务器中运行的应用程序添加服务网格功能。

在本教程中,您将使用Kubernetes的Helm包管理器安装Istio。 然后,您将使用Istio通过创建网关虚拟服务资源将演示Node.js应用程序公开给外部流量。 最后,您将访问Grafana遥测插件以可视化您的应用程序流量数据。

先决条件

要完成本教程,您需要:

注意:我们强烈建议使用具有至少8GB可用内存和4vCPU的群集进行此设置。 本教程将使用DigitalOcean的三个标准4GB / 2vCPU Droplet作为节点。

第1步 - 打包应用程序

要将我们的演示应用程序与Kubernetes一起使用,我们需要克隆代码并打包它,以便kubelet代理可以提取图像。

我们的第一步是从DigitalOcean社区GitHub帐户克隆nodejs-image-demo存储库 此存储库包含如何使用Docker构建Node.js应用程序中描述的设置中的代码,该代码描述了如何为Node.js应用程序构建映像以及如何使用此映像创建容器。 您可以在从容器到带有Node.js的Kubernetes系列中找到有关应用程序本身的更多信息。

首先,将nodejs-image-demo存储istio_project到名为istio_project的目录中:

git clone https://github.com/do-community/nodejs-image-demo.git istio_project

导航到istio_project目录:

cd istio_project

此目录包含shark信息应用程序的文件和文件夹,该应用程序为用户提供有关鲨鱼的基本信息。 除了应用程序文件之外,该目录还包含一个Dockerfile,其中包含使用应用程序代码构建Docker镜像的说明。 有关Dockerfile中的说明的更多信息,请参阅如何使用Docker构建Node.js应用程序的第3步

要测试应用程序代码和Dockerfile是否按预期工作,可以使用docker build命令构建和标记映像,然后使用该映像运行演示容器。 -t标志与docker build将允许您使用Docker Hub用户名标记映像,以便在测试后将其推送到Docker Hub。

使用以下命令构建映像:

docker build -t your_dockerhub_username/node-demo .

. 在命令中指定构建上下文是当前目录。 我们已将图像命名为node-demo ,但您可以自由命名。

构建过程完成后,您可以使用docker images列出docker images

docker images

您将看到以下输出确认图像构建:

REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
your_dockerhub_username/node-demo   latest              37f1c2939dbf        5 seconds ago       77.6MB
node                                10-alpine           9dfa73010b19        2 days ago          75.3MB

接下来,您将使用docker run基于此图像创建容器。 我们将使用此命令包含三个标志:

  • -p :这将在容器上发布端口并将其映射到主机上的端口。 我们将在主机上使用端口80 ,但如果您在该端口上运行另一个进程,则可以根据需要随意修改它。 有关其工作原理的更多信息,请参阅有关端口绑定的Docker文档中的此讨论。
  • -d :这在后台运行容器。
  • --name :这允许我们为容器提供自定义名称。

运行以下命令来构建容器:

docker run --name node-demo -p 80:8080 -d your_dockerhub_username/node-demo

使用docker ps检查正在运行的容器:

docker ps

您将看到确认您的应用程序容器正在运行的输出:

CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS              PORTS                  NAMES
49a67bafc325        your_dockerhub_username/node-demo   "docker-entrypoint.s…"   8 seconds ago       Up 6 seconds        0.0.0.0:80->8080/tcp   node-demo

您现在可以访问您的服务器IP来测试您的设置: http:// your_server_ip 您的应用程序将显示以下登录页面:

申请登陆页面

现在您已经测试了应用程序,您可以停止正在运行的容器。 再次使用docker ps获取您的CONTAINER ID

docker ps
CONTAINER ID        IMAGE                               COMMAND                  CREATED              STATUS              PORTS                  NAMES
49a67bafc325        your_dockerhub_username/node-demo   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:80->8080/tcp   node-demo

docker stop停止容器。 请务必使用您自己的应用程序CONTAINER ID替换此处列出的CONTAINER ID

docker stop 49a67bafc325

现在您已经测试了图像,可以将其推送到Docker Hub。 首先,登录您在先决条件中创建的Docker Hub帐户:

docker login -u your_dockerhub_username 

出现提示时,输入您的Docker Hub帐户密码。 以这种方式登录将使用您的Docker Hub凭据在非root用户的主目录中创建~/.docker/config.json文件。

使用docker push命令将应用程序映像推送到Docker Hub。 请记住将your_dockerhub_username替换为您自己的Docker Hub用户名:

docker push your_dockerhub_username/node-demo

您现在有一个应用程序映像,您可以使用Kubernetes和Istio来运行您的应用程序。 接下来,您可以继续安装带有Helm的Istio。

第2步 - 使用Helm安装Istio

尽管Istio提供了不同的安装方法,但文档建议使用Helm来最大限度地提高管理配置选项的灵活性。 我们将安装Istio with Helm并确保启用Grafana插件,以便我们可以显示应用程序的流量数据。

首先,添加Istio发布存储库:

helm repo add istio.io https://storage.googleapis.com/istio-release/releases/1.1.7/charts/

这将使您能够使用存储库中的Helm图表来安装Istio。

检查您是否有回购:

helm repo list

您应该看到列出的istio.io repo:

NAME            URL                                                                
stable          https://kubernetes-charts.storage.googleapis.com                   
local           http://127.0.0.1:8879/charts                                       
istio.io        https://storage.googleapis.com/istio-release/releases/1.1.7/charts/

接下来,使用helm install命令使用istio-init图表安装Istio的自定义资源定义 (CRD):

helm install --name istio-init --namespace istio-system istio.io/istio-init
NAME:   istio-init
LAST DEPLOYED: Fri Jun  7 17:13:32 2019
NAMESPACE: istio-system
STATUS: DEPLOYED
...

此命令将53个CRD提交给kube-apiserver ,使它们可用于Istio网格。 它还为名为istio-system的Istio对象创建名称空间 ,并使用--name选项命名Helm 发行版 istio-init Helm中的版本是指启用了特定配置选项的图表的特定部署。

要检查是否已提交所有必需的CRD,请运行以下命令:

kubectl get crds | grep 'istio.io\|certmanager.k8s.io' | wc -l

这应输出数字53

您现在可以安装istio图表。 为了确保Grafana遥测插件与图表一起安装,我们将使用--set grafana.enabled=true配置选项和我们的helm install命令。 我们还将使用安装协议来获取所需的配置文件 :默认配置文件。 当使用Helm进行安装时,Istio有许多配置文件可供选择,允许您自定义Istio 控制平面和数据平面边车 建议将默认配置文件用于生产部署,我们将使用它来熟悉我们在迁移到生产时使用的配置选项。

运行以下helm install命令安装图表:

helm install --name istio --namespace istio-system --set grafana.enabled=true istio.io/istio
NAME:   istio
LAST DEPLOYED: Fri Jun  7 17:18:33 2019
NAMESPACE: istio-system
STATUS: DEPLOYED
...

同样,我们将Istio对象安装到istio-system命名空间并命名发布 - 在本例中为istio

我们可以使用以下命令验证是否已使用默认配置文件创建了我们期望的服务对象

kubectl get svc -n istio-system

我们期望在这里看到的服务包括istio-citadelistio-galleyistio-ingressgatewayistio-pilotistio-policyistio-sidecar-injectoristio-telemetryprometheus 我们也希望看到grafana服务,因为我们在安装期间启用了这个插件:

NAME                     TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                                                                                      AGE
grafana                  ClusterIP      10.245.85.162    <none>            3000/TCP                                                                                                                                     3m26s
istio-citadel            ClusterIP      10.245.135.45    <none>            8060/TCP,15014/TCP                                                                                                                           3m25s
istio-galley             ClusterIP      10.245.46.245    <none>            443/TCP,15014/TCP,9901/TCP                                                                                                                   3m26s
istio-ingressgateway     LoadBalancer   10.245.171.39    174.138.125.110   15020:30707/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30285/TCP,15030:31668/TCP,15031:32297/TCP,15032:30853/TCP,15443:30406/TCP   3m26s
istio-pilot              ClusterIP      10.245.56.97     <none>            15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                                       3m26s
istio-policy             ClusterIP      10.245.206.189   <none>            9091/TCP,15004/TCP,15014/TCP                                                                                                                 3m26s
istio-sidecar-injector   ClusterIP      10.245.223.99    <none>            443/TCP                                                                                                                                      3m25s
istio-telemetry          ClusterIP      10.245.5.215     <none>            9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                                       3m26s
prometheus               ClusterIP      10.245.100.132   <none>            9090/TCP                                                                                                                                     3m26s

我们还可以使用以下命令检查相应的Istio Pods

kubectl get pods -n istio-system

与这些服务对应的Pod应具有“ Running STATUS ,表示Pod已绑定到节点,并且与Pod关联的容器正在运行:

NAME                                     READY   STATUS      RESTARTS   AGE
grafana-67c69bb567-t8qrg                 1/1     Running     0          4m25s
istio-citadel-fc966574d-v5rg5            1/1     Running     0          4m25s
istio-galley-cf776876f-5wc4x             1/1     Running     0          4m25s
istio-ingressgateway-7f497cc68b-c5w64    1/1     Running     0          4m25s
istio-init-crd-10-bxglc                  0/1     Completed   0          9m29s
istio-init-crd-11-dv5lz                  0/1     Completed   0          9m29s
istio-pilot-785694f946-m5wp2             2/2     Running     0          4m25s
istio-policy-79cff99c7c-q4z5x            2/2     Running     1          4m25s
istio-sidecar-injector-c8ddbb99c-czvwq   1/1     Running     0          4m24s
istio-telemetry-578b6f967c-zk56d         2/2     Running     1          4m25s
prometheus-d8d46c5b5-k5wmg               1/1     Running     0          4m25s

READY字段指示Pod中正在运行的容器数量。 有关更多信息,请参阅Pod生命周期文档

注意: 如果您在STATUS列中看到意外的阶段,请记住您可以使用以下命令对Pod进行故障排除:

kubectl describe pods your_pod -n pod_namespace
kubectl logs your_pod -n pod_namespace

Istio安装的最后一步是启用Envoy代理的创建,这些代理将作为sidecars部署到网格中运行的服务。

Sidecars通常用于在现有容器环境中添加额外的功能层。 Istio的网状结构依赖于包含网格数据平面的Envoy侧车与控制平面组件之间的通信。 为了使网格工作,我们需要确保网格中的每个Pod也将运行Envoy边车。

有两种方法可以实现这一目标: 手动侧车注射自动侧车注射 我们将通过标记名称空间来启用自动边车注入,我们将使用标签istio-injection=enabled来创建应用程序对象。 这将确保kube-apiserver控制器可以拦截对kube-apiserver请求并执行特定操作 - 在这种情况下,确保我们的所有应用程序kube-apiserver都以sidecar开头。

我们将使用default命名空间来创建我们的应用程序对象,因此我们将使用以下命令将istio-injection=enabled标签应用于该命名空间:

kubectl label namespace default istio-injection=enabled

我们可以通过运行来验证命令是否按预期工作:

kubectl get namespace -L istio-injection

您将看到以下输出:

AME              STATUS   AGE   ISTIO-INJECTION
default           Active   47m   enabled
istio-system      Active   16m   
kube-node-lease   Active   47m   
kube-public       Active   47m   
kube-system       Active   47m   

通过安装和配置Istio,我们可以继续创建应用程序服务和部署对象。

第3步 - 创建应用程序对象

使用Istio网格并配置为注入sidecar Pod,我们可以创建一个包含Service和Deployment对象规范的应用程序清单 Kubernetes清单中的规范描述了每个对象的所需状态。

我们的应用程序服务将确保运行我们的容器的Pod在动态环境中仍然可访问,因为创建和销毁了各个Pod,而我们的部署将描述我们的Pod的所需状态。

使用nano或您喜欢的编辑器打开名为node-app.yaml的文件:

nano node-app.yaml

首先,添加以下代码以定义nodejs应用程序服务:

〜/ istio_project /节点的app.yaml
apiVersion: v1
kind: Service
metadata:
  name: nodejs
  labels: 
    app: nodejs
spec:
  selector:
    app: nodejs
  ports:
  - name: http
    port: 8080 

此服务定义包括一个selector ,该selector将Pods与相应的app: nodejs标签匹配。 我们还指定服务将在任何具有匹配标签的Pod上定位端口8080

我们还根据Istio对Pod 和服务要求命名服务端口。 http值是Istio将为name字段接受的值之一。

接下来,在服务下方,为应用程序部署添加以下规范。 请务必使用您创建的映像替换containers规范下列出的映像,并将其推送到第1步中的 Docker Hub:

〜/ istio_project /节点的app.yaml
...
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs
  labels:
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nodejs
  template:
    metadata:
      labels:
        app: nodejs
        version: v1
    spec:
      containers:
      - name: nodejs
        image: your_dockerhub_username/node-demo
        ports:
        - containerPort: 8080

此部署的规范包括replicas数(在本例中为1),以及定义部署将管理哪些Pod的selector 在这种情况下,它将使用app: nodejs标签管理app: nodejs

template字段包含执行以下操作的值:

  • app: nodejs标签应用于部署管理的app: nodejs Istio 建议app标签添加到部署规范中,以便为Istio的指标和遥测提供上下文信息。
  • 应用version标签以指定与此部署对应的应用程序的版本。 app标签一样,Istio建议包含version标签以提供上下文信息。
  • 定义Pod将运行的容器的规范,包括容器nameimage 此处的图像是您在第1步中创建并推送到Docker Hub的图像。 容器规范还包括一个containerPort配置,指向每个容器将监听的端口。 如果端口在这里保持不公开状态,它们将绕过Istio代理。 请注意,此端口8080对应于服务定义中指定的目标端口。

完成编辑后保存并关闭文件。

有了这个文件,我们就可以继续编辑包含Gateway和Virtual Service对象定义的文件,这些对象控制流量进入网格的方式以及在那里进行路由的方式。

第4步 - 创建Istio对象

为了控制对集群的访问并路由到服务,Kubernetes使用Ingress 资源控制器 Ingress Resources定义HTTP和HTTPS路由到集群服务的规则,而控制器负载平衡传入流量并将其路由到正确的服务。

有关使用Ingress资源和控制器的更多信息,请参阅如何在DigitalOcean Kubernetes上使用Cert-Manager设置Nginx Ingress

尽管存在一些重要的差异,但Istio使用不同的对象集来实现类似的目的。 Istio网状网不使用Controller来对流量进行负载平衡,而是使用网关 ,该网关用作处理传入和传出HTTP / TCP连接的负载平衡器。 然后,网关允许监控和路由规则应用于进入网格的流量。 具体而言,确定流量路由的配置被定义为虚拟服务。 每个虚拟服务都包含与特定协议和目标的条件匹配的路由规则。

虽然Kubernetes Ingress资源/控制器和Istio网关/虚拟服务具有一些功能相似性,但网格的结构引入了重要的差异。 例如,Kubernetes Ingress资源和控制器为运营商提供了一些路由选项,但网关和虚拟服务可以提供更强大的功能集,因为它们可以使流量进入网状网。 换句话说,Kubernetes Ingress控制器和资源为集群运营商提供的有限应用层功能不包括由Istio服务网格中的边车提供的功能 - 包括高级路由,跟踪和遥测。

为了允许外部流量进入我们的网状网并配置路由到我们的Node应用程序,我们需要创建一个Istio网关和虚拟服务。 为清单打开名为node-istio.yaml的文件:

nano node-istio.yaml

首先,添加Gateway对象的定义:

〜/ istio_project /节点isto.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: nodejs-gateway
spec:
  selector:
    istio: ingressgateway 
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

除了在metadata字段中指定网关的name ,我们还包括以下规范:

  • 一个selector ,它将此资源与使用我们在安装Istio时选择的配置文件启用的默认Istio IngressGateway控制器匹配。
  • servers规范,指定要为入口公开的端口以及网关公开的hosts 在这种情况下,我们使用星号( * )指定所有hosts ,因为我们不使用特定的安全域。

在网关定义下方,添加虚拟服务的规范:

〜/ istio_project /节点istio.yaml
...
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nodejs
spec:
  hosts:
  - "*"
  gateways:
  - nodejs-gateway
  http:
  - route:
    - destination:
        host: nodejs

除了为此虚拟服务提供name ,我们还包括此资源的规范,其中包括:

  • hosts字段,用于指定目标主机。 在这种情况下,我们再次使用通配符值( * )来启用对浏览器中应用程序的快速访问,因为我们不使用域。
  • 一个gateways字段,指定允许外部请求的网关。 在这种情况下,它是我们的nodejs-gateway网关。
  • http字段,指定HTTP流量的路由方式。
  • destination字段,指示请求将路由到的位置。 在这种情况下,它将路由到nodejs服务,该服务隐式扩展到Kubernetes环境中的服务的完全限定域名(FQDN): nodejs.default.svc.cluster.local 但需要注意的是,FQDN将基于定义规则的命名空间而不是服务,因此当应用程序服务和虚拟服务位于不同的命名空间时,请务必使用此字段中的FQDN。 要更全面地了解Kubernetes域名系统(DNS),请参阅Kubernetes DNS服务简介

完成编辑后保存并关闭文件。

使用yaml文件,您可以创建应用程序服务和部署,以及将允许访问您的应用程序的网关和虚拟服务对象。

第5步 - 创建应用程序资源并启用遥测访问

创建应用程序服务和部署对象以及网关和虚拟服务后,您将能够为应用程序生成一些请求,并查看Istio Grafana仪表板中的相关数据。 但是,首先,您需要配置Istio以显示Grafana插件,以便您可以在浏览器中访问仪表板。

我们将使用HTTP启用Grafana访问 ,但是当您在生产环境或敏感环境中工作时,强烈建议您使用HTTPS启用访问

因为我们在第2步中安装了Istio时设置了--set grafana.enabled=true配置选项,所以我们在istio-system命名空间中有一个Grafana Service和Pod,我们在该步骤中确认了这一点。

有了这些资源,我们的下一步将是为网关和虚拟服务创建一个清单,以便我们可以公开Grafana插件。

打开清单的文件:

nano node-grafana.yaml

将以下代码添加到文件中以创建网关和虚拟服务,以向Grafana服务公开和路由流量:

〜/ istio_project /节点grafana.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: grafana-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 15031
      name: http-grafana
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: grafana-vs
  namespace: istio-system
spec:
  hosts:
  - "*"
  gateways:
  - grafana-gateway
  http:
  - match:
    - port: 15031
    route:
    - destination:
        host: grafana
        port:
          number: 3000

我们的Grafana网关和虚拟服务规范与我们在第4步中为应用程序网关和虚拟服务定义的规范类似。 然而,有一些不同之处:

  • Grafana将在http-grafana命名端口(端口15031 )上公开,它将在主机上的端口3000上运行。
  • 网关和虚拟服务都在istio-system命名空间中定义。
  • 此虚拟服务中的hostistio-system命名空间中的grafana服务。 由于我们在运行Grafana服务的同一命名空间中定义此规则,因此FQDN扩展将再次起作用而不会发生冲突。

注意:由于我们当前的MeshPolicy配置为以许可模式运行TLS,因此我们不需要将目标规则应用于清单。 如果您在Istio安装中选择了不同的配置文件,则在启用使用HTTP访问Grafana时,您需要添加目标规则以禁用相互TLS。 有关如何执行此操作的详细信息,请参阅官方Istio文档 ,了解如何使用HTTP访问遥测插件。

完成编辑后保存并关闭文件。

使用以下命令创建Grafana资源:

kubectl apply -f node-grafana.yaml

kubectl apply命令允许您在创建或更新对象的过程中将特定配置应用于对象。 在我们的示例中,我们将在node-grafana.yaml文件中指定的配置应用于创建它们的Gateway和Virtual Service对象。

您可以使用以下命令查看istio-system命名空间中的Gateway:

kubectl get gateway -n istio-system

您将看到以下输出:

NAME              AGE
grafana-gateway   47s

您可以为虚拟服务执行相同的操作:

kubectl get virtualservice -n istio-system
NAME         GATEWAYS            HOSTS   AGE
grafana-vs   [grafana-gateway]   [*]     74s

创建这些资源后,我们应该能够在浏览器中访问我们的Grafana仪表板。 然而,在我们这样做之前,让我们创建我们的应用程序服务和部署,以及我们的应用程序网关和虚拟服务,并检查我们是否可以在浏览器中访问我们的应用程序。

使用以下命令创建应用程序服务和部署:

kubectl apply -f node-app.yaml

等待几秒钟,然后使用以下命令检查应用程序Pod:

kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
nodejs-7759fb549f-kmb7x   2/2     Running   0          40s

正如您在STATUS列中看到的那样,您的应用程序容器正在运行,但是如果第3步中的应用程序清单仅指定了1个副本,为什么READY列列表2/2

第二个容器是Envoy边车,您可以使用以下命令检查。 请务必使用您自己的nodejs Pod的NAME替换此处列出的pod:

kubectl describe pod nodejs-7759fb549f-kmb7x
Name:               nodejs-7759fb549f-kmb7x
Namespace:          default
...
Containers:
  nodejs:
  ...
  istio-proxy:
    Container ID:  docker://f840d5a576536164d80911c46f6de41d5bc5af5152890c3aed429a1ee29af10b
    Image:         docker.io/istio/proxyv2:1.1.7
    Image ID:      docker-pullable://istio/proxyv2@sha256:e6f039115c7d5ef9c8f6b049866fbf9b6f5e2255d3a733bb8756b36927749822 
    Port:          15090/TCP
    Host Port:     0/TCP
    Args:
    ...

接下来,创建应用程序网关和虚拟服务:

kubectl apply -f node-istio.yaml

您可以使用以下命令检查网关:

kubectl get gateway
NAME             AGE
nodejs-gateway   7s

和虚拟服务:

kubectl get virtualservice
NAME     GATEWAYS           HOSTS   AGE
nodejs   [nodejs-gateway]   [*]     28s

我们现在准备测试对应用程序的访问。 为此,我们需要与istio-ingressgateway服务相关联的外部IP,这是一种LoadBalancer服务类型

使用以下命令获取istio-ingressgateway服务的外部IP:

kubectl get svc -n istio-system

您将看到如下输出:

NAME                     TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                                                                                      AGE
grafana                  ClusterIP      10.245.85.162    <none>            3000/TCP                                                                                                                                     42m
istio-citadel            ClusterIP      10.245.135.45    <none>            8060/TCP,15014/TCP                                                                                                                           42m
istio-galley             ClusterIP      10.245.46.245    <none>            443/TCP,15014/TCP,9901/TCP                                                                                                                   42m
istio-ingressgateway     LoadBalancer   10.245.171.39    ingressgateway_ip 15020:30707/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30285/TCP,15030:31668/TCP,15031:32297/TCP,15032:30853/TCP,15443:30406/TCP   42m
istio-pilot              ClusterIP      10.245.56.97     <none>            15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                                       42m
istio-policy             ClusterIP      10.245.206.189   <none>            9091/TCP,15004/TCP,15014/TCP                                                                                                                 42m
istio-sidecar-injector   ClusterIP      10.245.223.99    <none>            443/TCP                                                                                                                                      42m
istio-telemetry          ClusterIP      10.245.5.215     <none>            9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                                       42m
prometheus               ClusterIP      10.245.100.132   <none>            9090/TCP                                                                                                                                     42m

istio-ingressgateway应该是唯一具有TYPE LoadBalancer的服务,并且是唯一具有外部IP的服务。

在浏览器中导航到此外部IP: http:// ingressgateway_ip

您应该会看到以下目标网页:

申请登陆页面

接下来,通过单击刷新五到六次来为站点生成一些负载。

您现在可以查看Grafana仪表板以查看流量​​数据。

在浏览器中,再次使用istio-ingressgateway外部IP和Grafana Gateway清单中定义的端口导航到以下地址: http:// ingressgateway_ip:15031

您将看到以下登录页面:

Grafana Home Dash

单击页面顶部的主页将转到带有istio文件夹的页面。 要获取下拉选项列表,请单击istio文件夹图标:

Istio Dash选项下拉菜单

从此选项列表中,单击Istio Service Dashboard

这将带您进入另一个下拉菜单的登录页面:

Istio Service Dash中的服务下拉列表

从可用选项列表中选择nodejs.default.svc.cluster.local

您现在可以查看该服务的流量数据:

Nodejs服务短划线

现在,您已经在Istio服务网格中运行了一个正在运行的Node.js应用程序,其中启用了Grafana并配置了外部访问。

结论

在本教程中,您使用Helm软件包管理器安装了Istio,并使用它来使用网关和虚拟服务对象公开Node.js应用程序服务。 您还配置了网关和虚拟服务对象以公开Grafana遥测插件,以查看应用程序的流量数据。

当您转向生产时,您需要采取措施,例如使用HTTPS保护您的应用程序网关,并确保对Grafana服务的访问也是安全的

您还可以探索其他与遥测相关的任务 ,包括收集和处理指标日志跟踪跨度