3.2. 使用 Istio API 通过网关直接出口流量
使用 Istio API 通过使用网关注入安装的网关直接出站 HTTP 流量。
先决条件
- 您已使用网关注入安装网关。
流程
运行以下命令,创建一个名为
curl
的命名空间:oc create namespace curl
$ oc create namespace curl
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据您使用的更新策略,运行适当的命令在命名空间中启用 sidecar 注入:
如果您使用
InPlace
更新策略,请运行以下命令:oc label namespace curl istio-injection=enabled
$ oc label namespace curl istio-injection=enabled
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果使用
RevisionBased
update 策略,请运行以下命令:运行以下命令来显示修订名称:
oc get istiorevisions.sailoperator.io
$ oc get istiorevisions.sailoperator.io
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME TYPE READY STATUS IN USE VERSION AGE default Local True Healthy True v1.24.3 3m33s
NAME TYPE READY STATUS IN USE VERSION AGE default Local True Healthy True v1.24.3 3m33s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,使用修订名称标记命名空间以启用 sidecar 注入:
oc label namespace curl istio.io/rev=default
$ oc label namespace curl istio.io/rev=default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
运行以下命令来部署
curl
应用程序:oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yaml
$ oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 导出使用 curl pod 初始化的
CURL_POD
环境变量:export CURL_POD=$(oc get pod -n curl -l app=curl -o jsonpath='{.items[0].metadata.name}')
$ export CURL_POD=$(oc get pod -n curl -l app=curl -o jsonpath='{.items[0].metadata.name}')
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建名为
http-se.yaml
的 YAML 文件,该文件将来自网格的流量定向到外部服务。以下示例定义了 URL 的ServiceEntry
。配置示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来应用 YAML 文件:
oc apply -f http-se.yaml
$ oc apply -f http-se.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保正确应用
ServiceEntry
配置。运行以下命令,向您在上一步中指定的主机发送 HTTP 请求:oc exec "$CURL_POD" -n curl -c curl -- curl -sSL -o /dev/null -D - http://docs.redhat.com
$ oc exec "$CURL_POD" -n curl -c curl -- curl -sSL -o /dev/null -D - http://docs.redhat.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令应该返回 HTTP 状态代码,如
301
(redirect)或200
(success),表示连接正常工作。创建名为
http-gtw.yaml
的 YAML 文件,该文件会创建一个出口网关,并将流量从网格路由到为外部服务指定的主机。配置示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来应用 YAML 文件:
oc apply -f http-gtw.yaml
$ oc apply -f http-gtw.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个名为
http-vs.yaml
的 YAML 文件,它设置一个VirtualService
,以通过出口网关到外部主机从应用程序 sidecar 的流量流。配置示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来应用 YAML 文件:
oc apply -f http-vs.yaml
$ oc apply -f http-vs.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 HTTP 请求重新发送到 URL:
oc exec "$CURL_POD" -n curl -c curl -- curl -sSL -o /dev/null -D - http://docs.redhat.com
$ oc exec "$CURL_POD" -n curl -c curl -- curl -sSL -o /dev/null -D - http://docs.redhat.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 终端应该显示类似以下输出的信息:
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,确保请求通过网关路由:
oc logs deployment/<gateway_name> -n <gateway_namespace> | tail -1
$ oc logs deployment/<gateway_name> -n <gateway_namespace> | tail -1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意必须启用访问日志记录才能使此验证步骤正常工作。您可以通过将 Istio 资源中的
spec.values.meshConfig.accessLogFile
字段设置为/dev/stdout
来启用对标准输出的访问日志。终端应该显示类似以下输出的信息:
输出示例
[2024-11-07T14:35:52.428Z] "GET / HTTP/2" 301 - via_upstream - "-" 0 0 24 24 "10.128.2.30" "curl/8.11.0" "79551af2-341b-456d-b414-9220b487a03b" "docs.redhat.com" "23.55.176.201:80" outbound|80||docs.redhat.com 10.128.2.29:49766 10.128.2.29:80 10.128.2.30:38296 -
[2024-11-07T14:35:52.428Z] "GET / HTTP/2" 301 - via_upstream - "-" 0 0 24 24 "10.128.2.30" "curl/8.11.0" "79551af2-341b-456d-b414-9220b487a03b" "docs.redhat.com" "23.55.176.201:80" outbound|80||docs.redhat.com 10.128.2.29:49766 10.128.2.29:80 10.128.2.30:38296 -
Copy to Clipboard Copied! Toggle word wrap Toggle overflow