在 Kubernetes Engine 上安装 Istio

Istio 是一个开源框架,用于连接、监控和保护微服务,包括在 Kubernetes Engine 上运行的服务。Istio 让您可创建部署服务的网络并进行负载平衡、服务到服务身份验证、监控等,无需对服务代码进行任何更改。要为各项服务添加 Istio 支持,您可以向应用的每个 Pod 部署一个特殊的 Envoy 辅助信息文件代理。Envoy 代理拦截微服务之间的所有网络通信,并通过 Istio 的控制平面功能进行配置和管理。本教程介绍了如何在 GKE 上安装和配置 Istio 以及部署已启用 Istio 的多服务应用。

准备工作

请按照以下步骤启用 Kubernetes Engine API:
  1. 访问 Google Cloud Platform Console 中的 Kubernetes Engine 页面
  2. 创建或选择项目。
  3. 在 API 和相关服务启用前稍作等待。此过程可能耗时几分钟。
  4. 确保您的 Google Cloud Platform 项目已启用结算功能。

    了解如何启用结算功能

安装本教程中使用的以下命令行工具:

  • gcloud 用于创建和删除 Kubernetes Engine 集群。gcloud 内附在 Google Cloud SDK 中。
  • kubectl 用于管理 Kubernetes(即 Kubernetes Engine 使用的集群编排系统)。您可以使用 gcloud 安装 kubectl
    gcloud components install kubectl

gcloud 命令行工具设置默认值

为了节省您在 gcloud 命令行工具中输入项目 IDCompute Engine 地区选项的时间,您可以设置默认值:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

创建 GKE 集群

在本教程中,要创建集群,请运行以下命令(我们将调用教程集群 istio-tutorial):

gcloud container clusters create istio-tutorial \
    --machine-type=n1-standard-2 \
    --num-nodes=4

使用自己的集群

如果您要在本教程中使用现有集群,请确保现有集群使用 Kubernetes 的 GKE 默认版本并已启用基于角色的访问权限控制 (RBAC)。默认情况下,系统会为所有运行 Kubernetes 1.6 或更高版本的集群启用 RBAC。要在较低版本上启用 RBAC,请使用选项 --no-enable-legacy-authorization 更新集群。

您还应确保已安装 kubectl 且版本不低于您的集群版本。运行 kubectl version 可验证您是否在使用最新版本。

第 1 步:安装 Istio

现在,我们来安装 Istio。Istio 安装在其自身的 istio-system 命名空间中,且可以管理来自其他所有命名空间的微服务。安装项包括 Istio 核心组件、工具和示例。

在集群凭据所在的机器上按照以下步骤操作:这是您的集群管理机器。

  1. 转到 Istio 版本页面以下载与您要运行 Istio 客户端的操作系统对应的安装文件。

  2. 解压缩已下载的安装文件。安装目录包含:

    • install/ 中 Kubernetes 的安装 .yaml 文件
    • samples/ 中的示例应用
    • bin/ 目录中的 istioctl 客户端二进制文件。手动注入 Envoy 作为辅助信息文件代理以及创建路由规则和政策时会使用 istioctl
    • istio.VERSION 配置文件
  3. 确保您位于 Istio 安装的根目录中。

  4. istioctl 客户端添加到 PATH:

    export PATH=$PWD/bin:$PATH
  5. 向当前用户授予集群管理员权限。您需要这些权限才能为 Istio 创建必要的基于角色的访问权限控制 (RBAC) 规则:

    kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user="$(gcloud config get-value core/account)"
    
  6. 安装 Istio 的核心组件:

    kubectl apply -f install/kubernetes/istio-demo-auth.yaml

    该命令将执行以下操作:

    • 创建 istio-system 命名空间以及所需的 RBAC 权限
    • 部署 Istio 核心组件:

      • Istio-Pilot,负责发现服务以及在 Istio 服务网格中配置 Envoy 辅助信息文件代理。
      • Mixer 组件 Istio-Policy 和 Istio-Telemetry,这些组件实施使用政策并收集服务网格中的遥测数据。
      • Istio-Ingressgateway,为集群外部的流量提供入站点。
      • Istio-Citadel,针对 Istio 自动执行密钥和证书管理。
    • 部署指标、日志和跟踪记录的插件。

    • 在 Envoy 辅助信息文件之间启用双向 TLS 身份验证。请注意,使用此身份验证选项可能不适用于所有应用:如需了解如何在不使用该身份验证选项的情况下安装 Istio 以及您何时可能需要执行此操作,请参阅 Istio 设置指南

