本指南演示了使用 OSM 的 TCP 路由功能处理网格中通信的 TCP 客户端和服务端应用。

先决条件

  • Kubernetes 集群运行版本 v1.22.9 或者更高。
  • 已安装 OSM。
  • 使用 kubectl 与 API server 交互。
  • 已安装 osm 命令行工具,用于管理服务网格。

演示

以下演示了一个 TCP 客户端将数据发送到 tcp-echo 服务器,然后该服务器通过 TCP 连接将数据回显到客户端。

  1. 设置安装 OSM 的命名空间。

    1. osm_namespace=osm-system # Replace osm-system with the namespace where OSM is installed if different
  2. tcp-demo 命名空间下部署 tcp-demo service 。 tcp-demo service 运行在 9000 端口上,同时 appProtocol 属性设置为 tcp, 用来告知 OSM: 在将流量定向到 tcp-demo9000 端口时,必须使用 TCP 路由。

    1. # Create the tcp-demo namespace
    2. kubectl create namespace tcp-demo
    3. # Add the namespace to the mesh
    4. osm namespace add tcp-demo
    5. # Deploy the service
    6. kubectl apply -f https://raw.githubusercontent.com/openservicemesh/osm-docs/release-v1.2/manifests/apps/tcp-echo.yaml -n tcp-demo

    确认 tcp-echo service 和 pod 启动并运行。

    1. $ kubectl get svc,po -n tcp-demo
    2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    3. service/tcp-echo ClusterIP 10.0.216.68 <none> 9000/TCP 97s
    4. NAME READY STATUS RESTARTS AGE
    5. pod/tcp-echo-6656b7c4f8-zt92q 2/2 Running 0 97s
  3. curl 命名空间下部署 curl 客户端。

    1. # Create the curl namespace
    2. kubectl create namespace curl
    3. # Add the namespace to the mesh
    4. osm namespace add curl
    5. # Deploy curl client in the curl namespace
    6. kubectl apply -f https://raw.githubusercontent.com/openservicemesh/osm-docs/release-v1.2/manifests/samples/curl/curl.yaml -n curl

    确认 curl 客户端 pod 启动并运行。

    1. $ kubectl get pods -n curl
    2. NAME READY STATUS RESTARTS AGE
    3. curl-54ccc6954c-9rlvp 2/2 Running 0 20s

使用宽松流量策略模式

我们将通过 宽松流量策略模式 启用服务发现,这允许应用互通建立而无需显式的指定 SMI 策略。

  1. 开启宽松流量策略模式

    1. kubectl patch meshconfig osm-mesh-config -n "$osm_namespace" -p '{"spec":{"traffic":{"enablePermissiveTrafficPolicyMode":true}}}' --type=merge
  2. 确认 curl 客户端可以通过 TCP 路由成功发送请求到 tcp-echo service 并接收响应。

    1. $ kubectl exec -n curl -ti "$(kubectl get pod -n curl -l app=curl -o jsonpath='{.items[0].metadata.name}')" -c curl -- sh -c 'echo hello | nc tcp-echo.tcp-demo 9000'
    2. echo response: hello

    tcp-echo service 应该将客户端发送的数据返回客户端。在上面的示例中,客户端发送 hellotcp-echo service 回应 echo response: echo

使用 SMI 流量策略模式

使用 SMI 流量策略模式时,必须显式的配置流量策略来允许应用互通。我们将设置 SMI 策略来允许 curl 客户端与 tcp-echo service 在 9000 端口上进行通讯。

  1. 通过禁用宽松流量策略模式来启用 SMI 策略模式。

    1. kubectl patch meshconfig osm-mesh-config -n "$osm_namespace" -p '{"spec":{"traffic":{"enablePermissiveTrafficPolicyMode":false}}}' --type=merge
  2. 在缺少 SMI 策略的情况下,确认 curl 客户端无法发送请求到 tcp-echo service ,也无法接收响应。

    1. $ kubectl exec -n curl -ti "$(kubectl get pod -n curl -l app=curl -o jsonpath='{.items[0].metadata.name}')" -c curl -- sh -c 'echo hello | nc tcp-echo.tcp-demo 9000'
    2. command terminated with exit code 1
  3. 配置 SMI 流量访问和路由策略。

    1. kubectl apply -f - <<EOF
    2. # TCP route to allows access to tcp-echo:9000
    3. apiVersion: specs.smi-spec.io/v1alpha4
    4. kind: TCPRoute
    5. metadata:
    6. name: tcp-echo-route
    7. namespace: tcp-demo
    8. spec:
    9. matches:
    10. ports:
    11. - 9000
    12. ---
    13. # Traffic target to allow curl app to access tcp-echo service using a TCPRoute
    14. kind: TrafficTarget
    15. apiVersion: access.smi-spec.io/v1alpha3
    16. metadata:
    17. name: tcp-access
    18. namespace: tcp-demo
    19. spec:
    20. destination:
    21. kind: ServiceAccount
    22. name: tcp-echo
    23. namespace: tcp-demo
    24. sources:
    25. - kind: ServiceAccount
    26. name: curl
    27. namespace: curl
    28. rules:
    29. - kind: TCPRoute
    30. name: tcp-echo-route
    31. EOF
  4. 有了 SMI TCP 路由之后,确认 curl 客户端可以成功访问 tcp-echo service 并收到响应。

    1. $ kubectl exec -n curl -ti "$(kubectl get pod -n curl -l app=curl -o jsonpath='{.items[0].metadata.name}')" -c curl -- sh -c 'echo hello | nc tcp-echo.tcp-demo 9000'
    2. echo response: hello