流量管理 - 控制 Egress TCP 流量
如控制Egress流量告诉我们可以从服务网格内部应用访问外部(指在Kubernetes外的服务)的 HTTP 和 HTTPS 服务。默认情况下,支持 istio 的应用程序无法直接访问集群外部的 URL 。要启用这种访问,必须先定义 Egress 规则或者配置直接调用外部服务规则。
此任务描述如何配置 Istio 内应用如何访问 Istio 外部的应用。
开始之前
- 遵循安装指南设置Istio
- 启动sleep示例,用于测试外部访问。
注意: 所有可以在容器中执行kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml)
exec
和curl
的 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
:
cat <<EOF | istioctl create -f -
kind: EgressRule
metadata:
name: wikipedia-range1
spec:
destination:
service: 91.198.174.192/27
ports:
- port: 443
protocol: tcp
---
kind: EgressRule
metadata:
name: wikipedia-range2
spec:
destination:
service: 103.102.166.224/27
ports:
- port: 443
protocol: tcp
---
kind: EgressRule
metadata:
name: wikipedia-range3
spec:
destination:
service: 198.35.26.96/27
ports:
- port: 443
protocol: tcp
---
kind: EgressRule
metadata:
name: wikipedia-range4
spec:
destination:
service: 208.80.153.224/27
ports:
- port: 443
protocol: tcp
---
kind: EgressRule
metadata:
name: wikipedia-range5
spec:
destination:
service: 208.80.154.224/27
ports:
- port: 443
protocol: tcp
EOF
这个命令将创建五个 TCP Egress 规则,wikipedia.org
每个不同的 IP 地址块都有一个规则。请注意---
(三个破折号)是 Egress 规则之间的分隔符。这是流中文档之间的YAML分隔符。它允许我们使用单个 istioctl 命令创建多个配置工件。
通过HTTPS访问wikipedia.org
kubectl exec
进入 pod 并执行测试代码。如果您正在使用 sleep 应用程序,请运行以下命令:kubectl exec -it $(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name}) -c sleep bash
发起请求并确认我们可以成功访问
https://www.wikipedia.org
:curl -o /dev/null -s -w "%{http_code}n" https://www.wikipedia.org
200
我们应该看到200打印输出,这是正确返回的 HTTP Code 。
现在让我们获取英文维基百科上拥有文章的当前数量:
curl -s https://en.wikipedia.org/wiki/Main_Page | grep articlecount | grep 'Special:Statistics'
输出应该类似于:
<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 篇文章。
清理
- 删除我们创建的 Egress 规则。
istioctl delete egressrule wikipedia-range1 wikipedia-range2 wikipedia-range3 wikipedia-range4 wikipedia-range5 -n default
- 关闭 sleep 应用程序。
kubectl delete -f samples/sleep/sleep.yaml
下一步是什幺
- 该 Egress 规则配置的参考。
- 该控制 Egress 流量流量的任务, HTTP 和 HTTPS 。