开始使用 Istio 和 Kubernetes Gateway API

本指南可以让您快速熟悉 Istio。如果您已经熟悉了 Istio 或想要安装其他配置文件或高级的部署模型, 请参阅 FAQ 页面:我应该使用哪种 Istio 安装方法?

这些步骤需要您有一个运行 Kubernetes (1.27, 1.28, 1.29, 1.30) 所支持版本cluster。您可以使用任意受支持的平台,例如 Minikube特定平台安装说明中指定的其他平台。

遵循以下步骤开始使用 Istio:

  1. 下载并安装 Istio
  2. 部署样例应用
  3. 打开应用程序并允许外部流量
  4. 查看仪表板

下载 Istio

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

    $ curl -L https://istio.io/downloadIstio | sh -
    
  2. 切换到 Istio 文件包目录。例如,如果文件包是 istio-1.23.0

    $ cd istio-1.23.0
    

    安装目录包含:

    • 位于 samples/ 中的样例应用
    • 位于 bin/ 目录中的 istioctl 客户端二进制文件。
  3. 添加 istioctl 客户端到您的路径(Linux 或 macOS):

    $ export PATH=$PWD/bin:$PATH
    

安装 Istio

  1. 本次安装使用 demo 配置文件。 这个配置文件包含了便于测试的一组默认值,当然您可以使用其他配置文件用于生产或性能测试。

    Istio Gateway 不同, 创建 Kubernetes Gateway 将默认部署关联的网关代理服务。 因为本例不会使用这些服务,所以将禁用默认的 Istio 网关服务, 这些默认服务通常是作为 demo 配置文件的一部分被安装的。

    Zip
    $ istioctl install -f @samples/bookinfo/demo-profile-no-gateways.yaml@ -y
    ✔ Istio core installed
    ✔ Istiod installed
    ✔ Installation complete
    
  2. 添加命名空间标签,指示 Istio 在您稍后部署应用时自动注入 Envoy Sidecar 代理:

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

部署样例应用

  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
    
  2. 此应用将启动。随着每个 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
    
  3. 确认到此为止一切运行良好。执行以下命令通过检查响应中的页面标题查看应用是否在集群内运行且正在提供 HTML 页面:

    $ 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
    

    因为创建 Kubernetes Gateway 资源也会部署关联的代理服务, 所以执行以下命令等到 Gateway 就绪:

    $ kubectl wait --for=condition=programmed gtw bookinfo-gateway
    
  2. 确保配置没有问题:

    $ istioctl analyze
    ✔ No validation issues found when analyzing namespace: default.
    

确定 Ingress IP 和端口

  1. 设置访问网关的 INGRESS_HOSTINGRESS_PORT 变量:

    $ export INGRESS_HOST=$(kubectl get gtw bookinfo-gateway -o jsonpath='{.status.addresses[0].value}')
    $ export INGRESS_PORT=$(kubectl get gtw bookinfo-gateway -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')
    
  2. 设置 GATEWAY_URL

    $ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
    
  3. 确保 IP 地址和端口均被成功分配给了环境变量:

    $ echo "$GATEWAY_URL"
    169.48.8.37:80
    

验证外部访问

通过浏览器查看 Bookinfo 产品页面,确认能从集群外访问 Bookinfo 应用。

  1. 执行以下命令检索 Bookinfo 应用的对外地址。

    $ echo "http://$GATEWAY_URL/productpage"
    
  2. 将上一条命令的输出粘贴到您的 Web 浏览器中,确认 Bookinfo 产品页面显示正常。

查看仪表板

Istio 集成了几种不同的遥测应用。 这些可以帮助您了解服务网格的结构,能够显示网格的拓扑,还能分析网格的健康状况。

参阅以下指示说明部署 Kiali 仪表板, 以及 PrometheusGrafanaJaeger

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

    $ 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. 在左侧导航菜单中,从 Namespace 下拉菜单中选择 Graph,选择 default

    Kiali 仪表板显示了网格的概述以及 Bookinfo 样例应用中服务之间的关系。 Kiali 还能过滤显示流量。

    Kiali Dashboard
    Kiali Dashboard

下一步

恭喜完成了评估安装!

以下任务便于初学者使用这个 demo 安装进一步评估 Istio 的功能特性:

自定义 Istio 用于生产之前,请参阅以下资源:

加入 Istio 社区

欢迎您加入 Istio 社区提问和给出反馈。

卸载

要删除 Bookinfo 样例应用及其配置,请参阅 Bookinfo 清理

卸载 Istio 时将删除 RBAC 权限和 istio-system 命名空间下的所有资源层次结构。 可以安全地忽略不存在资源的错误,因为它们可能已经被按层次结构删除了。

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.1.0" | kubectl delete -f -
    
  • 否则:

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

感谢您的反馈!