第 2 步:验证 Istio 安装

  1. 确保已部署以下 Kubernetes 服务:istio-citadelistio-pilotistio-ingressgatewayistio-policyistio-telemetry(您还会看到其他已部署的服务):

    kubectl get service -n istio-system
    
    输出:
    NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                               AGE
    ...
    istio-citadel              ClusterIP      10.19.253.95            8060/TCP,9093/TCP                                                     37s
    istio-egressgateway        ClusterIP      10.19.242.139           80/TCP,443/TCP                                                        40s
    istio-ingressgateway       LoadBalancer   10.19.247.233        80:31380/TCP,443:31390/TCP,31400:31400/TCP                            40s
    istio-pilot                ClusterIP      10.19.243.14            15003/TCP,15005/TCP,15007/TCP,15010/TCP,15011/TCP,8080/TCP,9093/TCP   38s
    istio-policy               ClusterIP      10.19.254.117           9091/TCP,15004/TCP,9093/TCP                                           39s
    istio-sidecar-injector     ClusterIP      10.19.248.228           443/TCP                                                               37s
    istio-statsd-prom-bridge   ClusterIP      10.19.252.35            9102/TCP,9125/UDP                                                     39s
    istio-telemetry            ClusterIP      10.19.250.11            9091/TCP,15004/TCP,9093/TCP,42422/TCP                                 39s
    ...
  2. 确保已部署相应的 Kubernetes Pod,并且所有容器已启动且正在运行:istio-pilot-*istio-policy-*istio-telemetry-*istio-ingressgateway-*istio-citadel-*

    kubectl get pods -n istio-system
    
    输出:
    NAME                                        READY     STATUS      RESTARTS   AGE
    grafana-6995b4fbd7-mp7ps                    1/1       Running     0          12m
    istio-citadel-54f4678f86-4549b              1/1       Running     0          12m
    istio-cleanup-secrets-5pl77                 0/1       Completed   0          12m
    istio-egressgateway-c68bcd889-p52rb         1/1       Running     0          12m
    istio-galley-7bd8b5f88f-nhwlc               1/1       Running     0          12m
    istio-grafana-post-install-6dwhp            0/1       Completed   3          12m
    istio-ingressgateway-665699c874-l62rg       1/1       Running     0          12m
    istio-pilot-68cbbcd65d-l5298                2/2       Running     0          12m
    istio-policy-7c5b5bb744-k6vm9               2/2       Running     0          12m
    istio-security-post-install-g9l9p           0/1       Completed   3          12m
    istio-sidecar-injector-85ccf84984-2hpfm     1/1       Running     0          12m
    istio-statsd-prom-bridge-55965ff9c8-x6sqd   1/1       Running     0          12m
    istio-telemetry-5b6c57fffc-9j4dc            2/2       Running     0          12m
    istio-tracing-77f9f94b98-jv8vh              1/1       Running     0          12m
    prometheus-7456f56c96-7hrk5                 1/1       Running     0          12m
    servicegraph-684c85ffb9-9cd4x               1/1       Running     0          12m

第 3 步:部署 BookInfo 示例应用

一旦完成 Istio 安装且 Istio 的所有组件都在运行后,您可以尝试部署随安装提供的其中一个示例应用。在本教程中,我们将安装 BookInfo。它是一个简单的模拟书店应用,由四项服务组成。这些服务提供了网络产品页面、图书详情、评价(具有多个版本的评价服务)和评分,且全部使用 Istio 进行管理。您可以在 Istio 安装的 samples/bookinfo 目录中找到此示例中使用的源代码及所有其他文件。

