入门

本指南帮您快速评估 Istio。如果您已经熟悉 Istio, 或对安装其他配置类型或高级部署模型感兴趣, 请参阅我们应该采用哪种 Istio 安装方法? 的 FAQ 页面。

您需要一个 Kubernetes 集群才能继续。如果您没有集群, 则可以使用 kind 或任何其他受支持的 Kubernetes 平台

请按照以下步骤开始使用 Istio:

  1. 下载并安装 Istio
  2. 安装 Kubernetes Gateway API CRD
  3. 部署示例应用
  4. 对外开放应用
  5. 查看仪表板

下载 Istio

  1. 转到 Istio 发布页面,下载适用于您操作系统的安装文件, 或自动下载并获取最新版本(Linux 或 macOS):

    $ curl -L https://istio.io/downloadIstio | sh -
  2. 转到 Istio 包目录。例如,如果包是 istio-1.25.0

    $ cd istio-1.25.0

    安装目录包含:

    • samples/ 目录下的示例应用
    • bin/ 目录下的 istioctl 客户端可执行文件。
  3. istioctl 客户端添加到路径(Linux 或 macOS):

    $ export PATH=$PWD/bin:$PATH

安装 Istio

在本指南中,我们使用 demo 配置文件。 选择它是为了拥有一组适合测试的默认设置,但还有其他配置文件可用于生产、 性能测试或 OpenShift

Istio Gateway 不同, 创建 Kubernetes Gateway 时, 默认情况下还会部署网关代理服务器。 由于不会使用它们,因此我们禁用通常作为 demo 配置文件的一部分安装的默认 Istio Gateway 服务的部署。

  1. 使用 demo 配置文件安装 Istio,无需任何 Gateway:

    Zip
    $ istioctl install -f @samples/bookinfo/demo-profile-no-gateways.yaml@ -y
    ✔ Istio core installed
    ✔ Istiod installed
    ✔ Installation complete
    Made this installation the default for injection and validation.
  2. 给命名空间添加标签,指示 Istio 在部署应用的时候,自动注入 Envoy Sidecar 代理:

    $ kubectl label namespace default istio-injection=enabled
    namespace/default labeled

安装 Kubernetes Gateway API CRD

