本操作指南将向你展示如何配置 TSB 中的非 HTTP 服务器。阅读本文档后,你应该熟悉在 IngressGateway
和 Tier1Gateway
API 中使用 TCP 部分的方法。
概要
工作流程与配置 IngressGateway
和 Tier1Gateway
中的 HTTP 服务器完全相同。但是,非 HTTP 支持多端口服务。
在开始之前,请确保你已经:
设置
- 安装了 TSB 的四个集群 - 管理平面、Tier-1 和 Tier-2 边缘集群。
- 在 Tier-2 集群中,在
echo
命名空间部署了 Tier-2 网关。 - 在 Tier-1 集群中,在
tier1
命名空间部署了 Tier-1 网关。 - 在两个网关中,端口
8080
和9999
应可用(为简单起见,我们认为服务和目标端口相同)。要安装网关,请参阅此处。 - 在 Tier-2 集群中部署与 HTTP 和非 HTTP 流量配合使用的应用程序。在此演示中,你将部署 Istio 示例目录中的应用程序到 echo 命名空间中。
- 确保你具有部署网关配置所需的权限。
TSB 配置
配置工作区和组
首先创建工作区。在这里,我们假设集群已作为 cluster-0
、cluster-1
、cluster-2
和 cluster-3
载入。还假设 cluster-3
是 Tier-1,cluster-0
安装了 TSB 管理平面。
apiVersion: api.tsb.tetrate.io/v2
kind: Workspace
metadata:
name: tcp-http-demo
organization: tetrateio
tenant: tetrate
spec:
namespaceSelector:
names:
- "cluster-1/echo"
- "cluster-2/echo"
- "cluster-3/tier1"
为 Tier-1 和 Tier-2 网关分别配置不同的组。
apiVersion: gateway.tsb.tetrate.io/v2
kind: Group
metadata:
name: tcp-http-test-t2-group
organization: tetrateio
tenant: tetrate
workspace: tcp-http-demo
spec:
namespaceSelector:
names:
- "cluster-1/echo"
- "cluster-2/echo"
---
apiVersion: gateway.tsb.tetrate.io/v2
kind: Group
metadata:
name: tcp-http-test-t1-group
organization: tetrateio
tenant: tetrate
workspace: tcp-http-demo
spec:
configMode: BRIDGED
namespaceSelector:
names:
- "cluster-3/tier1"
为网关提供证书和密钥
你必须在部署网关工作负载所在的命名空间中创建两个密钥。
hello-tlscred
用于 Helloworld 应用程序echo-tlscred
用于 TCP-echo 应用程序
你可以使用工具如 openssl
为证书提供密钥并创建密钥,如下所示。
# 为 helloworld 应用程序创建密钥。这里证书和密钥被提供在 helloworld.crt 和 helloworld.key 中
kubectl --context=<kube-cluster-context> -n <gateway-ns> create secret tls hello-tlscred \
--cert=helloworld.crt --key=helloworld.key
# 为 tcp-echo 应用程序创建密钥
kubectl --context=<kube-cluster-context> -n <gateway-ns> create secret tls echo-tlscred \
--cert=echo.crt --key=echo.key
配置 Tier-2 集群中的 Ingress Gateway
一些注意事项:
- 针对端口 8080 的配置需要 TLS,主机名必须不同。否则,将会出错。
- 凭据存储为命名空间中运行网关工作负载的秘密。在 Tier-2 中,它是
echo
命名空间,在 Tier-1 中是tier1
命名空间。
apiVersion: gateway.tsb.tetrate.io/v2
kind: IngressGateway
metadata:
name: tcp-http-t2-gateway
organization: tetrateio
tenant: tetrate
workspace: tcp-http-demo
group: tcp-http-test-t2-group
spec:
workloadSelector:
namespace: echo
labels:
app: tsb-gateway-echo
http:
- name: http-hello
port: 8080
hostname: hello.tetrate.io
tls:
mode: SIMPLE
secretName: hello-tlscred
routing:
rules:
- route:
host: echo/helloworld.echo.svc.cluster.local
port: 5000
tcp:
# echo.tetrate.io:8080 接收非 HTTP 流量。还有 hello.tetrate.io:8080 接收此端口上的 HTTP 流量。
# 为了区分两个服务,你需要具有不同的主机名和 TLS,以便客户端可以使用不同的 SNI 来区分它们。这是“多协议”/“多流量类型”的一部分。
- name: tcp-echo
port: 8080 # 与前一个 HTTP 服务器相同的端口,但主机名不同。
hostname: echo.tetrate.io
tls:
mode: SIMPLE
secretName: echo-tlscred
route:
host: echo/tcp-echo.echo.svc.cluster.local
port: 9000
# 已经定义了一个名为 echo.tetrate.io 的服务,端口为 8080。还可以有另一个 TCP 服务,使用相同的主机名但在不同端口上。这是“多端口”部分。
- name: tcp-echo-2
port: 9999
hostname: echo.tetrate.io
route:
host: echo/tcp-echo.echo.svc.cluster.local
port: 9001
配置 Tier-1 网关
此处定义的主机:端口应与 IngressGateway
中定义的主机:端口完全匹配,流量类型也应与在 IngressGateway
中定义的流量类型完全匹配。
apiVersion: gateway.tsb.tetrate.io/v2
kind: Tier1Gateway
metadata:
name: tcp-http-t1-gateway
organization: tetrateio
tenant: tetrate
workspace: tcp-http-demo
group: tcp-http-test-t1-group
spec:
workloadSelector:
namespace: tier1
labels:
app: tsb-gateway-tier1
externalServers:
# 这与 Tier-2 网关配置中定义的 hello.tetrate.io:8080 相匹配
# 注意:配置之间的名称不需要相同,但主机名必须匹配。
- name: http-hello
hostname: hello.tetrate.io
port: 8080
tls:
mode: SIMPLE
secretName: hello-tlscred
tcpExternalServers:
# 这与 echo.tetrate.io:8080 相匹配。配置之间的名称不需要相同,但主机名必须匹配。
- name: tcp-echo
hostname: echo.tetrate.io
port: 8080
tls:
mode: SIMPLE
secretName: echo-tlscred
# 这与 Tier-2 配置中的 echo.tetrate.io:9999 相匹配。
- name: tcp-echo-2
hostname: echo.tetrate.io
port: 9999
集群之间的流量路由
南北流量(从 Tier-1 到 Tier-2 集群)
首先,找到 Tier-1 网关的外部 IP 地址,并将其保存在 TIER1_IP
变量中。
$ export TIER1_IP=<tier1-gateway-ip>
路由 HTTPS 流量
$ curl -svk --resolve hello.tetrate.io:8080:$TIER1_IP https://hello.tetrate.io:8080/hello
注意:除非用于测试目的,否则不要使用 -k
标志。它会跳过服务器证书验证,不安全。
路由非 HTTP 流量
- TLS 流量 - 可能会出现与服务器证书相关的一些警告。由于这是演示,可以忽略它们。
$ openssl s_client -connect $TIER1_IP:8080 -servername echo.tetrate.io
- 普通 TCP 流量
$ echo hello | nc -v $TIER1_IP 9999
东西流量(在 Tier-2 集群之间)
在路由东西流量时,将使用在 hostname
字段中定义的 DNS 名称。从你希望发送流量的已注入 Istio sidecar 的 pod 中执行 nc
来进行非 HTTP(但是 TCP)流量的路由。此处不需要在此处启动 TLS,因为 TLS 发起是由 sidecar 执行的。
kubectl -n echo exec -it <pod-name> -c app -- sh -c "echo hello | nc -v echo.tetrate.io 8080"
kubectl -n echo exec -it <pod-name> -c app -- sh -c "echo hello | nc -v echo.tetrate.io 9999"
kubectl -n echo exec -it <pod-name> -c app -- curl -sv hello.tetrate.io:8080