如果按照以下步骤操作,则会在已启用 Istio 的环境中部署 BookInfo 应用的服务,并且 Envoy 辅助信息文件代理会与每项服务一起注入,从而提供 Istio 功能。

  1. 确保您仍位于集群管理机上的 Istio 安装目录的根目录中。

  2. 使用 kubectl applyistioctl kube-inject 部署应用。kube-inject 命令用于更新 BookInfo 部署,以便在每个应用 Pod 以及对应服务中部署辅助信息文件。

    kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
    
  3. 通过运行以下命令确认是否已正确部署应用:

    kubectl get services
    输出:
    NAME                       CLUSTER-IP   EXTERNAL-IP   PORT(S)              AGE
    details                    10.0.0.31    <none>        9080/TCP             6m
    kubernetes                 10.0.0.1     <none>        443/TCP              7d
    productpage                10.0.0.120   <none>        9080/TCP             6m
    ratings                    10.0.0.15    <none>        9080/TCP             6m
    reviews                    10.0.0.170   <none>        9080/TCP             6m

    kubectl get pods
    输出:
    NAME                                        READY     STATUS    RESTARTS   AGE
    details-v1-1520924117-48z17                 2/2       Running   0          6m
    productpage-v1-560495357-jk1lz              2/2       Running   0          6m
    ratings-v1-734492171-rnr5l                  2/2       Running   0          6m
    reviews-v1-874083890-f0qf0                  2/2       Running   0          6m
    reviews-v2-1343845940-b34q5                 2/2       Running   0          6m
    reviews-v3-1813607990-8ch52                 2/2       Running   0          6m
  4. 最后,为应用定义入站网关路由:

    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    

第 4 步:验证应用部署

在完成部署后,接下来我们来查看 BookInfo 应用的运行情况。

获取入站 IP 和端口

要使用 BookInfo,首先您需要获取入站 IP 和端口,如下所示:

kubectl get svc istio-ingressgateway -n istio-system
输出:
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                      AGE
istio-ingressgateway   LoadBalancer   10.19.247.233   35.239.7.64   80:31380/TCP,443:31390/TCP,31400:31400/TCP   27m

这将为您提供入站服务的地址,如下所示(使用第一个端口):

export GATEWAY_URL=35.239.7.64:80

试用应用

在您获取地址和端口后,使用 curl 来检查 BookInfo 应用是否正在运行:

curl -I http://${GATEWAY_URL}/productpage

如果响应显示 200,则表示应用与 Istio 正常配合使用。

然后将浏览器指向 http://$GATEWAY_URL/productpage 以查看 BookInfo 网页。如果您多次刷新该页面,您应该会看到产品页面中显示的不同版本的评论,以轮询方式呈现(红色星标、黑色星标、无星标),因为我们尚未使用 Istio 来控制版本路由。

部署您自己的应用

如果您想要尝试部署一个您自己的应用,只需在自己的 YAML 部署中执行相同的过程:Istio 不需要更改应用本身。请注意,应用必须对其所有 HTTP 流量使用 HTTP/1.1 或 HTTP/2.0 协议,这是因为 Envoy 代理不支持 HTTP/1.0:Envoy 代理依赖 HTTP/1.0 中不存在的标头进行路由。

清理

为避免因本教程中使用的资源而导致我们向您的 Google Cloud Platform 帐号收取费用,请执行以下操作:

如果您不想在后续步骤中继续探索 BookInfo 应用,请执行以下操作以避免因本教程中使用的资源而导致系统向您的 Google Cloud Platform 帐号收取费用:

  1. 删除 istio-ingressgateway 入站服务。

    kubectl -n istio-system delete service istio-ingressgateway
  2. 观察以下命令的输出,等到 istio-ingressgateway 负载平衡器被删除为止:

    gcloud compute forwarding-rules list
  3. 删除容器集群:

    gcloud container clusters delete istio-tutorial

后续步骤

虽然 Istio 控制平面只能安装在 Kubernetes 上,但通过 Istio 的网格扩展功能,您可以将非 Kubernetes 机器(如 Compute Engine 虚拟机)添加到 Istio 服务网格中。如需了解如何执行上述操作以及扩展我们的 BookInfo 示例,请参阅将 Istio 与 Compute Engine 配合使用

如果您想要进一步探索 Istio,请参阅 Istio 网站的指南部分,找到更多教程来帮助您使用 BookInfo 的 Istio 功能。这些指南包括:

  • 智能路由:此示例展示了如何将 Istio 的各种流量管理功能用于 BookInfo。完成本教程后,下一步最好是了解该示例。
  • 深度遥测:此示例演示了如何使用 Istio Mixer 和 Envoy 代理,在不同 BookInfo 服务中获取统一指标、日志和跟踪记录。
此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Kubernetes Engine 教程