介绍
服务网是一个基础设施层,允许您管理应用程序的微服务之间的通信. 随着越来越多的开发人员使用微服务,服务网已经演变,通过在分布式设置中整合共同的管理和管理任务来使这项工作更容易和更有效。
使用像 Istio这样的服务网格可以简化服务发现、路由和流量配置、加密和身份验证/授权、监控和远程测量等任务,特别是 Istio 旨在无需对现有服务代码进行重大更改。
在本教程中,您将使用 Kubernetes 的 Helm包管理器安装 Istio,然后使用 Istio 将演示应用程序 Node.js暴露在外部流量中,通过创建 Gateway 和 Virtual Service 资源。
如果您正在寻找一个管理的Kubernetes托管服务,请查看我们的简单的,用于增长的管理的Kubernetes服务(https://www.digitalocean.com/products/kubernetes)。
前提条件
要完成本教程,您将需要:
- 启用了基于角色访问控制(RBAC)的Kubernetes 1.10+集群. 此设置将使用三个节点的DigitalOcean Kubernetes集群(https://www.digitalocean.com/products/kubernetes/),但您可以自由使用另一种方法创建集群(https://andsky.com/tech/tutorials/how-to-create-a-kubernetes-1-11-cluster-using-kubeadm-on-ubuntu-18-04)。
<$>[注] 注: 我们强烈建议为此设置使用至少8GB可用内存和4vCPU的集群。
您可以閱讀更多關於安裝「kubectl」的資訊在 官方文件。
- 頭盔安裝在您的開發伺服器和 Tiller 安裝在您的群集,按照 如何安裝和使用Docker在Ubuntu 18.04 如何安裝軟體在Kubernetes群集上使用Helm Package Manager的步驟1和2所述的指示;否則,請遵循 官方文件關於在其他操作系統上安裝的信息。 https://www.docker.com/) 請確保您的非 root 使用者添加到docker`s_bedker群組,如在2K(MBR1)教程中所述。
步骤 1 - 包装应用程序
要使用我们的演示应用程序与Kubernetes,我们需要克隆代码并包装它,以便 kubelet
代理可以拉动图像。
我们的第一步是将 nodejs-image-demo respository从 DigitalOcean Community GitHub 帐户克隆出来。该库包括在 How To Build a Node.js Application with Docker中描述的设置中的代码,其中描述了如何为 Node.js 应用程序构建图像以及如何使用该图像创建容器。
要开始,将 nodejs-image-demo 存储库克隆到名为 'istio_project' 的目录中:
1git clone https://github.com/do-community/nodejs-image-demo.git istio_project
导航到istio_project
目录:
1cd istio_project
该目录包含用于提供用户关于鲨鱼的基本信息的鲨鱼信息应用程序的文件和文件夹. 除了应用程序文件,该目录还包含用应用程序代码构建 Docker 图像的指令的 Dockerfile。
要测试应用程序代码和 Dockerfile 是否按预期工作,您可以使用 docker build
命令构建和标记图像,然后使用图像运行演示容器。
用以下命令构建图像:
1docker build -t your_dockerhub_username/node-demo .
命令中的 .
表示构建背景是当前的目录. 我们已经命名图像为 node-demo
,但您可以自由地命名它为其他东西。
一旦构建过程完成,您可以将您的图像列为 docker images
:
1docker images
您将看到以下输出,确认图像构建:
1[secondary_label Output]
2REPOSITORY TAG IMAGE ID CREATED SIZE
3your_dockerhub_username/node-demo latest 37f1c2939dbf 5 seconds ago 77.6MB
4node 10-alpine 9dfa73010b19 2 days ago 75.3MB
接下来,您将使用docker run
创建一个基于此图像的容器,我们将包含三个旗帜以此命令:
-p
:此文将端口发布到容器上,并将其映射到我们的主机上的端口。我们将使用端口80
在主机上,但如果您有其他进程在该端口上运行的情况下,您可以随时随意修改该端口。 有关如何运作的更多信息,请参阅Docker 文件中的此讨论在 端口绑定。-d
:此文在背景中运行容器。
运行以下命令来构建容器:
1docker run --name node-demo -p 80:8080 -d your_dockerhub_username/node-demo
检查您的运行容器用 docker ps
:
1docker ps
您将看到确认您的应用程序容器正在运行的输出:
1[secondary_label Output]
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
349a67bafc325 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
:
1docker ps
1[secondary_label Output]
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
349a67bafc325 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
请确保将这里列出的CONTAINER ID
替换为自己的应用程序CONTAINER ID
:
1docker stop 49a67bafc325
现在您已经测试了图像,您可以将其推到 Docker Hub. 首先,请在前提条件下登录您创建的 Docker Hub 帐户:
1docker login -u your_dockerhub_username
当被提示时,请输入您的 Docker Hub 帐户密码. 以此方式登录将创建一个 ~/.docker/config.json
文件,在您的非根用户的主目录中与您的 Docker Hub 凭证。
使用 docker push
命令将应用程序图像推到 Docker Hub。 请记住用自己的 Docker Hub 用户名替换 your_dockerhub_username
:
1docker push your_dockerhub_username/node-demo
现在你有一个应用程序图像,你可以拉到运行你的应用程序与 Kubernetes 和 Istio. 接下来,你可以继续安装 Istio 与 Helm。
步骤 2 – 使用头盔安装 Istio
虽然Istio提供不同的安装方法,但文档建议使用头盔,以最大限度地管理配置选项的灵活性。
首先,添加 Istio 发布存储库:
1helm repo add istio.io https://storage.googleapis.com/istio-release/releases/1.1.7/charts/
这将使您能够使用存储库中的 Helm 图表来安装 Istio。
看看你是否有 Repo:
1helm repo list
您应该看到列出的istio.io
复制片:
1[secondary_label Output]
2NAME URL
3stable https://kubernetes-charts.storage.googleapis.com
4local http://127.0.0.1:8879/charts
5istio.io https://storage.googleapis.com/istio-release/releases/1.1.7/charts/
接下来,安装 Istio 的 自定义资源定义(CRDs)与使用 helm install
命令的 istio-init
图表:
1helm install --name istio-init --namespace istio-system istio.io/istio-init
1[secondary_label Output]
2NAME: istio-init
3LAST DEPLOYED: Fri Jun 7 17:13:32 2019
4NAMESPACE: istio-system
5STATUS: DEPLOYED
6...
该命令将 53 个 CRD 委托给 kube-apiserver
,使它们可用于 Istio 网格中。它还为 Istio 对象创建了一个 namespace称为 istio-system
,并使用 --name
选项来命名 Helm release istio-init
。
要检查所有所需 CRD 是否已完成,请运行以下命令:
1kubectl get crds | grep 'istio.io\|certmanager.k8s.io' | wc -l
这个数字应该是53
。
现在您可以安装istio
图表. 为了确保与图表一起安装 Grafana 远程测量插件,我们将使用 - set grafana.enabled=true
配置选项与我们的helm install
命令. 我们还将使用所需的 配置配置配置文件的安装协议:默认配置配置文件。 Istio 具有许多配置配置配置文件可供您在安装与 Helm 时选择,允许您定制 Istio 控制飞机和数据飞机侧车.默认配置文件建议用于生产部署,我们将使用它来熟悉我们在迁移到生产时使用的配置选项。
运行以下helm install
命令来安装图表:
1helm install --name istio --namespace istio-system --set grafana.enabled=true istio.io/istio
1[secondary_label Output]
2NAME: istio
3LAST DEPLOYED: Fri Jun 7 17:18:33 2019
4NAMESPACE: istio-system
5STATUS: DEPLOYED
6...
再次,我们将我们的Istio对象安装到istio-system
名称空间中,并命名该版本 - 在这种情况下,istio
。
我们可以验证我们预期为默认配置文件的 服务对象是用以下命令创建的:
1kubectl get svc -n istio-system
我们希望在这里看到的服务包括istio-citadel
,istio-galley
,istio-ingressgateway
,istio-pilot
,istio-policy
,istio-sidecar-injector
,istio-telemetry
和prometheus
。
1[secondary_label Output]
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3grafana ClusterIP 10.245.85.162 <none> 3000/TCP 3m26s
4istio-citadel ClusterIP 10.245.135.45 <none> 8060/TCP,15014/TCP 3m25s
5istio-galley ClusterIP 10.245.46.245 <none> 443/TCP,15014/TCP,9901/TCP 3m26s
6istio-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
7istio-pilot ClusterIP 10.245.56.97 <none> 15010/TCP,15011/TCP,8080/TCP,15014/TCP 3m26s
8istio-policy ClusterIP 10.245.206.189 <none> 9091/TCP,15004/TCP,15014/TCP 3m26s
9istio-sidecar-injector ClusterIP 10.245.223.99 <none> 443/TCP 3m25s
10istio-telemetry ClusterIP 10.245.5.215 <none> 9091/TCP,15004/TCP,15014/TCP,42422/TCP 3m26s
11prometheus ClusterIP 10.245.100.132 <none> 9090/TCP 3m26s
我们也可以用以下命令查找相应的 Istio Pods:
1kubectl get pods -n istio-system
对应这些服务的Pods应有状态
的运行
,表明Pods绑定到节点,并且与Pods相关的容器正在运行:
1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3grafana-67c69bb567-t8qrg 1/1 Running 0 4m25s
4istio-citadel-fc966574d-v5rg5 1/1 Running 0 4m25s
5istio-galley-cf776876f-5wc4x 1/1 Running 0 4m25s
6istio-ingressgateway-7f497cc68b-c5w64 1/1 Running 0 4m25s
7istio-init-crd-10-bxglc 0/1 Completed 0 9m29s
8istio-init-crd-11-dv5lz 0/1 Completed 0 9m29s
9istio-pilot-785694f946-m5wp2 2/2 Running 0 4m25s
10istio-policy-79cff99c7c-q4z5x 2/2 Running 1 4m25s
11istio-sidecar-injector-c8ddbb99c-czvwq 1/1 Running 0 4m24s
12istio-telemetry-578b6f967c-zk56d 2/2 Running 1 4m25s
13prometheus-d8d46c5b5-k5wmg 1/1 Running 0 4m25s
准备
字段表示Pod中运行了多少容器. 有关更多信息,请参阅《Pod生命周期文档》(https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/)。
<$>[注]
注:
如果您在状态
列中看到意想不到的阶段,请记住,您可以使用以下命令来解决您的Pod:
1kubectl describe pods your_pod -n pod_namespace
2kubectl logs your_pod -n pod_namespace
美元
Istio 安装的最后一步将是允许创建 Envoy代理,这些代理将作为 sidecars 部署到在网络中运行的服务中。
Sidecars 通常用于在现有容器环境中添加一个额外的功能层。Istio 的 mesh 架构依赖于使者侧面车之间的通信,这些侧面车包括网格的数据平面和控制平面的组件。
实现这一目标有两种方式: 手动 sidecar 注射和 自动 sidecar 注射.我们将通过 标签创建我们的应用程序对象的名称空间来启用自动 sidecar 注射。
我们将使用默认
名称空间创建我们的应用程序对象,因此我们将使用以下命令将istio-injection=enabled
标签应用到该名称空间:
1kubectl label namespace default istio-injection=enabled
我们可以通过运行该命令来验证该命令是否按预定工作:
1kubectl get namespace -L istio-injection
您将看到以下结果:
1[secondary_label Output]
2AME STATUS AGE ISTIO-INJECTION
3default Active 47m enabled
4istio-system Active 16m
5kube-node-lease Active 47m
6kube-public Active 47m
7kube-system Active 47m
安装和配置 Istio 后,我们可以继续创建我们的应用服务和 部署对象。
步骤三:创建应用对象
有了 Istio 网格并配置为注入 sidecar Pods,我们可以为我们的服务和部署对象创建一个应用程序 manifest具有 specifications。
我们的应用服务将确保运行我们的容器的Pods在动态环境中仍然可用,因为单个Pod被创建和摧毁,而我们的部署将描述我们的Pods的预期状态。
打开名为node-app.yaml
的文件,使用nano
或您最喜欢的编辑器:
1nano node-app.yaml
首先,添加以下代码来定义nodejs
应用服务:
1[label ~/istio_project/node-app.yaml]
2apiVersion: v1
3kind: Service
4metadata:
5 name: nodejs
6 labels:
7 app: nodejs
8spec:
9 selector:
10 app: nodejs
11 ports:
12 - name: http
13 port: 8080
本服务定义包括一个选择器
,它将与相应的应用程序:nodejs
标签匹配Pod。
我們也正在命名服務端口,符合ISTIO的 Pods and Services 要求。
接下来,在服务下方,为应用部署添加以下规格: 请确保在容器
规格下列出的图像
被您在 步骤 1中创建并推到 Docker Hub 的图像取代:
1[label ~/istio_project/node-app.yaml]
2...
3---
4apiVersion: apps/v1
5kind: Deployment
6metadata:
7 name: nodejs
8 labels:
9 version: v1
10spec:
11 replicas: 1
12 selector:
13 matchLabels:
14 app: nodejs
15 template:
16 metadata:
17 labels:
18 app: nodejs
19 version: v1
20 spec:
21 containers:
22 - name: nodejs
23 image: your_dockerhub_username/node-demo
24 ports:
25 - containerPort: 8080
此部署的规格包括复制件
的数量(在这种情况下,1)以及一个选择器
来定义部署将管理哪些Pods。
模板
字段包含执行以下操作的值:
Istio 推荐将app
标签添加到部署规格,以提供Istio的指标和远程测量情况信息。
*将版本
标签应用,以指定与此部署相符的应用程序版本。与app
标签一样,Istio建议将版本
标签添加到部署规格中,以便为Istio的指标和远程测量提供背景信息。
- 对Pod将运行的容器定义规格,包括容器的
名称
和图像
。这里的图像
是您在步骤1
(https://andsky.com/tech/tutorials/how-to-install-and-use-istio# step-1-%E2%80%94-cloning-and-packaging-the-application)中创建的图像,并推到Docker Hub。 容器规格还包括一个容器端口
配置,以指明每个
保存并关闭文件,当你完成编辑。
有了这个文件,我们可以继续编辑该文件,该文件将包含 Gateway 和虚拟服务对象的定义,这些对象可以控制流量如何进入网格,以及一旦到达网格时如何路由。
步骤 4 – 创建 Istio 对象
为了控制对集群的访问和向服务的路由,Kubernetes 使用 Ingress Resources和 Controllers。
有关使用 Ingress 资源和控制器的更多信息,请参阅 如何在 DigitalOcean Kubernetes 上使用 Cert-Manager 设置 Nginx Ingress。
Istio 使用不同的对象组合来实现相似的目的,虽然存在一些重要差异。而不是使用控制器来负载平衡流量,Istio 网格使用一个 Gateway,它作为一个负载平衡器来处理输入和输出 HTTP/TCP 连接。
例如,Kubernetes Ingress 资源和控制器为运营商提供一些路由选项,但网关和虚拟服务提供了更强大的功能集,因为它们允许流量进入网格,换句话说,Kubernetes Ingress 资源和控制器为集群运营商提供的有限的 应用层功能不包括 Istio 服务网格中的侧面卡提供的功能(包括先进的路由、跟踪和远程测量)。
为了允许外部流量进入我们的网格并配置路由到我们的Node应用程序,我们需要创建一个Istio网关和虚拟服务。
1nano node-istio.yaml
首先,添加 Gateway 对象的定义:
1[label ~/istio_project/node-isto.yaml]
2apiVersion: networking.istio.io/v1alpha3
3kind: Gateway
4metadata:
5 name: nodejs-gateway
6spec:
7 selector:
8 istio: ingressgateway
9 servers:
10 - port:
11 number: 80
12 name: http
13 protocol: HTTP
14 hosts:
15 - "*"
除了在元数据
字段中指定 Gateway 的名称
外,我们还包括了以下规格:
- 将该资源与默认的 Istio IngressGateway 控制器匹配的
选择器
,该控制器是与我们在安装 Istio 时选择的 配置配置配置文件启用的。 - 一个
服务器
规格,指定要暴露入口的端口
和 Gateway 暴露的主机
。
在Gateway定义下方,添加虚拟服务的规格:
1[label ~/istio_project/node-istio.yaml]
2...
3---
4apiVersion: networking.istio.io/v1alpha3
5kind: VirtualService
6metadata:
7 name: nodejs
8spec:
9 hosts:
10 - "*"
11 gateways:
12 - nodejs-gateway
13 http:
14 - route:
15 - destination:
16 host: nodejs
除了为此虚拟服务提供名称
外,我们还包括此资源的规格,其中包括:
在这种情况下,我们再次使用 wildcard 值(*
)以便在浏览器中快速访问应用程序,因为我们不使用域名。
- 指定目标主机的
网关
字段。在这种情况下,它会被路由到我们的nodejs-gateway
字段。 - 指示如何路由HTTP流量的
http
字段: - 指示请求将路由到哪里的
目的地
字段。在这种情况下,它会被路由到nodejs-gateway
服务,这暗示扩展到服务的完全合格域名(FQDN)在Kubernetes环境中:nodejs.default.svccluster.locter.0
一个`目的
保存并关闭文件,当你完成编辑。
有了yaml
文件,您可以创建应用程序服务和部署,以及允许访问应用程序的网关和虚拟服务对象。
步骤 5 – 创建应用资源并允许远程测量访问
一旦您创建了应用程序服务和部署对象,以及网关和虚拟服务,您将能够对应用程序生成一些请求,并在您的 Istio Grafana 仪表板中查看相关数据。
我们将允许使用 HTTP 访问(https://istio.io/docs/tasks/telemetry/gateways/# option-2-insecure-access-http),但当您在生产或敏感环境中工作时,强烈建议您允许使用 HTTPS 访问(https://istio.io/docs/tasks/telemetry/gateways/# option-1-secure-access-https)。
由于我们在 步骤 2中安装 Istio 时设置了 --set grafana.enabled=true’ 配置选项,所以我们在我们的
istio-system` 名称空间中有一个 Grafana 服务和 Pod,我们在该步骤中确认了这一点。
有了这些资源,我们的下一步将是创建一个门户和虚拟服务的宣言,以便我们可以曝光Grafana添加剂。
打开文件以获取宣言:
1nano node-grafana.yaml
将下列代码添加到文件中,以创建网关和虚拟服务,以曝光和路由流量到Grafana服务:
1[label ~/istio_project/node-grafana.yaml]
2apiVersion: networking.istio.io/v1alpha3
3kind: Gateway
4metadata:
5 name: grafana-gateway
6 namespace: istio-system
7spec:
8 selector:
9 istio: ingressgateway
10 servers:
11 - port:
12 number: 15031
13 name: http-grafana
14 protocol: HTTP
15 hosts:
16 - "*"
17---
18apiVersion: networking.istio.io/v1alpha3
19kind: VirtualService
20metadata:
21 name: grafana-vs
22 namespace: istio-system
23spec:
24 hosts:
25 - "*"
26 gateways:
27 - grafana-gateway
28 http:
29 - match:
30 - port: 15031
31 route:
32 - destination:
33 host: grafana
34 port:
35 number: 3000
我们的 Grafana 网关和虚拟服务规格类似于我们在 步骤 4中定义的应用网关和虚拟服务规格。
- Grafana 将显示在名为 http-grafana 的端口(端口是 15031)上,并且在主机上的端口是 3000。
- 网关和虚拟服务都定义在
istio-system
名空间中。 - 本虚拟服务的
主机
是istio-system
名空间中的grafana
服务。
<$>[note]
注: 由于我们当前的 MeshPolicy
配置为在 允许模式中运行 TLS,我们不需要将 目的地规则应用到我们的宣言中。如果您在您的 Istio 安装中选择了不同的配置文件,那么您需要添加一个目的地规则来禁用相互 TLS,当允许使用 HTTP 访问 Grafana 时。
保存并关闭文件,当你完成编辑。
使用以下命令创建您的 Grafana 资源:
1kubectl apply -f node-grafana.yaml
kubectl apply
命令允许您在创建或更新过程中将特定配置应用到对象中.在我们的情况下,我们正在将我们在 node-grafana.yaml
文件中指定的配置应用到我们的网关和虚拟服务对象中。
您可以用以下命令查看istio-system
名称空间中的 Gateway:
1kubectl get gateway -n istio-system
您将看到以下结果:
1[secondary_label Output]
2NAME AGE
3grafana-gateway 47s
您可以为虚拟服务做同样的事情:
1kubectl get virtualservice -n istio-system
1[secondary_label Output]
2NAME GATEWAYS HOSTS AGE
3grafana-vs [grafana-gateway] [*] 74s
但是,在我们这样做之前,让我们创建我们的应用程序服务和部署,以及我们的应用程序网关和虚拟服务,并检查我们可以在浏览器中访问我们的应用程序。
使用以下命令创建应用程序服务和部署:
1kubectl apply -f node-app.yaml
等待几秒钟,然后用以下命令检查应用程序Pods:
1kubectl get pods
1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3nodejs-7759fb549f-kmb7x 2/2 Running 0 40s
您的应用程序容器正在运行,正如您可以在状态
列中看到的那样,但为什么准备
列表列表2/2
,如果应用程序从 步骤 3中表现出来,只有指定 1 个副本?
这个第二个容器是Envoy sidecar,您可以使用以下命令检查它. 请确保用您自己的nodejs
Pod的NAME
代替这里列出的pod:
1kubectl describe pod nodejs-7759fb549f-kmb7x
1[secondary_label Output]
2Name: nodejs-7759fb549f-kmb7x
3Namespace: default
4...
5Containers:
6 nodejs:
7 ...
8 istio-proxy:
9 Container ID: docker://f840d5a576536164d80911c46f6de41d5bc5af5152890c3aed429a1ee29af10b
10 Image: docker.io/istio/proxyv2:1.1.7
11 Image ID: docker-pullable://istio/proxyv2@sha256:e6f039115c7d5ef9c8f6b049866fbf9b6f5e2255d3a733bb8756b36927749822
12 Port: 15090/TCP
13 Host Port: 0/TCP
14 Args:
15 ...
接下来,创建您的应用程序网关和虚拟服务:
1kubectl apply -f node-istio.yaml
您可以通过以下命令检查 Gateway:
1kubectl get gateway
1[secondary_label Output]
2NAME AGE
3nodejs-gateway 7s
虚拟服务:
1kubectl get virtualservice
1[secondary_label Output]
2NAME GATEWAYS HOSTS AGE
3nodejs [nodejs-gateway] [*] 28s
要做到这一点,我们需要与我们的istio-ingressgateway
服务相关的外部IP,这是一个LoadBalancer Service
类型(https://kubernetes.io/docs/concepts/services-networking/service/# loadbalancer)。
使用以下命令获取istio-ingressgateway
服务的外部 IP:
1kubectl get svc -n istio-system
你会看到这样的输出:
1[secondary_label Output]
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3grafana ClusterIP 10.245.85.162 <none> 3000/TCP 42m
4istio-citadel ClusterIP 10.245.135.45 <none> 8060/TCP,15014/TCP 42m
5istio-galley ClusterIP 10.245.46.245 <none> 443/TCP,15014/TCP,9901/TCP 42m
6istio-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
7istio-pilot ClusterIP 10.245.56.97 <none> 15010/TCP,15011/TCP,8080/TCP,15014/TCP 42m
8istio-policy ClusterIP 10.245.206.189 <none> 9091/TCP,15004/TCP,15014/TCP 42m
9istio-sidecar-injector ClusterIP 10.245.223.99 <none> 443/TCP 42m
10istio-telemetry ClusterIP 10.245.5.215 <none> 9091/TCP,15004/TCP,15014/TCP,42422/TCP 42m
11prometheus 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
。
您将看到以下登陆页面:
点击页面顶部的 主页 将带您到一个具有 ** istio** 文件夹的页面. 要查看下载选项的列表,请点击 ** istio** 文件夹图标:
从此选项列表中,单击 Istio 服务仪表板 。
这将带你到一个定位页面,另一个下载菜单:
从可用的选项列表中选择nodejs.default.svc.cluster.local
。
您现在可以查看该服务的流量数据:
您现在有一个运行的 Node.js 应用程序在 Istio 服务网格中运行,Grafana 已启用并配置为外部访问。
结论
在本教程中,您使用 Helm 包管理器安装了 Istio,并使用它来暴露使用 Gateway 和虚拟服务对象的 Node.js 应用服务,您还配置了 Gateway 和虚拟服务对象以暴露 Grafana 远程测量插件,以查看您的应用程序的流量数据。
随着生产的转变,您将想要采取步骤,例如 使用 HTTPS 保护您的应用程序网关并确保访问您的 Grafana 服务也是 安全 。
您还可以探索其他与远程测量相关的任务(https://istio.io/docs/tasks/telemetry/),包括 收集和处理指标, 日志和 跟踪范围。