• kubectl Cheat Sheet
  • kubectl - Cheat Sheet
    • Kubectl Autocomplete
      • BASH
      • ZSH
    • Kubectl Context and Configuration
    • Apply
    • Creating Objects
    • Viewing, Finding Resources
    • Updating Resources
    • Patching Resources
    • Editing Resources
    • Scaling Resources
    • Deleting Resources
    • Interacting with running Pods
    • Interacting with Nodes and Cluster
      • Resource types
      • Formatting output
      • Kubectl output verbosity and debugging
    • What's next
    • Feedback

    kubectl Cheat Sheet

    See also: Kubectl Overview and JsonPath Guide.

    This page is an overview of the kubectl command.

    kubectl - Cheat Sheet

    Kubectl Autocomplete

    BASH

    1. source <(kubectl completion bash) # setup autocomplete in bash into the current shell, bash-completion package should be installed first.
    2. echo "source <(kubectl completion bash)" >> ~/.bashrc # add autocomplete permanently to your bash shell.

    You can also use a shorthand alias for kubectl that also works with completion:

    1. alias k=kubectl
    2. complete -F __start_kubectl k

    ZSH

    1. source <(kubectl completion zsh) # setup autocomplete in zsh into the current shell
    2. echo "if [ $commands[kubectl] ]; then source <(kubectl completion zsh); fi" >> ~/.zshrc # add autocomplete permanently to your zsh shell

    Kubectl Context and Configuration

    Set which Kubernetes cluster kubectl communicates with and modifies configurationinformation. See Authenticating Across Clusters with kubeconfig documentation fordetailed config file information.

    1. kubectl config view # Show Merged kubeconfig settings.
    2. # use multiple kubeconfig files at the same time and view merged config
    3. KUBECONFIG=~/.kube/config:~/.kube/kubconfig2
    4. kubectl config view
    5. # get the password for the e2e user
    6. kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}'
    7. kubectl config view -o jsonpath='{.users[].name}' # display the first user
    8. kubectl config view -o jsonpath='{.users[*].name}' # get a list of users
    9. kubectl config get-contexts # display list of contexts
    10. kubectl config current-context # display the current-context
    11. kubectl config use-context my-cluster-name # set the default context to my-cluster-name
    12. # add a new cluster to your kubeconf that supports basic auth
    13. kubectl config set-credentials kubeuser/foo.kubernetes.com --username=kubeuser --password=kubepassword
    14. # permanently save the namespace for all subsequent kubectl commands in that context.
    15. kubectl config set-context --current --namespace=ggckad-s2
    16. # set a context utilizing a specific username and namespace.
    17. kubectl config set-context gce --user=cluster-admin --namespace=foo \
    18. && kubectl config use-context gce
    19. kubectl config unset users.foo # delete user foo

    Apply

    apply manages applications through files defining Kubernetes resources. It creates and updates resources in a cluster through running kubectl apply. This is the recommended way of managing Kubernetes applications on production. See Kubectl Book.

    Creating Objects

    Kubernetes manifests can be defined in json or yaml. The file extension .yaml,.yml, and .json can be used.

    1. kubectl apply -f ./my-manifest.yaml # create resource(s)
    2. kubectl apply -f ./my1.yaml -f ./my2.yaml # create from multiple files
    3. kubectl apply -f ./dir # create resource(s) in all manifest files in dir
    4. kubectl apply -f https://git.io/vPieo # create resource(s) from url
    5. kubectl create deployment nginx --image=nginx # start a single instance of nginx
    6. kubectl explain pods,svc # get the documentation for pod and svc manifests
    7. # Create multiple YAML objects from stdin
    8. cat <<EOF | kubectl apply -f -
    9. apiVersion: v1
    10. kind: Pod
    11. metadata:
    12. name: busybox-sleep
    13. spec:
    14. containers:
    15. - name: busybox
    16. image: busybox
    17. args:
    18. - sleep
    19. - "1000000"
    20. ---
    21. apiVersion: v1
    22. kind: Pod
    23. metadata:
    24. name: busybox-sleep-less
    25. spec:
    26. containers:
    27. - name: busybox
    28. image: busybox
    29. args:
    30. - sleep
    31. - "1000"
    32. EOF
    33. # Create a secret with several keys
    34. cat <<EOF | kubectl apply -f -
    35. apiVersion: v1
    36. kind: Secret
    37. metadata:
    38. name: mysecret
    39. type: Opaque
    40. data:
    41. password: $(echo -n "s33msi4" | base64 -w0)
    42. username: $(echo -n "jane" | base64 -w0)
    43. EOF

    Viewing, Finding Resources

    1. # Get commands with basic output
    2. kubectl get services # List all services in the namespace
    3. kubectl get pods --all-namespaces # List all pods in all namespaces
    4. kubectl get pods -o wide # List all pods in the namespace, with more details
    5. kubectl get deployment my-dep # List a particular deployment
    6. kubectl get pods # List all pods in the namespace
    7. kubectl get pod my-pod -o yaml # Get a pod's YAML
    8. kubectl get pod my-pod -o yaml --export # Get a pod's YAML without cluster specific information
    9. # Describe commands with verbose output
    10. kubectl describe nodes my-node
    11. kubectl describe pods my-pod
    12. # List Services Sorted by Name
    13. kubectl get services --sort-by=.metadata.name
    14. # List pods Sorted by Restart Count
    15. kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'
    16. # List PersistentVolumes sorted by capacity
    17. kubectl get pv --sort-by=.spec.capacity.storage
    18. # Get the version label of all pods with label app=cassandra
    19. kubectl get pods --selector=app=cassandra -o \
    20. jsonpath='{.items[*].metadata.labels.version}'
    21. # Get all worker nodes (use a selector to exclude results that have a label
    22. # named 'node-role.kubernetes.io/master')
    23. kubectl get node --selector='!node-role.kubernetes.io/master'
    24. # Get all running pods in the namespace
    25. kubectl get pods --field-selector=status.phase=Running
    26. # Get ExternalIPs of all nodes
    27. kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'
    28. # List Names of Pods that belong to Particular RC
    29. # "jq" command useful for transformations that are too complex for jsonpath, it can be found at https://stedolan.github.io/jq/
    30. sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"')%?}
    31. echo $(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name})
    32. # Show labels for all pods (or any other Kubernetes object that supports labelling)
    33. kubectl get pods --show-labels
    34. # Check which nodes are ready
    35. JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' \
    36. && kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True"
    37. # List all Secrets currently in use by a pod
    38. kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq
    39. # List Events sorted by timestamp
    40. kubectl get events --sort-by=.metadata.creationTimestamp

    Updating Resources

    As of version 1.11 rolling-update have been deprecated (see CHANGELOG-1.11.md), use rollout instead.

    1. kubectl set image deployment/frontend www=image:v2 # Rolling update "www" containers of "frontend" deployment, updating the image
    2. kubectl rollout history deployment/frontend # Check the history of deployments including the revision
    3. kubectl rollout undo deployment/frontend # Rollback to the previous deployment
    4. kubectl rollout undo deployment/frontend --to-revision=2 # Rollback to a specific revision
    5. kubectl rollout status -w deployment/frontend # Watch rolling update status of "frontend" deployment until completion
    6. # deprecated starting version 1.11
    7. kubectl rolling-update frontend-v1 -f frontend-v2.json # (deprecated) Rolling update pods of frontend-v1
    8. kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2 # (deprecated) Change the name of the resource and update the image
    9. kubectl rolling-update frontend --image=image:v2 # (deprecated) Update the pods image of frontend
    10. kubectl rolling-update frontend-v1 frontend-v2 --rollback # (deprecated) Abort existing rollout in progress
    11. cat pod.json | kubectl replace -f - # Replace a pod based on the JSON passed into std
    12. # Force replace, delete and then re-create the resource. Will cause a service outage.
    13. kubectl replace --force -f ./pod.json
    14. # Create a service for a replicated nginx, which serves on port 80 and connects to the containers on port 8000
    15. kubectl expose rc nginx --port=80 --target-port=8000
    16. # Update a single-container pod's image version (tag) to v4
    17. kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -
    18. kubectl label pods my-pod new-label=awesome # Add a Label
    19. kubectl annotate pods my-pod icon-url=http://goo.gl/XXBTWq # Add an annotation
    20. kubectl autoscale deployment foo --min=2 --max=10 # Auto scale a deployment "foo"

    Patching Resources

    1. # Partially update a node
    2. kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'
    3. # Update a container's image; spec.containers[*].name is required because it's a merge key
    4. kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'
    5. # Update a container's image using a json patch with positional arrays
    6. kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]'
    7. # Disable a deployment livenessProbe using a json patch with positional arrays
    8. kubectl patch deployment valid-deployment --type json -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/livenessProbe"}]'
    9. # Add a new element to a positional array
    10. kubectl patch sa default --type='json' -p='[{"op": "add", "path": "/secrets/1", "value": {"name": "whatever" } }]'

    Editing Resources

    Edit any API resource in your preferred editor.

    1. kubectl edit svc/docker-registry # Edit the service named docker-registry
    2. KUBE_EDITOR="nano" kubectl edit svc/docker-registry # Use an alternative editor

    Scaling Resources

    1. kubectl scale --replicas=3 rs/foo # Scale a replicaset named 'foo' to 3
    2. kubectl scale --replicas=3 -f foo.yaml # Scale a resource specified in "foo.yaml" to 3
    3. kubectl scale --current-replicas=2 --replicas=3 deployment/mysql # If the deployment named mysql's current size is 2, scale mysql to 3
    4. kubectl scale --replicas=5 rc/foo rc/bar rc/baz # Scale multiple replication controllers

    Deleting Resources

    1. kubectl delete -f ./pod.json # Delete a pod using the type and name specified in pod.json
    2. kubectl delete pod,service baz foo # Delete pods and services with same names "baz" and "foo"
    3. kubectl delete pods,services -l name=myLabel # Delete pods and services with label name=myLabel
    4. kubectl -n my-ns delete pod,svc --all # Delete all pods and services in namespace my-ns,
    5. # Delete all pods matching the awk pattern1 or pattern2
    6. kubectl get pods -n mynamespace --no-headers=true | awk '/pattern1|pattern2/{print $1}' | xargs kubectl delete -n mynamespace pod

    Interacting with running Pods

    1. kubectl logs my-pod # dump pod logs (stdout)
    2. kubectl logs -l name=myLabel # dump pod logs, with label name=myLabel (stdout)
    3. kubectl logs my-pod --previous # dump pod logs (stdout) for a previous instantiation of a container
    4. kubectl logs my-pod -c my-container # dump pod container logs (stdout, multi-container case)
    5. kubectl logs -l name=myLabel -c my-container # dump pod logs, with label name=myLabel (stdout)
    6. kubectl logs my-pod -c my-container --previous # dump pod container logs (stdout, multi-container case) for a previous instantiation of a container
    7. kubectl logs -f my-pod # stream pod logs (stdout)
    8. kubectl logs -f my-pod -c my-container # stream pod container logs (stdout, multi-container case)
    9. kubectl logs -f -l name=myLabel --all-containers # stream all pods logs with label name=myLabel (stdout)
    10. kubectl run -i --tty busybox --image=busybox -- sh # Run pod as interactive shell
    11. kubectl run nginx --image=nginx --restart=Never -n
    12. mynamespace # Run pod nginx in a specific namespace
    13. kubectl run nginx --image=nginx --restart=Never # Run pod nginx and write its spec into a file called pod.yaml
    14. --dry-run -o yaml > pod.yaml
    15. kubectl attach my-pod -i # Attach to Running Container
    16. kubectl port-forward my-pod 5000:6000 # Listen on port 5000 on the local machine and forward to port 6000 on my-pod
    17. kubectl exec my-pod -- ls / # Run command in existing pod (1 container case)
    18. kubectl exec my-pod -c my-container -- ls / # Run command in existing pod (multi-container case)
    19. kubectl top pod POD_NAME --containers # Show metrics for a given pod and its containers

    Interacting with Nodes and Cluster

    1. kubectl cordon my-node # Mark my-node as unschedulable
    2. kubectl drain my-node # Drain my-node in preparation for maintenance
    3. kubectl uncordon my-node # Mark my-node as schedulable
    4. kubectl top node my-node # Show metrics for a given node
    5. kubectl cluster-info # Display addresses of the master and services
    6. kubectl cluster-info dump # Dump current cluster state to stdout
    7. kubectl cluster-info dump --output-directory=/path/to/cluster-state # Dump current cluster state to /path/to/cluster-state
    8. # If a taint with that key and effect already exists, its value is replaced as specified.
    9. kubectl taint nodes foo dedicated=special-user:NoSchedule

    Resource types

    List all supported resource types along with their shortnames, API group, whether they are namespaced, and Kind:

    1. kubectl api-resources

    Other operations for exploring API resources:

    1. kubectl api-resources --namespaced=true # All namespaced resources
    2. kubectl api-resources --namespaced=false # All non-namespaced resources
    3. kubectl api-resources -o name # All resources with simple output (just the resource name)
    4. kubectl api-resources -o wide # All resources with expanded (aka "wide") output
    5. kubectl api-resources --verbs=list,get # All resources that support the "list" and "get" request verbs
    6. kubectl api-resources --api-group=extensions # All resources in the "extensions" API group

    Formatting output

    To output details to your terminal window in a specific format, you can add either the -o or —output flags to a supported kubectl command.

    Output formatDescription
    -o=custom-columns=<spec>Print a table using a comma separated list of custom columns
    -o=custom-columns-file=<filename>Print a table using the custom columns template in the <filename> file
    -o=jsonOutput a JSON formatted API object
    -o=jsonpath=<template>Print the fields defined in a jsonpath expression
    -o=jsonpath-file=<filename>Print the fields defined by the jsonpath expression in the <filename> file
    -o=namePrint only the resource name and nothing else
    -o=wideOutput in the plain-text format with any additional information, and for pods, the node name is included
    -o=yamlOutput a YAML formatted API object

    Kubectl output verbosity and debugging

    Kubectl verbosity is controlled with the -v or —v flags followed by an integer representing the log level. General Kubernetes logging conventions and the associated log levels are described here.

    VerbosityDescription
    —v=0Generally useful for this to always be visible to a cluster operator.
    —v=1A reasonable default log level if you don’t want verbosity.
    —v=2Useful steady state information about the service and important log messages that may correlate to significant changes in the system. This is the recommended default log level for most systems.
    —v=3Extended information about changes.
    —v=4Debug level verbosity.
    —v=6Display requested resources.
    —v=7Display HTTP request headers.
    —v=8Display HTTP request contents.
    —v=9Display HTTP request contents without truncation of contents.

    What's next

    • Learn more about Overview of kubectl.

    • See kubectl options.

    • Also kubectl Usage Conventions to understand how to use it in reusable scripts.

    • See more community kubectl cheatsheets.

    Feedback

    Was this page helpful?

    Thanks for the feedback. If you have a specific, answerable question about how to use Kubernetes, ask it onStack Overflow.Open an issue in the GitHub repo if you want toreport a problemorsuggest an improvement.