Wildcard 主机的 egress

    假定您想要为 Istio 中所有语种的 wikipedia.org 站点开启 egress 流量。每个语种的 wikipedia.org 站点均有自己的主机名,譬如:英语和德语对应的主机分别为 en.wikipedia.orgde.rikipedia.org。您希望通过通用配置项开启所有 Wikipedia 站点的 egress 流量,无需单独配置每个语种的站点。

    • 使用 demo 配置文件安装 Istio 以及默认阻止出站流量策略:

      您可以在 demo 配置文件以外的 Istio 配置上运行此任务,只要您确保 。 开启 Envoy 的访问日志和 在您的安装步骤中。您还需要使用自己的 IstioOperator CR 代替使用SNI代理设置出口网关中显示。

    • 部署示例应用程序,以用作发送请求的测试源。如果您开启了 自动 sidecar 注入,运行以下命令以部署示例应用程序:

      1. $ kubectl apply -f @samples/sleep/sleep.yaml@

      否则,在使用以下命令部署 sleep 应用程序之前,手动注入 sidecar:

      1. $ kubectl apply -f <(istioctl kube-inject -f @samples/sleep/sleep.yaml@)

      您可以在任意 pod 上使用 curl 作为测试源。

    • SOURCE_POD 环境变量设置为您的源 Pod 的名称:

      1. $ export SOURCE_POD=$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})

    访问通用域中一组主机的第一个也是最简单的方法,是使用一个 wildcard 主机配置一个简单的 ServiceEntry,直接从 sidecar 调用服务。 当直接调用服务时(譬如:不是通过一个 egress 网关),一个 wildcard 主机的配置与任何其他主机(如:全域名主机)没有什么不同,只是当通用域中有许多台主机时,这样比较方便。

    请注意,恶意应用程序很容易绕过以下配置。为了实现安全的出口流量控制,可以通过出口网关引导流量。

    请注意,DNS 解析不能用于通配符主机。这就是为什么NONE分辨率(因为它是默认)用于以下服务条目。

    1. *.wikipedia.org 定义一个 ServiceEntry 以及相应的 VirtualSevice

      1. $ kubectl exec -it $SOURCE_POD -c sleep -- sh -c 'curl -s https://en.wikipedia.org/wiki/Main_Page | grep -o "<title>.*</title>"; curl -s https://de.wikipedia.org/wiki/Wikipedia:Hauptseite | grep -o "<title>.*</title>"'
      2. <title>Wikipedia, the free encyclopedia</title>
      3. <title>Wikipedia Die freie Enzyklopädie</title>
    1. $ kubectl delete serviceentry wikipedia

    单一 hosting 服务器的 Wildcard 配置

    当一台唯一的服务器为所有 wildcard 主机提供服务时,基于 egress 网关访问 wildcard 主机的配置与普通主机类似,除了:配置的路由目标不能与配置的主机相同,如:wildcard 主机,需要配置为通用域集合的唯一服务器主机。

    1. \.wikipedia.org* 创建一个 egress Gateway、一个目标规则以及一个虚拟服务,来引导请求通过 egress 网关并从 egress 网关访问外部服务。

      1. $ kubectl apply -f - <<EOF
      2. apiVersion: networking.istio.io/v1alpha3
      3. kind: Gateway
      4. metadata:
      5. name: istio-egressgateway
      6. spec:
      7. selector:
      8. istio: egressgateway
      9. - port:
      10. number: 443
      11. name: https
      12. hosts:
      13. - "*.wikipedia.org"
      14. tls:
      15. mode: PASSTHROUGH
      16. ---
      17. apiVersion: networking.istio.io/v1alpha3
      18. kind: DestinationRule
      19. metadata:
      20. name: egressgateway-for-wikipedia
      21. spec:
      22. host: istio-egressgateway.istio-system.svc.cluster.local
      23. subsets:
      24. - name: wikipedia
      25. ---
      26. apiVersion: networking.istio.io/v1alpha3
      27. kind: VirtualService
      28. metadata:
      29. name: direct-wikipedia-through-egress-gateway
      30. spec:
      31. hosts:
      32. - "*.wikipedia.org"
      33. gateways:
      34. - mesh
      35. - istio-egressgateway
      36. tls:
      37. - match:
      38. - gateways:
      39. - mesh
      40. port: 443
      41. - "*.wikipedia.org"
      42. route:
      43. host: istio-egressgateway.istio-system.svc.cluster.local
      44. subset: wikipedia
      45. port:
      46. number: 443
      47. weight: 100
      48. - match:
      49. - gateways:
      50. - istio-egressgateway
      51. port: 443
      52. sniHosts:
      53. - "*.wikipedia.org"
      54. route:
      55. - destination:
      56. host: www.wikipedia.org
      57. port:
      58. number: 443
      59. weight: 100
      60. EOF
    2. 为目标服务器 创建一个 ServiceEntry

    3. 发送请求至 https://en.wikipedia.org 和 :

      1. $ kubectl exec -it $SOURCE_POD -c sleep -- sh -c 'curl -s https://en.wikipedia.org/wiki/Main_Page | grep -o "<title>.*</title>"; curl -s https://de.wikipedia.org/wiki/Wikipedia:Hauptseite | grep -o "<title>.*</title>"'
      2. <title>Wikipedia, the free encyclopedia</title>
      3. <title>Wikipedia Die freie Enzyklopädie</title>
    4. 检查 egress 网关代理访问 \.wikipedia.org* 的计数器统计值。如果 Istio 部署在 istio-system 命名空间中,打印输出计数器的命令为:

      1. $ kubectl exec -it $(kubectl get pod -l istio=egressgateway -n istio-system -o jsonpath='{.items[0].metadata.name}') -c istio-proxy -n istio-system -- pilot-agent request GET clusters | grep '^outbound|443||www.wikipedia.org.*cx_total:'
      2. outbound|443||www.wikipedia.org::208.80.154.224:443::cx_total::2

    清除单点服务器的 wildcard 配置

    1. $ kubectl delete serviceentry www-wikipedia
    2. $ kubectl delete gateway istio-egressgateway
    3. $ kubectl delete virtualservice direct-wikipedia-through-egress-gateway
    4. $ kubectl delete destinationrule egressgateway-for-wikipedia