TCP
Set up a TCP listener on your API gateway.
The following guide deploys a sample TCP echo app, sets up a TCP listener on the gateway, and creates a TCPRoute to the sample app.
TCPRoutes are an experimental feature in the upstream Kubernetes Gateway API, and are subject to change.
Before you begin
Follow the Get started guide to install Gloo Gateway.
Install the experimental channel of the Kubernetes Gateway API so that you can use TCPRoutes.
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/experimental-install.yaml
Deploy the sample TCP echo app.
kubectl apply -f- <<EOF apiVersion: v1 kind: Pod metadata: labels: app: tcp-echo name: tcp-echo namespace: default spec: containers: - image: soloio/tcp-echo:latest imagePullPolicy: IfNotPresent name: tcp-echo restartPolicy: Always --- apiVersion: v1 kind: Service metadata: labels: app: tcp-echo name: tcp-echo namespace: default spec: ports: - name: http port: 1025 protocol: TCP targetPort: 1025 selector: app: tcp-echo EOF
Set up the Gateway for TCP routes
Create a TCP listener so that the gateway can route TCP traffic. In the following example, all TCP streams on port 8000 of the gateway are forwarded to port 1025 of the example TCP echo service.
Create a Gateway resource with a TCP listener.
kubectl apply -f- <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: tcp-gateway namespace: gloo-system labels: app: tcp-echo spec: gatewayClassName: gloo-gateway listeners: - protocol: TCP port: 8000 name: tcp allowedRoutes: kinds: - kind: TCPRoute EOF
Setting Description spec.gatewayClassName
The name of the Kubernetes gateway class that you want to use to configure the gateway. When you set up Gloo Gateway, a default gateway class is set up for you. To view the gateway class configuration, see Gateway classes and types. spec.listeners
Configure the listeners for this gateway. In this example, you configure a TCP gateway that listens for incoming traffic on port 8000. The gateway can serve TCPRoutes from any namespace. Check the status of the gateway to make sure that your configuration is accepted and no conflicts exist in your cluster.
kubectl get gateway tcp-gateway -n gloo-system -o yaml
Example output:
status: addresses: - type: IPAddress value: ${INGRESS_GW_ADDRESS} conditions: - lastTransitionTime: "2024-11-20T16:01:25Z" message: "" observedGeneration: 2 reason: Accepted status: "True" type: Accepted - lastTransitionTime: "2024-11-20T16:01:25Z" message: "" observedGeneration: 2 reason: Programmed status: "True" type: Programmed
Create a TCPRoute resource for the TCP echo app that is served by the gateway that you created.
kubectl apply -f- <<EOF apiVersion: gateway.networking.k8s.io/v1alpha2 kind: TCPRoute metadata: name: tcp-route-echo namespace: gloo-system labels: app: tcp-echo spec: parentRefs: - name: tcp-gateway namespace: gloo-system sectionName: tcp rules: - backendRefs: - name: tcp-echo port: 1025 EOF
Verify that the TCPRoute is applied successfully.
kubectl get tcproute/tcp-route-echo -n gloo-system -o yaml
Example output:
status: parents: - conditions: - lastTransitionTime: "2024-11-21T16:22:52Z" message: "" observedGeneration: 1 reason: Accepted status: "True" type: Accepted - lastTransitionTime: "2024-11-21T16:22:52Z" message: "" observedGeneration: 1 reason: ResolvedRefs status: "True" type: ResolvedRefs controllerName: solo.io/gloo-gateway parentRef: group: gateway.networking.k8s.io kind: Gateway name: tcp-gateway sectionName: tcp
Get the external address of the gateway and save it in an environment variable.
Send a TCP request to the external address of the TCP gateway on port 8000. You might use a tool such as telnet or netcat as in the following example.
Example output:
Connection to ${INGRESS_GW_ADDRESS} port 8000 [tcp/irdmi] succeeded!
Enter any string to verify that the TCP echo service “echoes,” returning the same string back.
hello
Example output:
hello hello
Cleanup
You can optionally remove the resources that you set up as part of this guide.
kubectl delete -A gateways,tcproutes,pod,svc -l app=tcp-echo