Running and Interacting with Your First Application
Objectives
After completing this section, you should be able to execute a pre-built application in your Kubernetes cluster and review the resources related to the process.
Running Pods From Container Images
The simplest way to run a container in your Kubernetes cluster is with the kubectl run command. At a minimum, you must specify a name and container image. This container image must be accessible by the Kubernetes cluster.
The following example command creates a new pod named myname that uses the container image referenced by myimage.
[user@host ~] kubectl run myname --image=myimage
Recent versions of kubectl run can only create new pods. For example, older example uses of this command might include a --replicas option, which has been removed.
|
Important |
Use For other situations, create a Deployment, as explained in Deploying Manged Applications. |
Creating Resources
The kubectl create command creates new resources within the Kubernetes cluster. You must specify the name and type of the resource, along with any information required for that resource type.
You can specify --dry-run=client to prevent the creation of the object within the cluster. By combining this with the output type option, you can generate resource definitions.
For example, the following command outputs the YAML definition of a new deployment resource named webserver, by using the nginx image.
[user@host ~] kubectl create deployment webserver \
--image=nginx --dry-run=client -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: webserver
name: webserver
spec:
replicas: 1
selector:
matchLabels:
app: webserver
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: webserver
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}
You can save this output to a file to actually create the object later. Reference the file by specifying it with the -f option.
For example, the following command creates a new resource using the definition found in mydef.yml:
[user@host ~] kubectl create -f mydef.yml ...output omitted...
Comparing Create and Apply
The kubectl create command can only create new resources. To modify an existing resource or create it if it does not exist, use the kubectl apply command. Like kubectl create, this command also accepts YAML or JSON definitions.
If you are familiar with certain variants of SQL syntax, then kubectl create is comparable to INSERT whereas kubectl apply is akin to UPSERT.
Executing Commands Within an Existing Pod
With the kubectl exec command, you can execute commands inside existing pods. The kubectl exec command is useful for troubleshooting problematic containers, but the changes are not persistent. To make persistent changes, you must change the container image.
At a minimum, this command requires the name of the pod and the command to execute. For example, the following command will execute ls within the running pod named mypod.
[user@host ~] kubectl exec mypod -- /bin/ls bin boot dev ...output omitted...
The -- separates the parts of the command intended for Kubernetes itself from the command that should be passed to and executed within the container.
Connecting a Shell to an Existing Pod
A common use of kubectl exec is to open a new shell within a running pod. For example, the following command creates and attaches a new shell session to the pod named mypod:
[user@host ~] kubectl exec --stdin --tty mypod -- /bin/bash
Notice the addition of the --stdin and --tty options. These are necessary to ensure input and output are forwarded correctly to the interactive shell within the container.