配置 Istio Ingress Gateway

到目前为止,您可以通过 Kubernetes Ingress 在外部去访问您的应用。在本模块, 您可以通过 Istio Ingress Gateway 配置流量,以便在微服务中通过使用 Istio 控制流量。

  1. 在环境变量中存储命名空间 NAMESPACE。您需要通过它在日志中辨别您的微服务。

    1. $ export NAMESPACE=$(kubectl config view -o jsonpath="{.contexts[?(@.name == \"$(kubectl config current-context)\")].context.namespace}")
    2. $ echo $NAMESPACE
    3. tutorial
  2. 为 Istio Ingress Gateway 的主机名创建一个环境变量。

    1. $ export MY_INGRESS_GATEWAY_HOST=istio.$NAMESPACE.bookinfo.com
    2. $ echo $MY_INGRESS_GATEWAY_HOST
    3. istio.tutorial.bookinfo.com
  3. 配置 Istio Ingress Gateway:

    1. $ kubectl apply -f - <<EOF
    2. apiVersion: networking.istio.io/v1
    3. kind: Gateway
    4. metadata:
    5. name: bookinfo-gateway
    6. spec:
    7. selector:
    8. istio: ingressgateway # use Istio default gateway implementation
    9. servers:
    10. - port:
    11. number: 80
    12. name: http
    13. protocol: HTTP
    14. hosts:
    15. - $MY_INGRESS_GATEWAY_HOST
    16. ---
    17. apiVersion: networking.istio.io/v1
    18. kind: VirtualService
    19. metadata:
    20. name: bookinfo
    21. spec:
    22. hosts:
    23. - $MY_INGRESS_GATEWAY_HOST
    24. gateways:
    25. - bookinfo-gateway.$NAMESPACE.svc.cluster.local
    26. http:
    27. - match:
    28. - uri:
    29. exact: /productpage
    30. - uri:
    31. exact: /login
    32. - uri:
    33. exact: /logout
    34. - uri:
    35. prefix: /static
    36. route:
    37. - destination:
    38. host: productpage
    39. port:
    40. number: 9080
    41. EOF
  4. 确定 Ingress IP 和 Port 部分可以使用指令设置 INGRESS_HOSTINGRESS_PORT

  5. 将该命令的输出添加到您的 /etc/hosts 文件中。

    1. $ echo $INGRESS_HOST $MY_INGRESS_GATEWAY_HOST
  6. 从命令行访问应用的首页:

    1. $ curl -s $MY_INGRESS_GATEWAY_HOST:$INGRESS_PORT/productpage | grep -o "<title>.*</title>"
    2. <title>Simple Bookstore App</title>
  7. 将以下命令的输出粘贴在浏览器地址栏中:

    1. $ echo http://$MY_INGRESS_GATEWAY_HOST:$INGRESS_PORT/productpage
  8. 在一个新的终端窗口设置一个无限循环来模拟现实世界的用户流量去访问应用。

    1. $ while :; do curl -s <output of the previous command> | grep -o "<title>.*</title>"; sleep 1; done
    2. <title>Simple Bookstore App</title>
    3. <title>Simple Bookstore App</title>
    4. <title>Simple Bookstore App</title>
    5. <title>Simple Bookstore App</title>
    6. ...
  9. 在 Kiali 控制台 my-kiali.io/kiali/console 通过 Graph 检查您的命名空间。(这个 my-kiali.io URL 设置在您之前配置/etc/hosts 文件中)。

    在这,您可以看到有两个来源的流量,一个是 unknown(Kubernetes Ingress), 一个是 istio-ingressgateway istio-system(Istio Ingress Gateway)。

    Kiali Graph Tab with Istio Ingress Gateway
    Kiali Graph Tab with Istio Ingress Gateway
  10. 此时您可以停止发送 Kubernetes Ingress 请求,只使用Istio Ingress Gateway。 停止您之前设置的无限循环(在终端窗口使用 Ctrl-C)。在真实的生产环境中, 您需要更新应用的 DNS 条目,使其包含 Istio ingress gateway 的 IP, 或者配置您的外部负载均衡器。

  11. 删除Kubernetes Ingress 资源:

    1. $ kubectl delete ingress bookinfo
    2. ingress.extensions "bookinfo" deleted
  12. 在一个新的终端窗口,按照前面的步骤,重启模拟真实世界的用户流量。

  13. 在 Kiali 控制台检查您的 Graph。Istio Ingress Gateway 是您应用的唯一流量来源。

    Kiali Graph Tab with Istio Ingress Gateway as a single source of traffic
    Kiali Graph Tab with Istio Ingress Gateway as a single source of traffic

您已经准备好去配置 Istio 日志.