您可以使用ASM四层路由能力对TCP流量通过路由规则匹配进行路由。本文介绍ASM支持的所有TCP匹配规则和路由能力。
前提条件
部署示例应用
您可以通过部署示例应用并结合示例提供的VirtualService测试ASM的4层负载均衡能力。为了测试L4负载均衡,您可以按照以下步骤在数据面集群内部署echo-server和telnet-client两个应用。
匹配规则
destinationSubnets
通过配置tcp.match[n].destinationSubnets
属性可以为路由匹配目标网段,流量的目标网段与配置成功匹配将使用该路由规则进行路由。
支持情况
AmbientMode:不支持
SidecarMode:支持
部署示例资源
以下示例YAML匹配目标网段192.168.0.0/16
,将去往该网段的TCP流量转发至echo-server-2.default.svc.cluster.local
服务。您可以通过命令行或控制台的方式部署示例资源。下文以命令行方式为例进行说明。关于控制台的操作,请参见管理虚拟服务。
使用以下内容,创建destinationSubnets.yaml文件。
示例中
echo-server.default.svc.cluster.local
服务的地址在192.168.0.0/16
网段下,请您根据实际情况进行修改。apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: echo namespace: default spec: hosts: - echo-server.default.svc.cluster.local tcp: - match: - destinationSubnets: - "192.168.0.0/16" route: - destination: host: echo-server-2.default.svc.cluster.local
在ASM实例对应的KubeConfig环境下,执行以下命令,部署VirtualService。
kubectl apply -f destinationSubnets.yaml
执行以下命令,通过telnet-client Pod发起测试,输入
test
,向echo-server.default.svc.cluster.local 19000
发起连接并传输数据。kubectl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test
收到echo-server-2返回的
hello2 test
响应,说明流量命中了VirtualService中声明的匹配19000端口的规则,符合预期。
port
通过配置tcp.match[n].port
属性可以为路由匹配目标端口。若流量的目标端口与配置的端口匹配成功,将使用该路由规则进行路由。
支持情况
AmbientMode:不支持
SidecarMode:支持
部署示例资源
以下示例YAML匹配目标端口19000,将发往该端口的TCP流量转发至echo-server-2.default.svc.cluster.local
服务。您可以通过命令行或控制台的方式部署示例资源。下文以命令行方式为例进行说明。关于控制台的操作,请参见管理虚拟服务。
使用以下内容,创建port.yaml文件。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: echo namespace: default spec: hosts: - echo-server.default.svc.cluster.local tcp: - match: - port: 19000 route: - destination: host: echo-server-2.default.svc.cluster.local
在ASM实例对应的KubeConfig环境下,执行以下命令,部署VirtualService。
kubectl apply -f port.yaml
执行以下命令,通过telnet-client Pod发起测试,输入
test
,向echo-server.default.svc.cluster.local 19000
发起连接并传输数据。kubectl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test
收到echo-server-2返回的
hello2 test
响应,说明流量命中了VirtualService中声明的匹配19000端口的规则,符合预期。
sourceLabels
通过配置tcp.match[n].sourceLabels
属性,可以匹配从特定工作负载发出的请求。
支持情况
AmbientMode:不支持
SidecarMode:支持
部署示例资源
以下示例YAML匹配从携带标签app: telnet-client
的工作负载发出的请求。在示例应用中,telnet-client携带app: telnet-client
标签,但telnet-client-2携带app: telnet-client-2
标签,因此以下VirtualService将匹配来自telnet-client的TCP流量,但无法匹配来自telnet-client-2的TCP流量。您可以通过命令行或控制台的方式部署示例资源。下文以命令行方式为例进行说明。关于控制台的操作,请参见管理虚拟服务。
使用以下内容,创建sourceLabels.yaml文件。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: echo namespace: default spec: hosts: - echo-server.default.svc.cluster.local tcp: - match: - sourceLabels: app: telnet-client route: - destination: host: echo-server-2.default.svc.cluster.local
在ASM实例对应的KubeConfig环境下,执行以下命令,部署VirtualService。
kubectl apply -f sourceLabels.yaml
执行以下命令,通过telnet-client Pod发起测试,输入
test
,向echo-server.default.svc.cluster.local 19000
发起连接并传输数据。kubectl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test
收到echo-server-2返回的
hello2 test
响应,说明经由telnet-client Pod发出的流量匹配到了VirtualService中声明的路由匹配规则。执行以下命令,通过telnet-client-2 Pod发起测试,输入
test
,向echo-server.default.svc.cluster.local 19000
发起连接并传输数据。kubectl exec -it telnet-client-2-c56db78bd-7**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test
收到echo-server返回的
hello test
,说明流量未被转发到echo-server-2,经由telnet-client-2 Pod发出的流量未能匹配到VirtualService中声明的路由匹配规则,符合预期。
gateways
通过配置tcp.match[n].gateways
可以匹配从特定网关发往服务的请求。
支持情况
AmbientMode:支持
SidecarMode:支持
部署示例资源
以下示例在本文前提条件的基础上,需要额外部署2个ASM网关,分别名为ingressgateway-1和ingressgateway-2。示例提供的VirtualService应用到这两个网关,网关ingressgateway-1的流量将被路由至echo-server服务,而ingressgateway-2的流量将被路由至echo-server-2服务。
创建ASM网关。具体操作,请参见创建入口网关。
ingressgateway-1和ingressgateway-2网关采用相同配置。配置端口映射时,单击添加端口,协议选择TCP,服务端口选择19000。
部署网关规则。
下文以命令行方式为例进行说明。关于ASM控制台的具体操作,请参见管理网关规则。
使用以下内容,分别创建ingressgateway-1.yaml、ingressgateway-2.yaml文件。
以下网关规则定义了网关的监听端口,由于示例为TCP流量,所以Host配置为
*
。执行以下命令,部署网关规则。
kubectl apply -f ingressgateway-1.yaml kubectl apply -f ingressgateway-2.yaml
为网关部署VirtualService。
该虚拟服务定义了两条路由规则,第一条以网关匹配,如果当前网关是ingressgateway-2,则路由到
echo-server-2.default.svc.cluster.local
。您可以通过命令行或控制台的方式部署示例资源。下文以命令行方式为例进行说明。关于控制台的操作,请参见管理虚拟服务。使用以下内容,创建ingressgateway-vs.yaml文件。
在ASM实例对应的KubeConfig环境下,执行以下命令,部署VirtualService。
kubectl apply -f ingressgateway-vs.yaml
执行以下命令,连接ingressgateway-1的IP地址并传输字符串
test
,按Enter发送。kubectl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test
收到的返回信息为
hello test
。根据VirtualService定义,经过ingressgateway-1的流量应当被路由到echo-server.default.svc.cluster.local
,符合预期。执行以下命令,连接ingressgateway-2的IP地址并传输字符串
test
,按Enter发送。kubectl exec -it telnet-client-2-c56db78bd-7**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test
收到的返回信息为
hello-2 test
。根据VirtualService定义,经过ingressgateway-2的流量应当被路由到echo-server-2.default.svc.cluster.local
,符合预期。
sourceNamespace
通过配置sourceNamespace字段可以匹配流量的来源命名空间。
支持情况
AmbientMode:不支持
SidecarMode:支持
部署示例资源
以下YAML示例为将来自命名空间foo、发往echo-server.default.svc.cluster.local
的流量路由至echo-server-2.default.svc.cluster.local
。您可以通过命令行或控制台的方式部署示例资源。下文以命令行方式为例进行说明。关于控制台的操作,请参见管理虚拟服务。
使用以下内容,创建source-namespace.yaml文件。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: source-namespace namespace: default spec: hosts: - echo-server.default.svc.cluster.local http: [] tcp: - match: - sourceNamespace: foo route: - destination: host: echo-server-2.default.svc.cluster.local - route: - destination: host: echo-server.default.svc.cluster.local
在ASM实例对应的KubeConfig环境下,执行以下命令,部署VirtualService。
kubectl apply -f source-namespace.yaml
执行以下命令,通过
foo/telnet-client-foo
Pod发起测试,然后输入test
。kubectl -n foo exec -it telnet-client-foo-7c94569bfd-h**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test
收到echo-server-2返回的
hello2 test
响应,说明经由foo/telnet-client-foo
Pod发出的流量匹配到了VirtualService中声明的路由匹配规则。执行以下命令,通过
default/telnet-client
Pod发起测试,然后输入test
。kubectl exec -it telnet-client-c56db78bd-7**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test
收到echo-server返回的
hello test
,流量未被转发到echo-server-2,说明经由default/telnet-client
Pod发出的流量使用了VirtualService中的默认匹配规则被路由至echo-server.default.svc.cluster.local
,符合预期。
路由
weight
配置weight字段可以使多个子集之间按照流量比例进行路由。
支持情况
AmbientMode:不支持
SidecarMode:支持
部署示例资源
部署Deployment。
使用以下内容,创建echo-server-backup.yaml文件。
以下YAML将部署echo-server服务的gray版本。
在数据平面集群对应的KubeConfig环境下,执行以下命令,部署Deployment。
kubectl apply -f echo-server-backup.yaml
部署DestinationRule。
下文以命令行方式为例进行说明。关于ASM控制台的具体操作,请参见管理目标规则。
使用以下内容,创建echoserver-dr.yaml文件。
以下YAML将使用DestinationRule为echo-server服务分别创建prod和gray两个子集。
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: echo namespace: default spec: host: echo.default.svc.cluster.local subsets: - labels: version: prod name: prod - labels: version: gray name: gray
在ASM实例对应的KubeConfig环境下,执行以下命令,部署DestinationRule。
kubectl apply -f echoserver-dr.yaml
部署VirtualService。
下文以命令行方式为例进行说明。关于ASM控制台的具体操作,请参见管理虚拟服务。
使用以下内容,创建echoserver-vs.yaml文件。
以下YAML将使用VirtualService为echo-server服务的两个子集prod和gray配置
80:20
的流量权重。apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: echo spec: hosts: - echo-server.default.svc.cluster.local http: - route: - destination: host: echo-server.default.svc.cluster.local subset: gray weight: 20 - destination: host: echo-server.default.svc.cluster.local subset: prod weight: 80
在ASM实例对应的KubeConfig环境下,执行以下命令,部署VirtualService。
kubectl apply -f echoserver-vs.yaml
执行以下命令,通过telnet-client Pod发起测试,输入
test
,收到echo-server返回的hello test
响应,按Ctrl + D退出。将此操作重复执行五次。$ ackctl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test #预期输出: hello-gray test $ ackctl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test #预期输出: hello test $ ackctl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test #预期输出: hello test $ ackctl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test #预期输出: hello test $ ackctl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test #预期输出: hello test
由于TCP负载均衡为连接级别负载均衡,可以看到五次连接被按照VirtualService设置的比例被路由到echo-server服务的prod和version子集(该比例不一定严格准确)。