[zh] sync wildcard-egress-hosts http-proxy (#13874)

Signed-off-by: xin.li <xin.li@daocloud.io>
This commit is contained in:
my-git9 2023-09-18 12:32:52 +08:00 committed by GitHub
parent 2561f406af
commit 31b3a18d2b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 64 additions and 40 deletions

View File

@ -8,19 +8,27 @@ aliases:
owner: istio/wg-networking-maintainers
test: yes
---
[配置 Egress Gateway](/zh/docs/tasks/traffic-management/egress/egress-gateway/) 示例展示如何通过名为 Egress Gateway 的 Istio 组件将流量从网格引导到外部服务。但是,有些情况下需要一个外部的传统(非 IstioHTTPS 代理来访问外部服务。例如,您的公司可能已经有了这样的代理,并且可能需要所有应用程序通过代理来引导其流量。
此示例演示如何启用对外部 HTTPS 代理的访问。由于应用程序使用 HTTP [CONNECT](https://tools.ietf.org/html/rfc7231#section-4.3.6) 方法与 HTTPS 代理建立连接,因此配置流量到外部 HTTPS 代理不同于将流量配置为外部 HTTP 和 HTTPS 服务。
[配置 Egress Gateway](/zh/docs/tasks/traffic-management/egress/egress-gateway/)
示例展示如何通过名为 Egress Gateway 的 Istio 组件将流量从网格引导到外部服务。但是,
有些情况下需要一个外部的传统(非 IstioHTTPS 代理来访问外部服务。例如,您的公司可能已经有了这样的代理,
并且可能需要所有应用程序通过代理来引导其流量。
此示例演示如何启用对外部 HTTPS 代理的访问。由于应用程序使用 HTTP [CONNECT](https://tools.ietf.org/html/rfc7231#section-4.3.6)
方法与 HTTPS 代理建立连接,因此配置流量到外部 HTTPS 代理不同于将流量配置为外部 HTTP 和 HTTPS 服务。
{{< boilerplate before-you-begin-egress >}}
* [启用 Envoy 的访问日志](/zh/docs/tasks/observability/logs/access-log/#enable-envoy-s-access-logging)
## 部署 HTTPS 代理{#deploy-an-https-proxy}
## 部署 HTTPS 代理 {#deploy-an-https-proxy}
本例中为了模拟传统代理,在集群内部署了一个 HTTPS 代理。此外,为了模拟在集群外运行的更真实的代理,通过代理的 IP 地址而不是 Kubernetes 服务的域名来寻址代理的 pod。本例使用的是 [squid](http://www.squid-cache.org),但是您可以使用任何支持 HTTP CONNECT 连接的 HTTPS 代理。
本例中为了模拟传统代理,在集群内部署了一个 HTTPS 代理。此外,为了模拟在集群外运行的更真实的代理,
通过代理的 IP 地址而不是 Kubernetes 服务的域名来寻址代理的 Pod。本例使用的是
[squid](http://www.squid-cache.org),但是您可以使用任何支持 HTTP CONNECT 连接的 HTTPS 代理。
1. 为 HTTPS 代理创建一个命名空间,而不标记为用于 SideCar 注入。如果没有标签,则在新命名空间中 SideCar 注入是不可用的,因此 Istio 将无法控制那里的流量。您需要在集群之外通过这种行为来模拟代理。
1. 为 HTTPS 代理创建一个命名空间,而不打上 Sidecar 注入所用的标签。如果没有此标签,则在新命名空间中
SideCar 注入是被禁用的,因此 Istio 将无法控制这个命名空间的流量。您需要在集群之外通过这种行为来模拟代理。
{{< text bash >}}
$ kubectl create namespace external
@ -44,7 +52,8 @@ test: yes
EOF
{{< /text >}}
1. 创建 Kubernetes [ConfigMap](https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/) 以保存代理的配置:
1. 创建 Kubernetes [ConfigMap](https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/)
以保存代理的配置:
{{< text bash >}}
$ kubectl create configmap proxy-configmap -n external --from-file=squid.conf=./proxy.conf
@ -84,13 +93,14 @@ test: yes
EOF
{{< /text >}}
1. 在 `external` 命名空间中部署 [sleep]({{< github_tree >}}/samples/sleep) 示例,以测试到代理的通信量,而不进行 Istio 流量控制。
1. 在 `external` 命名空间中部署 [sleep]({{< github_tree >}}/samples/sleep) 示例,以测试到代理的通信量,
而不进行 Istio 流量控制。
{{< text bash >}}
$ kubectl apply -n external -f @samples/sleep/sleep.yaml@
{{< /text >}}
1. 获取代理 pod 的 IP 地址并定义 `PROXY_IP` 环境变量来存储它:
1. 获取代理 Pod 的 IP 地址并定义 `PROXY_IP` 环境变量来存储它:
{{< text bash >}}
$ export PROXY_IP=$(kubectl get pod -n external -l app=squid -o jsonpath={.items..podIP})
@ -102,7 +112,7 @@ test: yes
$ export PROXY_PORT=3128
{{< /text >}}
1. 从 `external` 命名空间中的 sleep pod 通过代理向外部服务发送请求:
1. 从 `external` 命名空间中的 sleep Pod 通过代理向外部服务发送请求:
{{< text bash >}}
$ kubectl exec -it $(kubectl get pod -n external -l app=sleep -o jsonpath={.items..metadata.name}) -n external -- sh -c "HTTPS_PROXY=$PROXY_IP:$PROXY_PORT curl https://en.wikipedia.org/wiki/Main_Page" | grep -o "<title>.*</title>"
@ -121,11 +131,12 @@ test: yes
* 您部署了 HTTPS 代理。
* 您使用 curl 通过代理访问 wikipedia.org 外部服务。
下一步,您必须配置 Istio 启用的 pod 的流量到 HTTPS 代理。
下一步,您必须配置 Istio 启用的 Pod 的流量到 HTTPS 代理。
## 配置流量到外部 HTTPS 代理{#configure-traffic-to-external-https-proxy}
## 配置流量到外部 HTTPS 代理 {#configure-traffic-to-external-https-proxy}
1. 为 HTTPS 代理定义 TCP不是 HTTP服务入口。尽管应用程序使用 HTTP CONNECT 方法与 HTTPS 代理建立连接,但必须为 TCP 通信而不是 HTTP 通信配置代理。一旦建立了连接,代理就简单地充当 TCP 隧道。
1. 为 HTTPS 代理定义 TCP不是 HTTP服务入口。尽管应用程序使用 HTTP CONNECT 方法与
HTTPS 代理建立连接,但必须为 TCP 通信而不是 HTTP 通信配置代理。一旦建立了连接,代理就简单地充当 TCP 隧道。
{{< text bash >}}
$ kubectl apply -f - <<EOF
@ -146,14 +157,14 @@ test: yes
EOF
{{< /text >}}
1. 从 `external` 命名空间中的 sleep pod 发送请求。因为 sleep pod 有 Sidecar可以让 Istio 控制其流量。
1. 从 `external` 命名空间中的 sleep Pod 发送请求。因为 sleep Pod 有 Sidecar可以让 Istio 控制其流量。
{{< text bash >}}
$ kubectl exec -it $SOURCE_POD -c sleep -- sh -c "HTTPS_PROXY=$PROXY_IP:$PROXY_PORT curl https://en.wikipedia.org/wiki/Main_Page" | grep -o "<title>.*</title>"
<title>Wikipedia, the free encyclopedia</title>
{{< /text >}}
1. 查看您的请求的 Istio SideCar 代理的日志:
1. 查看您的请求的 Istio Sidecar 代理的日志:
{{< text bash >}}
$ kubectl logs $SOURCE_POD -c istio-proxy
@ -167,16 +178,17 @@ test: yes
1544160065.248 228 172.30.109.89 TCP_TUNNEL/200 87633 CONNECT en.wikipedia.org:443 - HIER_DIRECT/91.198.174.192 -
{{< /text >}}
## 理解原理{#understanding-what-happened}
## 理解原理 {#understanding-what-happened}
在本例中,您采取了以下步骤:
1. 部署了一个 HTTPS 代理来模拟外部代理。
1. 创建了一个 TCP 服务入口,用作引导 Istio 控制的流量 到外部代理。
1. 创建了一个 TCP 服务入口,用来将 Istio 控制的流量引导到外部代理。
请注意,您不能为通过外部代理访问的外部服务创建服务入口,例如 wikipedia.org。这是因为从 Istio 的角度来看请求只发送到外部代理Istio 并不知道外部代理会进一步转发请求。
请注意,您不能为通过外部代理访问的外部服务创建服务入口,例如 wikipedia.org。
这是因为从 Istio 的角度来看请求只发送到外部代理Istio 并不知道外部代理会进一步转发请求。
## 清理{#cleanup}
## 清理 {#cleanup}
1. 关闭 [sleep]({{< github_tree >}}/samples/sleep) 服务:

View File

@ -9,13 +9,18 @@ owner: istio/wg-networking-maintainers
test: yes
---
[控制 Egress 流量](/zh/docs/tasks/traffic-management/egress/)任务和[配置一个 Egress 网关](/zh/docs/tasks/traffic-management/egress/egress-gateway/)示例描述如何配置特定主机的 egress 流量,如:`edition.cnn.com`。本示例描述如何为通用域中的一组特定主机开启 egress 流量,譬如:`*.wikipedia.org`,无需单独配置每一台主机。
[控制 Egress 流量](/zh/docs/tasks/traffic-management/egress/)任务和
[配置一个 Egress 网关](/zh/docs/tasks/traffic-management/egress/egress-gateway/)示例描述如何配置特定主机的
Egress 流量,如:`edition.cnn.com`。本示例描述如何为通用域中的一组特定主机开启 Egress 流量,
譬如 `*.wikipedia.org`,无需单独配置每一台主机。
## 背景{#background}
## 背景 {#background}
假定您想要为 Istio 中所有语种的 `wikipedia.org` 站点开启 egress 流量。每个语种的 `wikipedia.org` 站点均有自己的主机名,譬如:英语和德语对应的主机分别为 `en.wikipedia.org``de.rikipedia.org`。您希望通过通用配置项开启所有 Wikipedia 站点的 egress 流量,无需单独配置每个语种的站点。
假定您想要为 Istio 中所有语种的 `wikipedia.org` 站点开启 Egress 流量。每个语种的
`wikipedia.org` 站点均有自己的主机名,譬如:英语和德语对应的主机分别为 `en.wikipedia.org`
`de.rikipedia.org`。您希望通过通用配置项开启所有 Wikipedia 站点的 Egress 流量,无需单独配置每个语种的站点。
## 开始之前(before-you-begin)
## 开始之前 (before-you-begin)
* 使用 `demo` [配置文件](/zh/docs/setup/additional-setup/config-profiles/)安装 Istio 以及默认阻止出站流量策略:
@ -24,25 +29,28 @@ test: yes
{{< /text >}}
{{< tip >}}
您可以在 `demo` 配置文件以外的 Istio 配置上运行此任务,只要您确保 [部署 Istio egress 网关](/zh/docs/tasks/traffic-management/egress/egress-gateway/#deploy-Istio-egress-gateway)。
您可以在 `demo` 配置文件以外的 Istio 配置上运行此任务,
只要您确保 [部署 Istio Egress 网关](/zh/docs/tasks/traffic-management/egress/egress-gateway/#deploy-Istio-egress-gateway)。
[开启 Envoy 的访问日志](/zh/docs/tasks/observability/logs/access-log/#enable-envoy-s-access-logging)和
[应用默认阻止出站流量策略](/zh/docs/tasks/traffic-management/egress/egress-control/#change-to-the-blocking-by-default-policy)
{{< /tip >}}
* 部署[sleep]({{< github_tree >}}/samples/sleep)示例应用程序,以用作发送请求的测试源。如果您开启了 [自动 sidecar 注入](/zh/docs/setup/additional-setup/sidecar-injection/#automatic-sidecar-injection),运行以下命令以部署示例应用程序:
* 部署 [sleep]({{< github_tree >}}/samples/sleep) 示例应用程序,以用作发送请求的测试源。
如果您开启了 [Sidecar 自动注入](/zh/docs/setup/additional-setup/sidecar-injection/#automatic-sidecar-injection)
运行以下命令以部署示例应用程序:
{{< text bash >}}
$ kubectl apply -f @samples/sleep/sleep.yaml@
{{< /text >}}
否则,在使用以下命令部署 `sleep` 应用程序之前,手动注入 sidecar
否则,在使用以下命令部署 `sleep` 应用程序之前,手动注入 Sidecar
{{< text bash >}}
$ kubectl apply -f <(istioctl kube-inject -f @samples/sleep/sleep.yaml@)
{{< /text >}}
{{< tip >}}
您可以在任意 pod 上使用 `curl` 作为测试源。
您可以在任意 Pod 上使用 `curl` 作为测试源。
{{< /tip >}}
* 将 `SOURCE_POD` 环境变量设置为您的源 Pod 的名称:
@ -51,17 +59,18 @@ test: yes
$ export SOURCE_POD=$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})
{{< /text >}}
## 引导流量流向 Wildcard 主机{#configure-direct-traffic-to-a-wildcard-host}
## 引导流量流向 Wildcard 主机 {#configure-direct-traffic-to-a-wildcard-host}
访问通用域中一组主机的第一个也是最简单的方法,是使用一个 wildcard 主机配置一个简单的 `ServiceEntry`,直接从 sidecar 调用服务。
当直接调用服务时(譬如:不是通过一个 egress 网关),一个 wildcard 主机的配置与任何其他主机(如:全域名主机)没有什么不同,只是当通用域中有许多台主机时,这样比较方便。
访问通用域中一组主机的第一个也是最简单的方法,是使用一个 wildcard 主机配置一个简单的 `ServiceEntry`
直接从 Sidecar 调用服务。当直接调用服务时(譬如:不是通过一个 Egress 网关),一个 wildcard
主机的配置与任何其他主机(如:全域名主机)没有什么不同,只是当通用域中有许多台主机时,这样比较方便。
{{< warning >}}
请注意,恶意应用程序很容易绕过以下配置。为了实现安全的出口流量控制,可以通过出口网关引导流量。
{{< /warning >}}
{{< warning >}}
请注意,`DNS` 解析不能用于通配符主机。这就是为什么`NONE`分辨率(因为它是默认)用于以下服务条目。
请注意,`DNS` 解析不能用于通配符主机。这就是为什么 `NONE` 分辨率(因为它是默认)用于以下服务条目。
{{< /warning >}}
1. 为 `*.wikipedia.org` 定义一个 `ServiceEntry` 以及相应的 `VirtualService`
@ -91,17 +100,19 @@ test: yes
<title>Wikipedia Die freie Enzyklopädie</title>
{{< /text >}}
### 清除引导流量至 wildcard 主机{#cleanup-direct-traffic-to-a-wildcard-host}
### 清除引导流量至 wildcard 主机 {#cleanup-direct-traffic-to-a-wildcard-host}
{{< text bash >}}
$ kubectl delete serviceentry wikipedia
{{< /text >}}
### 单一 hosting 服务器的 Wildcard 配置{#wildcard-configuration-for-a-single-hosting-server}
### 单一 hosting 服务器的 Wildcard 配置 {#wildcard-configuration-for-a-single-hosting-server}
当一台唯一的服务器为所有 wildcard 主机提供服务时,基于 egress 网关访问 wildcard 主机的配置与普通主机类似除了配置的路由目标不能与配置的主机相同wildcard 主机,需要配置为通用域集合的唯一服务器主机。
当一台唯一的服务器为所有 wildcard 主机提供服务时,基于 Egress 网关访问 wildcard 主机的配置与普通主机类似,
除了配置的路由目标不能与配置的主机相同wildcard 主机,需要配置为通用域集合的唯一服务器主机。
1. 为 _*.wikipedia.org_ 创建一个 egress `Gateway`、一个目标规则以及一个虚拟服务,来引导请求通过 egress 网关并从 egress 网关访问外部服务。
1. 为 `*.wikipedia.org` 创建一个 Egress `Gateway`、一个目标规则以及一个虚拟服务,来
引导请求通过 Egress 网关并从 Egress 网关访问外部服务。
{{< text bash >}}
$ kubectl apply -f - <<EOF
@ -170,7 +181,7 @@ $ kubectl delete serviceentry wikipedia
EOF
{{< /text >}}
1. 为目标服务器 _www.wikipedia.org_ 创建一个 `ServiceEntry`
1. 为目标服务器 `www.wikipedia.org` 创建一个 `ServiceEntry`
{{< text bash >}}
$ kubectl apply -f - <<EOF
@ -198,14 +209,15 @@ $ kubectl delete serviceentry wikipedia
<title>Wikipedia Die freie Enzyklopädie</title>
{{< /text >}}
1. 检查 egress 网关代理访问 _*.wikipedia.org_ 的计数器统计值。如果 Istio 部署在 `istio-system` 命名空间中,打印输出计数器的命令为:
1. 检查 Egress 网关代理访问 `*.wikipedia.org` 的计数器统计值。如果 Istio
部署在 `istio-system` 命名空间中,打印输出计数器的命令为:
{{< text bash >}}
$ 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:'
outbound|443||www.wikipedia.org::208.80.154.224:443::cx_total::2
{{< /text >}}
#### 清除单点服务器的 wildcard 配置{#cleanup-wildcard-configuration-for-a-single-hosting-server}
#### 清除单点服务器的 wildcard 配置 {#cleanup-wildcard-configuration-for-a-single-hosting-server}
{{< text bash >}}
$ kubectl delete serviceentry www-wikipedia
@ -214,15 +226,15 @@ $ kubectl delete virtualservice direct-wikipedia-through-egress-gateway
$ kubectl delete destinationrule egressgateway-for-wikipedia
{{< /text >}}
## 清除{#cleanup}
## 清除 {#cleanup}
* 关闭服务 [sleep]({{< github_tree >}}/samples/sleep)
* 关闭 [sleep]({{< github_tree >}}/samples/sleep) 服务
{{< text bash >}}
$ kubectl delete -f @samples/sleep/sleep.yaml@
{{< /text >}}
* 从您的集群中卸载 Istio:
* 从您的集群中卸载 Istio
{{< text bash >}}
$ istioctl uninstall --purge -y