Managing Kubernetes Objects Using Imperative Commands
Kubernetes objects can quickly be created, updated, and deleted directly using
imperative commands built into the
kubectl command-line tool. This document
explains how those commands are organized and how to use them to manage live objects.
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:
kubectl tool supports three kinds of object management:
- Imperative commands
- Imperative object configuration
- Declarative object configuration
See Kubernetes Object Management for a discussion of the advantages and disadvantage of each kind of object management.
How to create objects
kubectl tool supports verb-driven commands for creating some of the most common
object types. The commands are named to be recognizable to users unfamiliar with
the Kubernetes object types.
run: Create a new Deployment object to run Containers in one or more Pods.
expose: Create a new Service object to load balance traffic across Pods.
autoscale: Create a new Autoscaler object to automatically horizontally scale a controller, such as a Deployment.
kubectl tool also supports creation commands driven by object type.
These commands support more object types and are more explicit about
their intent, but require users to know the type of objects they intend
create <objecttype> [<subtype>] <instancename>
Some objects types have subtypes that you can specify in the
For example, the Service object has several subtypes including ClusterIP,
LoadBalancer, and NodePort. Here's an example that creates a Service with
kubectl create service nodeport <myservicename>
In the preceding example, the
create service nodeport command is called
a subcommand of the
create service command.
You can use the
-h flag to find the arguments and flags supported by
kubectl create service nodeport -h
How to update objects
kubectl command supports verb-driven commands for some common update operations.
These commands are named to enable users unfamiliar with Kubernetes
objects to perform updates without knowing the specific fields
that must be set:
scale: Horizontally scale a controller to add or remove Pods by updating the replica count of the controller.
annotate: Add or remove an annotation from an object.
label: Add or remove a label from an object.
kubectl command also supports update commands driven by an aspect of the object.
Setting this aspect may set different fields for different object types:
<field>: Set an aspect of an object.
Note: In Kubernetes version 1.5, not every verb-driven command has an associated aspect-driven command.
kubectl tool supports these additional ways to update a live object directly,
however they require a better understanding of the Kubernetes object schema.
edit: Directly edit the raw configuration of a live object by opening its configuration in an editor.
patch: Directly modify specific fields of a live object by using a patch string. For more details on patch strings, see the patch section in API Conventions.
How to delete objects
You can use the
delete command to delete an object from a cluster:
Note: You can use
kubectl deletefor both imperative commands and imperative object configuration. The difference is in the arguments passed to the command. To use
kubectl deleteas an imperative command, pass the object to be deleted as an argument. Here's an example that passes a Deployment object named nginx:
kubectl delete deployment/nginx
How to view an object
There are several commands for printing information about an object:
get: Prints basic information about matching objects. Use
get -hto see a list of options.
describe: Prints aggregated detailed information about matching objects.
logs: Prints the stdout and stderr for a container running in a Pod.
set commands to modify objects before creation
There are some object fields that don't have a flag you can use
create command. In some of those cases, you can use a combination of
create to specify a value for the field before object
creation. This is done by piping the output of the
create command to the
set command, and then back to the
create command. Here's an example:
kubectl create service clusterip my-svc --clusterip="None" -o yaml --dry-run=client | kubectl set selector --local -f - 'environment=qa' -o yaml | kubectl create -f -
kubectl create service -o yaml --dry-run=clientcommand creates the configuration for the Service, but prints it to stdout as YAML instead of sending it to the Kubernetes API server.
kubectl set selector --local -f - -o yamlcommand reads the configuration from stdin, and writes the updated configuration to stdout as YAML.
kubectl create -f -command creates the object using the configuration provided via stdin.
--edit to modify objects before creation
You can use
kubectl create --edit to make arbitrary changes to an object
before it is created. Here's an example:
kubectl create service clusterip my-svc --clusterip="None" -o yaml --dry-run=client > /tmp/srv.yaml kubectl create --edit -f /tmp/srv.yaml
kubectl create servicecommand creates the configuration for the Service and saves it to
kubectl create --editcommand opens the configuration file for editing before it creates the object.