介绍
服务网格是一个基础结构层,允许您管理应用程序的微服务之间的通信。 随着越来越多的开发人员使用微服务,服务网格已经发展到通过在分布式设置中整合通用管理和管理任务,使工作更轻松,更有效。
使用像Istio这样的服务网络可以简化服务发现,路由和流量配置,加密和身份验证/授权以及监控和遥测等任务。 特别是,Istio旨在在不对现有服务代码进行重大更改的情况下工作。 例如,在使用Kubernetes时 ,可以通过构建与现有应用程序资源一起使用的特定于Istio的对象,为服务器中运行的应用程序添加服务网格功能。
在本教程中,您将使用Kubernetes的Helm包管理器安装Istio。 然后,您将使用Istio通过创建网关和虚拟服务资源将演示Node.js应用程序公开给外部流量。 最后,您将访问Grafana遥测插件以可视化您的应用程序流量数据。
先决条件
要完成本教程,您需要:
- 启用了基于角色的访问控制(RBAC)的Kubernetes 1.10+集群。 此设置将使用具有三个节点的DigitalOcean Kubernetes群集 ,但您可以使用其他方法自由创建群集 。
注意:我们强烈建议使用具有至少8GB可用内存和4vCPU的群集进行此设置。 本教程将使用DigitalOcean的三个标准4GB / 2vCPU Droplet作为节点。
-
kubectl
命令行工具安装在开发服务器上,并配置为连接到您的群集。 您可以在官方文档中阅读有关安装kubectl
更多信息。 - 按照如何使用Helm软件包管理器在Kubernetes集群上安装软件的第1步和2中概述的说明,在您的集群上安装Helm安装在您的开发服务器和Tiller上。
- Docker安装在您的开发服务器上。 如果您正在使用Ubuntu 18.04,请按照如何在Ubuntu 18.04上安装和使用Docker的第1步和2进行操作; 否则,请按照官方文档获取有关在其他操作系统上安装的信息。 请确保将非root用户添加到
docker
组,如链接教程的第2步中所述。 - Docker Hub帐户。 有关如何进行此设置的概述,请参阅Docker Hub的介绍 。
第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 SIZEyour_dockerhub_username/node-demo latest 37f1c2939dbf 5 seconds ago 77.6MBnode 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 NAMES49a67bafc325 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 NAMES49a67bafc325 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-initLAST DEPLOYED: Fri Jun 7 17:13:32 2019NAMESPACE: istio-systemSTATUS: 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: istioLAST DEPLOYED: Fri Jun 7 17:18:33 2019NAMESPACE: istio-systemSTATUS: DEPLOYED...
同样,我们将Istio对象安装到istio-system
命名空间并命名发布 – 在本例中为istio
。
我们可以使用以下命令验证是否已使用默认配置文件创建了我们期望的服务对象 :
kubectl get svc -n istio-system
我们期望在这里看到的服务包括istio-citadel
, istio-galley
, istio-ingressgateway
, istio-pilot
, istio-policy
, istio-sidecar-injector
, istio-telemetry
和prometheus
。 我们也希望看到grafana
服务,因为我们在安装期间启用了这个插件:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEgrafana ClusterIP 10.245.85.162 <none> 3000/TCP 3m26sistio-citadel ClusterIP 10.245.135.45 <none> 8060/TCP,15014/TCP 3m25sistio-galley ClusterIP 10.245.46.245 <none> 443/TCP,15014/TCP,9901/TCP 3m26sistio-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 3m26sistio-pilot ClusterIP 10.245.56.97 <none> 15010/TCP,15011/TCP,8080/TCP,15014/TCP 3m26sistio-policy ClusterIP 10.245.206.189 <none> 9091/TCP,15004/TCP,15014/TCP 3m26sistio-sidecar-injector ClusterIP 10.245.223.99 <none> 443/TCP 3m25sistio-telemetry ClusterIP 10.245.5.215 <none> 9091/TCP,15004/TCP,15014/TCP,42422/TCP 3m26sprometheus 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 AGEgrafana-67c69bb567-t8qrg 1/1 Running 0 4m25sistio-citadel-fc966574d-v5rg5 1/1 Running 0 4m25sistio-galley-cf776876f-5wc4x 1/1 Running 0 4m25sistio-ingressgateway-7f497cc68b-c5w64 1/1 Running 0 4m25sistio-init-crd-10-bxglc 0/1 Completed 0 9m29sistio-init-crd-11-dv5lz 0/1 Completed 0 9m29sistio-pilot-785694f946-m5wp2 2/2 Running 0 4m25sistio-policy-79cff99c7c-q4z5x 2/2 Running 1 4m25sistio-sidecar-injector-c8ddbb99c-czvwq 1/1 Running 0 4m24sistio-telemetry-578b6f967c-zk56d 2/2 Running 1 4m25sprometheus-d8d46c5b5-k5wmg 1/1 Running 0 4m25s
READY
字段指示Pod中正在运行的容器数量。 有关更多信息,请参阅Pod生命周期的文档 。
注意: 如果您在STATUS
列中看到意外的阶段,请记住您可以使用以下命令对Pod进行故障排除:
kubectl describe pods your_pod -n pod_namespacekubectl 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-INJECTIONdefault Active 47m enabledistio-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
应用程序服务:
apiVersion: v1kind: Servicemetadata: name: nodejs labels: app: nodejsspec: selector: app: nodejs ports: - name: http port: 8080
此服务定义包括一个selector
,该selector
将Pods与相应的app: nodejs
标签匹配。 我们还指定服务将在任何具有匹配标签的Pod上定位端口8080
。
我们还根据Istio对Pod 和服务的要求命名服务端口。 http
值是Istio将为name
字段接受的值之一。
接下来,在服务下方,为应用程序部署添加以下规范。 请务必使用您创建的映像替换containers
规范下列出的映像,并将其推送到第1步中的 Docker Hub:
...---apiVersion: apps/v1kind: Deploymentmetadata: name: nodejs labels: version: v1spec: 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将运行的容器的规范,包括容器
name
和image
。 此处的图像是您在第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对象的定义:
apiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata: name: nodejs-gatewayspec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"
除了在metadata
字段中指定网关的name
,我们还包括以下规范:
- 一个
selector
,它将此资源与使用我们在安装Istio时选择的配置文件启用的默认Istio IngressGateway控制器匹配。 -
servers
规范,指定要为入口公开的端口以及网关公开的hosts
。 在这种情况下,我们使用星号(*
)指定所有hosts
,因为我们不使用特定的安全域。
在网关定义下方,添加虚拟服务的规范:
...---apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata: name: nodejsspec: 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服务公开和路由流量:
apiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata: name: grafana-gateway namespace: istio-systemspec: selector: istio: ingressgateway servers: - port: number: 15031 name: http-grafana protocol: HTTP hosts: - "*"---apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata: name: grafana-vs namespace: istio-systemspec: hosts: - "*" gateways: - grafana-gateway http: - match: - port: 15031 route: - destination: host: grafana port: number: 3000
我们的Grafana网关和虚拟服务规范与我们在第4步中为应用程序网关和虚拟服务定义的规范类似。 然而,有一些不同之处:
- Grafana将在
http-grafana
命名端口(端口15031
)上公开,它将在主机上的端口3000
上运行。 - 网关和虚拟服务都在
istio-system
命名空间中定义。 - 此虚拟服务中的
host
是istio-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 AGEgrafana-gateway 47s
您可以为虚拟服务执行相同的操作:
kubectl get virtualservice -n istio-system
NAME GATEWAYS HOSTS AGEgrafana-vs [grafana-gateway] [*] 74s
创建这些资源后,我们应该能够在浏览器中访问我们的Grafana仪表板。 然而,在我们这样做之前,让我们创建我们的应用程序服务和部署,以及我们的应用程序网关和虚拟服务,并检查我们是否可以在浏览器中访问我们的应用程序。
使用以下命令创建应用程序服务和部署:
kubectl apply -f node-app.yaml
等待几秒钟,然后使用以下命令检查应用程序Pod:
kubectl get pods
NAME READY STATUS RESTARTS AGEnodejs-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-kmb7xNamespace: default...Containers: nodejs: ... istio-proxy: Container ID: docker://f840d5a576536164d80911c46f6de41d5bc5af5152890c3aed429a1ee29af10b Image: docker.io/istio/proxyv2:1.1.7 Image ID: docker-pullable://istio/[email protected]:e6f039115c7d5ef9c8f6b049866fbf9b6f5e2255d3a733bb8756b36927749822 Port: 15090/TCP Host Port: 0/TCP Args: ...
接下来,创建应用程序网关和虚拟服务:
kubectl apply -f node-istio.yaml
您可以使用以下命令检查网关:
kubectl get gateway
NAME AGEnodejs-gateway 7s
和虚拟服务:
kubectl get virtualservice
NAME GATEWAYS HOSTS AGEnodejs [nodejs-gateway] [*] 28s
我们现在准备测试对应用程序的访问。 为此,我们需要与istio-ingressgateway
服务相关联的外部IP,这是一种LoadBalancer服务类型 。
使用以下命令获取istio-ingressgateway
服务的外部IP:
kubectl get svc -n istio-system
您将看到如下输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEgrafana ClusterIP 10.245.85.162 <none> 3000/TCP 42mistio-citadel ClusterIP 10.245.135.45 <none> 8060/TCP,15014/TCP 42mistio-galley ClusterIP 10.245.46.245 <none> 443/TCP,15014/TCP,9901/TCP 42mistio-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 42mistio-pilot ClusterIP 10.245.56.97 <none> 15010/TCP,15011/TCP,8080/TCP,15014/TCP 42mistio-policy ClusterIP 10.245.206.189 <none> 9091/TCP,15004/TCP,15014/TCP 42mistio-sidecar-injector ClusterIP 10.245.223.99 <none> 443/TCP 42mistio-telemetry ClusterIP 10.245.5.215 <none> 9091/TCP,15004/TCP,15014/TCP,42422/TCP 42mprometheus 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 Service Dashboard 。
这将带您进入另一个下拉菜单的登录页面:
从可用选项列表中选择nodejs.default.svc.cluster.local
。
您现在可以查看该服务的流量数据:
现在,您已经在Istio服务网格中运行了一个正在运行的Node.js应用程序,其中启用了Grafana并配置了外部访问。
结论
在本教程中,您使用Helm软件包管理器安装了Istio,并使用它来使用网关和虚拟服务对象公开Node.js应用程序服务。 您还配置了网关和虚拟服务对象以公开Grafana遥测插件,以查看应用程序的流量数据。
当您转向生产时,您需要采取措施,例如使用HTTPS保护您的应用程序网关,并确保对Grafana服务的访问也是安全的 。