如何在Kubernetes中安装和使用Istio

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

使用像 Istio 这样的服务网格可以简化服务发现、路由和流量配置、加密和身份验证/授权以及监控和遥测等任务。 尤其是 Istio,其设计目的是无需对现有服务代码进行重大更改即可工作。 例如,在使用 Kubernetes 时,可以通过构建与现有应用程序资源一起使用的 Istio 特定对象,将服务网格功能添加到集群中运行的应用程序。

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

先决条件

要完成本教程,您需要:

注意: 我们强烈建议使用至少 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-citadelistio-galleyistio-ingressgatewayistio-pilotistio-policyistio-sidecar-injectoristio-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 应该有 RunningSTATUS,表示 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 将运行的容器的规格,包括容器 nameimage。 这里的 image 是您在 Step 1 中创建并推送到 Docker Hub 的镜像。 容器规范还包括 containerPort 配置以指向每个容器将侦听的端口。 如果端口未在此处列出,它们将绕过 Istio 代理。 请注意,此端口 8080 对应于服务定义中指定的目标端口。

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

有了这个文件,我们可以继续编辑该文件,该文件将包含网关和虚拟服务对象的定义,这些对象控制流量如何进入网格以及到达网格后如何路由。

第 4 步——创建 Istio 对象

为了控制对集群的访问和对服务的路由,Kubernetes 使用 Ingress ResourcesControllers。 入口资源定义 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 命名空间中。
  • 此虚拟服务中的 hostistio-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 服务的访问也是 安全 之类的步骤。

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