Kubernetes Gateway API CRD 在大多数 Kubernetes 集群上不会默认安装, 因此请确保在使用 Gateway API 之前已安装它们。

  1. 如果 Gateway API CRD 尚不存在,请安装它们:

    $ kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
    { kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v1.2.0" | kubectl apply -f -; }

部署示例应用

您已将 Istio 配置为将 Sidecar 容器注入到您在 default 命名空间中部署的任何应用程序中。

  1. 部署 Bookinfo 示例应用

    Zip
    $ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo.yaml@
    service/details created
    serviceaccount/bookinfo-details created
    deployment.apps/details-v1 created
    service/ratings created
    serviceaccount/bookinfo-ratings created
    deployment.apps/ratings-v1 created
    service/reviews created
    serviceaccount/bookinfo-reviews created
    deployment.apps/reviews-v1 created
    deployment.apps/reviews-v2 created
    deployment.apps/reviews-v3 created
    service/productpage created
    serviceaccount/bookinfo-productpage created
    deployment.apps/productpage-v1 created

    应用很快会启动起来。当每个 Pod 准备就绪时,Istio Sidecar 将伴随应用一起部署。

    $ kubectl get services
    NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    details       ClusterIP   10.0.0.212      <none>        9080/TCP   29s
    kubernetes    ClusterIP   10.0.0.1        <none>        443/TCP    25m
    productpage   ClusterIP   10.0.0.57       <none>        9080/TCP   28s
    ratings       ClusterIP   10.0.0.33       <none>        9080/TCP   29s
    reviews       ClusterIP   10.0.0.28       <none>        9080/TCP   29s

    $ kubectl get pods
    NAME                              READY   STATUS    RESTARTS   AGE
    details-v1-558b8b4b76-2llld       2/2     Running   0          2m41s
    productpage-v1-6987489c74-lpkgl   2/2     Running   0          2m40s
    ratings-v1-7dc98c7588-vzftc       2/2     Running   0          2m41s
    reviews-v1-7f99cc4496-gdxfn       2/2     Running   0          2m41s
    reviews-v2-7d79d5bd5d-8zzqd       2/2     Running   0          2m41s
    reviews-v3-7dbcdcbc56-m8dph       2/2     Running   0          2m41s

    请注意,Pod 显示 READY 2/2,确认它们具有应用程序容器和 Istio Sidecar 容器。

  2. 通过检查响应中的页面标题来验证应用程序是否在集群内运行:

    $ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
    <title>Simple Bookstore App</title>

对外开放应用

Bookinfo 应用程序已部署,但无法从外部访问。为了使其可访问, 您需要创建一个 Ingress Gateway,它将路径映射到网格边缘的路由。

  1. 为 Bookinfo 应用创建 Kubernetes Gateway

    Zip
    $ kubectl apply -f @samples/bookinfo/gateway-api/bookinfo-gateway.yaml@
    gateway.gateway.networking.k8s.io/bookinfo-gateway created
    httproute.gateway.networking.k8s.io/bookinfo created

    默认情况下,Istio 会为网关创建一个 LoadBalancer 服务。 由于我们将通过隧道访问此网关,因此不需要负载均衡器。 如果您想了解如何为外部 IP 地址配置负载均衡器, 请阅读 Ingress Gateway 文档。

  2. 通过注解网关将服务类型更改为 ClusterIP

    $ kubectl annotate gateway bookinfo-gateway networking.istio.io/service-type=ClusterIP --namespace=default
  3. 要检查网关的状态,请运行:

    $ kubectl get gateway
    NAME               CLASS   ADDRESS                                            PROGRAMMED   AGE
    bookinfo-gateway   istio   bookinfo-gateway-istio.default.svc.cluster.local   True         42s

访问应用程序

您将通过刚刚配置的网关连接到 Bookinfo productpage 服务。 要访问网关,您需要使用 kubectl port-forward 命令:

$ kubectl port-forward svc/bookinfo-gateway-istio 8080:80

打开浏览器并导航到 http://localhost:8080/productpage 以查看 Bookinfo 应用程序。

Bookinfo 应用程序
Bookinfo 应用程序

如果您刷新页面,您应该会看到书评和评分发生变化, 因为请求分布在 reviews 服务的不同版本上。

查看仪表板

Istio 和几个遥测应用做了集成。 遥测能帮您了解服务网格的结构、展示网络的拓扑结构、分析网格的健康状态。

使用下面说明部署 Kiali 仪表板、 以及 PrometheusGrafana、 还有 Jaeger

  1. 安装 Kiali 和其他插件,等待部署完成。

    Zip
    $ kubectl apply -f @samples/addons@
    $ kubectl rollout status deployment/kiali -n istio-system
    Waiting for deployment "kiali" rollout to finish: 0 of 1 updated replicas are available...
    deployment "kiali" successfully rolled out
  2. 访问 Kiali 仪表板。

    $ istioctl dashboard kiali
  3. 在左侧的导航菜单,选择 Graph, 然后在 Namespace 下拉列表中,选择 default

    Kiali 仪表板展示了网格的概览以及 Bookinfo 示例应用的各个服务之间的关系。 它还提供过滤器来可视化流量的流动。

    Kiali 仪表板
    Kiali 仪表板

后续步骤

恭喜您完成了评估安装!

对于新手来说,以下这些任务是非常好的学习资源, 可以借助 demo 安装更深入评估 Istio 的特性:

在您为生产系统定制 Istio 之前,请先参阅这些学习资源:

加入 Istio 社区

我们欢迎您加入 Istio 社区, 提出问题,并给我们以反馈。

卸载

要删除 Bookinfo 示例应用和配置,请参阅清理 Bookinfo

Istio 卸载程序按照层次结构逐级地从 istio-system 命令空间中删除 RBAC 权限和所有资源。对于不存在的资源报错, 可以安全地忽略掉,毕竟它们已经被分层地删除了。

Zip
$ kubectl delete -f @samples/addons@
$ istioctl uninstall -y --purge

命名空间 istio-system 默认情况下并不会被移除。 不需要的时候,使用下面命令移除它:

$ kubectl delete namespace istio-system

指示 Istio 自动注入 Envoy Sidecar 代理的标签默认也不移除。 不需要的时候,使用下面命令移除它。

$ kubectl label namespace default istio-injection-

如果您安装了 Kubernetes Gateway API CRD 并且现在想要删除它们,请运行以下命令之一:

  • 如果您运行的任何任务需要实验版本的 CRD:

    $ kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd/experimental?ref=v1.2.0" | kubectl delete -f -
  • 否则:

    $ kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v1.2.0" | kubectl delete -f -
这些信息有用吗?
您是否有更多建议和改进意见?

感谢您的反馈!