控制 Egress TCP 流量

控制Egress流量告诉我们可以从服务网格内部应用访问外部(指在Kubernetes外的服务)的 HTTP 和 HTTPS 服务。默认情况下,支持 istio 的应用程序无法直接访问集群外部的 URL 。要启用这种访问,必须先定义 Egress 规则或者配置直接调用外部服务规则。

此任务描述如何配置 Istio 内应用如何访问 Istio 外部的应用。

开始之前

  • 遵循安装指南设置Istio
  • 启动sleep示例,用于测试外部访问。
    1. kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml)
    注意: 所有可以在容器中执行execcurl的 pod 都是可以用于本任务的。

为外部TCP服务设置路由规则

在这个任务中,我们将通过由应用发起 HTTPS 请求访问 wikipedia.org 。这个任务将演示应用无法使用 HTTP 与 HTTPS 协议访问外部服务的用例。控制 Egress 流量中描述了访问 HTTP 与 HTTPS 协议的外部应用,在控制 Egress 流量任务中,https://www.google.com通过使用http://www.google.com:443来进行访问。

由应用发起的 HTTPS 流量将被视为不透明的 TCP 。为了启用这种流量,我们在端口443上定义一个 TCP Egress 规则。

在 TCP Egress 规则中,与基于 HTTP Egress 规则相反,目标服务地址由 IP 或者 IP 地址块(遵循CIDR notation)指定.

假设通过域名wikipedia.org访问该实例。这意味我们必须指定 wikipedia.org 对应的所有 IP 的 TCP Egress 规则。幸运的是, wikipedia.org的所有 IP 地址在这里发布。它是遵循CIDR notation的一个 IP 列表: 91.198.174.192/27, 103.102.166.224/27 ...,我们必须为每个IP块定义一个 TCP Egress 规则。
或者, 如果通过 IP 访问 wikipedia.org 的话, 则必须定义该 IP 的 Tcp Egress 规则。

创建出口规则

让我们创建出口规则来启用 TCP 访问 wikipedia.org

  1. cat <<EOF | istioctl create -f -
  2. kind: EgressRule
  3. metadata:
  4. name: wikipedia-range1
  5. spec:
  6. destination:
  7. service: 91.198.174.192/27
  8. ports:
  9. - port: 443
  10. protocol: tcp
  11. ---
  12. kind: EgressRule
  13. metadata:
  14. name: wikipedia-range2
  15. spec:
  16. destination:
  17. service: 103.102.166.224/27
  18. ports:
  19. - port: 443
  20. protocol: tcp
  21. ---
  22. kind: EgressRule
  23. metadata:
  24. name: wikipedia-range3
  25. spec:
  26. destination:
  27. service: 198.35.26.96/27
  28. ports:
  29. - port: 443
  30. protocol: tcp
  31. ---
  32. kind: EgressRule
  33. metadata:
  34. name: wikipedia-range4
  35. spec:
  36. destination:
  37. service: 208.80.153.224/27
  38. ports:
  39. - port: 443
  40. protocol: tcp
  41. ---
  42. kind: EgressRule
  43. metadata:
  44. name: wikipedia-range5
  45. spec:
  46. destination:
  47. service: 208.80.154.224/27
  48. ports:
  49. - port: 443
  50. protocol: tcp
  51. EOF

这个命令将创建五个 TCP Egress 规则,wikipedia.org每个不同的 IP 地址块都有一个规则。请注意---(三个破折号)是 Egress 规则之间的分隔符。这是流中文档之间的YAML分隔符。它允许我们使用单个 istioctl 命令创建多个配置工件。

通过HTTPS访问wikipedia.org

  1. kubectl exec进入 pod 并执行测试代码。如果您正在使用 sleep 应用程序,请运行以下命令:
    1. kubectl exec -it $(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name}) -c sleep bash
  2. 发起请求并确认我们可以成功访问 https://www.wikipedia.org

    1. curl -o /dev/null -s -w "%{http_code}\n" https://www.wikipedia.org
    2. 200

    我们应该看到200打印输出,这是正确返回的 HTTP Code 。

  3. 现在让我们获取英文维基百科上拥有文章的当前数量:

    1. curl -s https://en.wikipedia.org/wiki/Main_Page | grep articlecount | grep 'Special:Statistics'

    输出应该类似于:

    1. <div id="articlecount" style="font-size:85%;"><a href="/wiki/Special:Statistics" title="Special:Statistics">5,563,121</a> articles in <a href="/wiki/English_language" title="English language">English</a></div>

    这意味着在撰写此任务时,英文维基百科中有 5,563,121 篇文章。

清理

  1. 删除我们创建的 Egress 规则。
    1. istioctl delete egressrule wikipedia-range1 wikipedia-range2 wikipedia-range3 wikipedia-range4 wikipedia-range5 -n default
  2. 关闭 sleep 应用程序。
    1. kubectl delete -f samples/sleep/sleep.yaml

下一步是什么