Tasks

Tasks
Administer a Cluster
Access Clusters Using the Kubernetes API
Access Services Running on Clusters
Advertise Extended Resources for a Node
Autoscale the DNS Service in a Cluster
Change the default StorageClass
Change the Reclaim Policy of a PersistentVolume
Cluster Management
Configure Multiple Schedulers
Configure Out of Resource Handling
Configure Quotas for API Objects
Control CPU Management Policies on the Node
Control Topology Management Policies on a node
Customizing DNS Service
Debugging DNS Resolution
Declare Network Policy
Developing Cloud Controller Manager
Enabling EndpointSlices
Enabling Service Topology
Encrypting Secret Data at Rest
Guaranteed Scheduling For Critical Add-On Pods
IP Masquerade Agent User Guide
Kubernetes Cloud Controller Manager
Limit Storage Consumption
Namespaces Walkthrough
Operating etcd clusters for Kubernetes
Reconfigure a Node's Kubelet in a Live Cluster
Reserve Compute Resources for System Daemons
Safely Drain a Node while Respecting the PodDisruptionBudget
Securing a Cluster
Set Kubelet parameters via a config file
Set up High-Availability Kubernetes Masters
Share a Cluster with Namespaces
Using a KMS provider for data encryption
Using CoreDNS for Service Discovery
Using NodeLocal DNSCache in Kubernetes clusters
Using sysctls in a Kubernetes Cluster
Extend kubectl with plugins
Manage HugePages
Schedule GPUs

Edit This Page

Use Port Forwarding to Access Applications in a Cluster

This page shows how to use kubectl port-forward to connect to a Redis server running in a Kubernetes cluster. This type of connection can be useful for database debugging.

Before you begin

  • You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using Minikube, or you can use one of these Kubernetes playgrounds:

Your Kubernetes server must be at or later than version v1.10. To check the version, enter kubectl version.

Creating Redis deployment and service

  1. Create a Deployment that runs Redis:

    kubectl apply -f https://k8s.io/examples/application/guestbook/redis-master-deployment.yaml

    The output of a successful command verifies that the deployment was created:

    deployment.apps/redis-master created
    

    View the pod status to check that it is ready:

    kubectl get pods

    The output displays the pod created:

    NAME                            READY     STATUS    RESTARTS   AGE
    redis-master-765d459796-258hz   1/1       Running   0          50s
    

    View the Deployment’s status:

    kubectl get deployment

    The output displays that the Deployment was created:

    NAME         READY   UP-TO-DATE   AVAILABLE   AGE
    redis-master 1/1     1            1           55s
    

    The Deployment automatically manages a ReplicaSet. View the ReplicaSet status using:

    kubectl get replicaset

    The output displays that the ReplicaSet was created:

    NAME                      DESIRED   CURRENT   READY     AGE
    redis-master-765d459796   1         1         1         1m
    
  2. Create a Service to expose Redis on the network:

    kubectl apply -f https://k8s.io/examples/application/guestbook/redis-master-service.yaml

    The output of a successful command verifies that the Service was created:

    service/redis-master created
    

    Check the Service created:

    kubectl get service redis-master

    The output displays the service created:

    NAME           TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
    redis-master   ClusterIP   10.0.0.213   <none>        6379/TCP   27s
    
  3. Verify that the Redis server is running in the Pod, and listening on port 6379:

    # Change redis-master-765d459796-258hz to the name of the Pod
    kubectl get pod redis-master-765d459796-258hz --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'

    The output displays the port for Redis in that Pod:

    6379
    

    (this is the TCP port allocated to Redis on the internet).

Forward a local port to a port on the Pod

  1. kubectl port-forward allows using resource name, such as a pod name, to select a matching pod to port forward to.

    # Change redis-master-765d459796-258hz to the name of the Pod
    kubectl port-forward redis-master-765d459796-258hz 7000:6379

    which is the same as

    kubectl port-forward pods/redis-master-765d459796-258hz 7000:6379

    or

    kubectl port-forward deployment/redis-master 7000:6379

    or

    kubectl port-forward replicaset/redis-master 7000:6379

    or

    kubectl port-forward service/redis-master 7000:6379

    Any of the above commands works. The output is similar to this:

    I0710 14:43:38.274550    3655 portforward.go:225] Forwarding from 127.0.0.1:7000 -> 6379
    I0710 14:43:38.274797    3655 portforward.go:225] Forwarding from [::1]:7000 -> 6379
    
  2. Start the Redis command line interface:

    redis-cli -p 7000
  3. At the Redis command line prompt, enter the ping command:

    ping
    

    A successful ping request returns:

    PONG
    

Discussion

Connections made to local port 7000 are forwarded to port 6379 of the Pod that is running the Redis server. With this connection in place, you can use your local workstation to debug the database that is running in the Pod.

Note: kubectl port-forward is implemented for TCP ports only. The support for UDP protocol is tracked in issue 47862.

What's next

Learn more about kubectl port-forward.

Feedback