介绍
服务网格是一个基础设施层,允许您管理应用程序微服务之间的通信。 随着越来越多的开发人员使用微服务,服务网格已经发展到通过在分布式设置中整合常见的管理和管理任务来使这项工作更容易、更有效。
使用像 Istio 这样的服务网格可以简化服务发现、路由和流量配置、加密和身份验证/授权以及监控和遥测等任务。 尤其是 Istio,其设计目的是无需对现有服务代码进行重大更改即可工作。 例如,在使用 Kubernetes 时,可以通过构建与现有应用程序资源一起使用的 Istio 特定对象,将服务网格功能添加到集群中运行的应用程序。
在本教程中,您将使用 Kubernetes 的 Helm 包管理器安装 Istio。 然后,您将使用 Istio 通过创建 Gateway 和 Virtual Service 资源将演示 Node.js 应用程序公开给外部流量。 最后,您将访问 Grafana 遥测插件以可视化您的应用程序流量数据。
先决条件
要完成本教程,您需要:
- 启用了基于角色的访问控制 (RBAC) 的 Kubernetes 1.10+ 集群。 此设置将使用具有三个节点的 DigitalOcean Kubernetes 集群,但您可以自由地 使用另一种方法 创建集群。
注意: 我们强烈建议使用至少 8GB 可用内存和 4 个 vCPU 的集群进行此设置。 本教程将使用三个 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 帐户。 有关如何设置的概述,请参阅 this Introduction to Docker Hub。
第 1 步 — 打包应用程序
要将我们的演示应用程序与 Kubernetes 一起使用,我们需要克隆代码并将其打包,以便 kubelet 代理 可以拉取图像。
我们的第一步是从 DigitalOcean 社区 GitHub 帐户 克隆 nodejs-image-demo 存储库。 此存储库包含 如何使用 Docker 构建 Node.js 应用程序中描述的设置中的代码,其中描述了如何为 Node.js 应用程序构建映像以及如何使用此映像创建容器。 您可以在 From Containers to Kubernetes with Node.js 系列中找到有关应用程序本身的更多信息。
首先,将 nodejs-image-demo 存储库克隆到名为 istio_project
的目录中:
git clone https://github.com/do-community/nodejs-image-demo.git istio_project
导航到 istio_project
目录:
cd istio_project
此目录包含鲨鱼信息应用程序的文件和文件夹,该应用程序为用户提供有关鲨鱼的基本信息。 除了应用程序文件之外,该目录还包含一个 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
您将看到以下输出确认映像构建:
OutputREPOSITORY 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
您将看到确认您的应用程序容器正在运行的输出:
OutputCONTAINER 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
OutputCONTAINER 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 以最大限度地提高管理配置选项的灵活性。 我们将使用 Helm 安装 Istio 并确保启用 Grafana 插件,以便我们可以可视化应用程序的流量数据。
首先,添加 Istio 发布存储库:
helm repo add istio.io https://storage.googleapis.com/istio-release/releases/1.1.7/charts/
这将使您能够使用存储库中的 Helm 图表来安装 Istio。
检查你是否有 repo:
helm repo list
您应该会看到列出的 istio.io
存储库:
OutputNAME 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 的 Custom Resource Definitions (CRD):
helm install --name istio-init --namespace istio-system istio.io/istio-init
OutputNAME: 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 命名为 release 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
OutputNAME: istio LAST DEPLOYED: Fri Jun 7 17:18:33 2019 NAMESPACE: istio-system STATUS: DEPLOYED ...
同样,我们将 Istio 对象安装到 istio-system
命名空间并命名发行版 - 在本例中为 istio
。
我们可以使用以下命令验证我们期望为默认配置文件创建的 Service objects:
kubectl get svc -n istio-system
我们希望在这里看到的服务包括 istio-citadel
、istio-galley
、istio-ingressgateway
、istio-pilot
、istio-policy
、istio-sidecar-injector
、istio-telemetry
和 prometheus
。 我们还希望看到 grafana
服务,因为我们在安装过程中启用了这个插件:
OutputNAME 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 关联的容器正在运行:
OutputNAME 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 sidecar 之间的通信,这些边车组成了网格的数据平面和控制平面的组件。 为了使网格能够正常工作,我们需要确保网格中的每个 Pod 也将运行一个 Envoy sidecar。
有两种方法可以实现这个目标:手动sidecar注入和自动sidecar注入。 我们将通过 labeling 来启用自动边车注入,我们将在其中创建带有标签 istio-injection=enabled
的应用程序对象。 这将确保 MutatingAdmissionWebhook 控制器可以拦截对 kube-apiserver
的请求并执行特定操作——在这种情况下,确保我们所有的应用程序 Pod 都以 sidecar 开头。
我们将使用 default
命名空间来创建我们的应用程序对象,因此我们将使用以下命令将 istio-injection=enabled
标签应用于该命名空间:
kubectl label namespace default istio-injection=enabled
我们可以通过运行来验证该命令是否按预期工作:
kubectl get namespace -L istio-injection
您将看到以下输出:
OutputAME 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 后,我们可以继续创建应用程序服务和 Deployment 对象。
第 3 步 — 创建应用程序对象
使用 Istio 网格并配置为注入 sidecar Pod,我们可以为我们的服务和部署对象创建一个具有 规范 的应用程序 manifest。 Kubernetes 清单中的规范描述了每个对象的期望状态。
我们的应用程序服务将确保运行我们容器的 Pod 在动态环境中保持可访问性,因为单个 Pod 被创建和销毁,而我们的部署将描述我们的 Pod 的所需状态。
使用 nano
或您喜欢的编辑器打开一个名为 node-app.yaml
的文件:
nano node-app.yaml
首先,添加以下代码来定义nodejs
应用服务:
~/istio_project/node-app.yaml
apiVersion: v1 kind: Service metadata: name: nodejs labels: app: nodejs spec: selector: app: nodejs ports: - name: http port: 8080
此服务定义包含一个 selector
,它将匹配具有相应 app: nodejs
标签的 Pod。 我们还指定服务将针对任何具有匹配标签的 Pod 上的端口 8080
。
我们还命名了服务端口,以符合 Istio 对 Pod 和服务 的 要求。 http
值是 Istio 将为 name
字段接受的值之一。
接下来,在服务下方,为应用程序部署添加以下规范。 请务必将 containers
规范下列出的 image
替换为您在 步骤 1 中创建并推送到 Docker Hub 的映像:
~/istio_project/node-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
此 Deployment 的规范包括 replicas
的数量(在本例中为 1),以及定义 Deployment 将管理哪些 Pod 的 selector
。 在这种情况下,它将管理带有 app: nodejs
标签的 Pod。
template
字段包含执行以下操作的值:
- 将
app: nodejs
标签应用于 Deployment 管理的 Pod。 Istio 建议 将app
标签添加到部署规范中,以便为 Istio 的指标和遥测提供上下文信息。 - 应用
version
标签来指定与此 Deployment 对应的应用程序的版本。 与app
标签一样,Istio 建议包含version
标签以提供上下文信息。 - 定义 Pod 将运行的容器的规格,包括容器
name
和image
。 这里的image
是您在 Step 1 中创建并推送到 Docker Hub 的镜像。 容器规范还包括containerPort
配置以指向每个容器将侦听的端口。 如果端口未在此处列出,它们将绕过 Istio 代理。 请注意,此端口8080
对应于服务定义中指定的目标端口。
完成编辑后保存并关闭文件。
有了这个文件,我们可以继续编辑该文件,该文件将包含网关和虚拟服务对象的定义,这些对象控制流量如何进入网格以及到达网格后如何路由。
第 4 步——创建 Istio 对象
为了控制对集群的访问和对服务的路由,Kubernetes 使用 Ingress Resources 和 Controllers。 入口资源定义 HTTP 和 HTTPS 路由到集群服务的规则,而控制器负载平衡传入流量并将其路由到正确的服务。
有关使用 Ingress 资源和控制器的更多信息,请参阅 如何在 DigitalOcean Kubernetes 上使用 Cert-Manager 设置 Nginx Ingress 。
Istio 使用一组不同的对象来实现类似的目的,尽管有一些重要的区别。 Istio 网格不使用控制器来负载平衡流量,而是使用 Gateway,它充当负载平衡器,处理传入和传出的 HTTP/TCP 连接。 然后,网关允许将监控和路由规则应用于进入网格的流量。 具体来说,确定流量路由的配置被定义为虚拟服务。 每个虚拟服务都包含将条件与特定协议和目标相匹配的路由规则。
尽管 Kubernetes 入口资源/控制器和 Istio 网关/虚拟服务在功能上有一些相似之处,但网格的结构引入了重要的区别。 例如,Kubernetes 入口资源和控制器为运营商提供了一些路由选项,但网关和虚拟服务提供了一组更强大的功能,因为它们使流量能够进入网格。 换句话说,Kubernetes 入口控制器和资源为集群操作员提供的有限的 应用层 功能不包括由 Istio 服务网格中的 sidecars 提供的功能——包括高级路由、跟踪和遥测.
为了允许外部流量进入我们的网格并配置到我们的 Node 应用程序的路由,我们需要创建一个 Istio 网关和虚拟服务。 为清单打开一个名为 node-istio.yaml
的文件:
nano node-istio.yaml
首先,添加网关对象的定义:
~/istio_project/node-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 IngressGateway 控制器匹配,该控制器是使用我们在安装 Istio 时选择的 配置文件 启用的。 servers
规范,指定要为入口公开的port
和网关公开的hosts
。 在这种情况下,我们使用星号 (*
) 指定所有hosts
,因为我们不使用特定的安全域。
在网关定义下方,添加虚拟服务规范:
~/istio_project/node-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 将基于定义 rule 的命名空间,而不是 Service,因此当您的应用程序 Service 和 Virtual Service 是时,请务必在此字段中使用 FQDN在不同的命名空间中。 要更全面地了解 Kubernetes 域名系统 (DNS),请参阅 Kubernetes DNS 服务简介。
完成编辑后保存并关闭文件。
准备好 yaml
文件后,您可以创建应用程序服务和部署,以及允许访问应用程序的网关和虚拟服务对象。
第 5 步 - 创建应用程序资源并启用遥测访问
创建应用程序服务和部署对象以及网关和虚拟服务后,您将能够向应用程序生成一些请求并在 Istio Grafana 仪表板中查看相关数据。 但是,首先,您需要配置 Istio 以公开 Grafana 插件,以便您可以在浏览器中访问仪表板。
我们将 启用使用 HTTP 的 Grafana 访问,但是当您在生产或敏感环境中工作时,强烈建议您 启用使用 HTTPS 的访问。
因为我们在 Step 2 中安装 Istio 时设置了 --set grafana.enabled=true
配置选项,所以我们在 istio-system
命名空间中有一个 Grafana 服务和 Pod,我们在该步骤中确认了这一点。
有了这些资源,我们的下一步将是为网关和虚拟服务创建清单,以便我们可以公开 Grafana 插件。
打开清单文件:
nano node-grafana.yaml
将以下代码添加到文件中以创建网关和虚拟服务,以将流量公开并路由到 Grafana 服务:
~/istio_project/node-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 网关和虚拟服务规范类似于我们在 Step 4 中为应用程序网关和虚拟服务定义的规范。 但是,有一些区别:
- Grafana 将暴露在
http-grafana
命名端口(端口15031
)上,它将在主机上的端口3000
上运行。 - 网关和虚拟服务都定义在
istio-system
命名空间中。 - 此虚拟服务中的
host
是istio-system
命名空间中的grafana
服务。 由于我们在运行 Grafana 服务的同一命名空间中定义此规则,因此 FQDN 扩展将再次正常工作而不会发生冲突。
注意: 因为我们当前的 MeshPolicy 被配置为在 许可模式 下运行 TLS,我们不需要将 Destination Rule 应用到我们的显现。 如果您在安装 Istio 时选择了不同的配置文件,则在启用通过 HTTP 访问 Grafana 时,您需要添加目标规则以禁用双向 TLS。 有关如何执行此操作的更多信息,您可以参考 官方 Istio 文档 关于启用使用 HTTP 访问遥测插件。
完成编辑后保存并关闭文件。
使用以下命令创建 Grafana 资源:
kubectl apply -f node-grafana.yaml
kubectl apply 命令允许您在创建或更新对象的过程中将特定配置应用于对象。 在我们的例子中,我们在创建网关和虚拟服务对象的过程中将我们在 node-grafana.yaml
文件中指定的配置应用到它们。
您可以使用以下命令查看 istio-system
命名空间中的网关:
kubectl get gateway -n istio-system
您将看到以下输出:
OutputNAME AGE grafana-gateway 47s
您可以对虚拟服务执行相同的操作:
kubectl get virtualservice -n istio-system
OutputNAME GATEWAYS HOSTS AGE grafana-vs [grafana-gateway] [*] 74s
创建这些资源后,我们应该能够在浏览器中访问我们的 Grafana 仪表板。 然而,在我们这样做之前,让我们创建我们的应用程序服务和部署,以及我们的应用程序网关和虚拟服务,并检查我们是否可以在浏览器中访问我们的应用程序。
使用以下命令创建应用程序服务和部署:
kubectl apply -f node-app.yaml
等待几秒钟,然后使用以下命令检查您的应用程序 Pod:
kubectl get pods
OutputNAME READY STATUS RESTARTS AGE nodejs-7759fb549f-kmb7x 2/2 Running 0 40s
您的应用程序容器正在运行,您可以在 STATUS
列中看到,但是如果应用程序清单来自 Step 3[X173X,为什么 READY
列会列出 2/2
] 只指定了 1 个副本?
第二个容器是 Envoy sidecar,您可以使用以下命令对其进行检查。 请务必将此处列出的 pod 替换为您自己的 nodejs
Pod 的 NAME
:
kubectl describe pod nodejs-7759fb549f-kmb7x
OutputName: 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
OutputNAME AGE nodejs-gateway 7s
和虚拟服务:
kubectl get virtualservice
OutputNAME GATEWAYS HOSTS AGE nodejs [nodejs-gateway] [*] 28s
我们现在准备测试对应用程序的访问。 为此,我们需要与我们的 istio-ingressgateway
服务关联的外部 IP,它是 LoadBalancer 服务类型。
使用以下命令获取 istio-ingressgateway
服务的外部 IP:
kubectl get svc -n istio-system
您将看到如下输出:
OutputNAME 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
的 Service,并且是唯一具有外部 IP 的 Service。
在浏览器中导航到此外部 IP:http://ingressgateway_ip
。
您应该看到以下登录页面:
接下来,通过单击刷新五六次为站点生成一些负载。
您现在可以检查 Grafana 仪表板以查看流量数据。
在您的浏览器中,再次使用您的 istio-ingressgateway
外部 IP 和您在 Grafana 网关清单中定义的端口导航到以下地址:http://ingressgateway_ip:15031
。
您将看到以下登录页面:
点击页面顶部的 Home 将带您进入包含 istio 文件夹的页面。 要获取下拉选项列表,请单击 istio 文件夹图标:
从此选项列表中,单击 Istio Service Dashboard。
这将带您进入带有另一个下拉菜单的登录页面:
从可用选项列表中选择 nodejs.default.svc.cluster.local
。
您现在可以查看该服务的流量数据:
您现在有一个运行在 Istio 服务网格中的正常运行的 Node.js 应用程序,启用了 Grafana 并配置为外部访问。
结论
在本教程中,您使用 Helm 包管理器安装了 Istio,并使用它通过网关和虚拟服务对象公开了一个 Node.js 应用程序服务。 您还配置了网关和虚拟服务对象以公开 Grafana 遥测插件,以便查看应用程序的流量数据。
当您转向生产时,您将需要采取诸如 使用 HTTPS 保护您的应用程序网关并确保对 Grafana 服务的访问也是 安全 之类的步骤。