Kubernetes is the dominant know-how for infrastructure at this time, and which means sysadmins must be accustomed to administering it. I’ve been managing Kubernetes clusters on daily basis for years now, and I picked up a couple of methods that I extremely suggest for others trying to simplify their admin expertise.
I created this cheat sheet to share the important thing notes about kubectl and the instructions I take advantage of day by day to maintain clusters up and working. It’s damaged up into sections that can assist you gauge whether or not or not it is best to use them for sure duties. I additionally included some flags in each long-form and shorthand to assist get you fluent with them extra shortly.
Get, create, edit, and delete sources with kubectl
The most secure place to start out with a command-line utility is to ask questions (learn operations) quite than give instructions (write operations). The useful get instructions can get you rolling.
Kubectl get
Use get to tug a listing of sources you have got at present in your cluster. The sorts of sources you possibly can get embrace:
- Namespace
- Pod
- Node
- Deployment
- Service
- ReplicaUnits
Each of those supplies particulars in regards to the out there sources within the cluster. As an instance, here is the output of the get nodes command, which supplies a model of Kubernetes in utilization and standing.
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready grasp 9d v1.18.zero
Most of those instructions have shortened variations. To get the namespaces, you possibly can run kubectl get namespaces or kubectl get ns (see the cheat sheet for the complete checklist):
$ kubectl get ns
NAME STATUS AGE
charts Active 8d
default Active 9d
kube-node-lease Active 9d
kube-public Active 9d
kube-system Active 9d
Each get command can focus in on a given namespace with the –namespace or -n flag. I take advantage of particularly assist whenever you wish to evaluate the pods in kube-system, that are the companies wanted to run Kubernetes itself.
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-66bff467f8-mjptx 1/1 Running 2 9d
coredns-66bff467f8-t2xcz 1/1 Running 2 9d
etcd-minikube 1/1 Running 1 9d
kube-apiserver-minikube 1/1 Running 1 9d
kube-controller-manager-minikube 1/1 Running 2 9d
kube-proxy-rpc9d 1/1 Running 1 9d
kube-scheduler-minikube 1/1 Running 2 9d
storage-provisioner 1/1 Running 1 9d
Kubectl create
Now that we have gathered some sources, let’s create some extra. With kubectl, you possibly can create almost any sort of useful resource in a cluster. Some of those sources do require configuration recordsdata and namespaces to set the useful resource to, in addition to names. Resources you possibly can create embrace:
- service
- cronjob
- deployment
- job
- namespace (ns)
So, for instance, create namespace requires one other parameter to call the namespace.
$ kubectl create ns hello-there
namespace/hello-there created
We also can create constantly working jobs with cron like many Linux buddies will be familiar with. Here we use cronjob to echoes “hello” each 5 seconds.
$ kubectl create cronjob my-cron --image=busybox --schedule="*/5 * * * *" -- echo hiya
cronjob.batch/my-namespaced-cron created
You also can use the shortened model, cj, quite than cronjob.
$ kubectl create cj my-existing-cron --image=busybox --schedule="*/15 * * * *" -- echo hiya
cronjob.batch/my-existing-cron created
Kubectl edit
So, what occurs after we’ve created one thing, and we wish to replace? That’s the place kubectl edit is available in.
You can edit any useful resource in your cluster whenever you run this command. It will open your default textual content editor. So we’ll edit our current cron job, can we run:
$ kubectl edit cronjob/my-existing-cron
This exhibits our configuration to edit.
# Please edit the item beneath. Lines starting with a '#' shall be ignored,
# and an empty file will abort the edit. If an error happens whereas saving this file shall be
# reopened with the related failures.
#
apiVersion: batch/v1beta1
variety: CronJob
metadata:
creationTimestamp: "2020-04-19T16:06:06Z"
managedFields:
- apiVersion: batch/v1beta1
fieldsType: FieldsV1
fieldsV1:
f:spec:
f:concurrencyPolicy:
f:failedJobsHistoryLimit:
f:jobTemplate:
f:metadata:
f:identify:
f:spec:
f:template:
f:spec:
f:containers:
ok::
.:
f:command:
f:picture:
f:imagePullPolicy:
The schedule is ready to each 15 seconds:
We will change it to each 25 seconds and write to the useful resource:
Once we write it, we will see it was modified.
$ kubectl edit cronjob/my-existing-cron
cronjob.batch/my-existing-cron edited
If we wish to make use of a distinct editor, we will override that by including by utilizing this KUBE_EDITOR syntax.
$ KUBE_EDITOR="nano" kubectl edit cronjob/my-existing-cron
Kubectl delete
So far, we’ve got achieved every little thing in need of eradicating it altogether, so that’s what we’re going to do subsequent. The cronjob we simply edited was one in all two cronjobs, so now we’re simply going to delete the entire useful resource.
$ kubectl delete cronjob my-existing-cron
cronjob.batch "my-existing-cron" deleted
As a warning, it is best to by no means simply delete one thing you do not know all of the details about. Once the useful resource is deleted, there is not any recovering it; you’ll have to recreate it, so suppose twice earlier than you run this command.
Kubectl apply
Earlier, I discussed that some instructions would require configuration recordsdata. The apply command permits you to apply configurations through recordsdata for sources inside your cluster. This will also be achieved via commonplace in (STDIN) on the command line, however the suggestion is all the time by file.
I think about this command to be just a little extra superior, as it is advisable to know tips on how to use your cluster and what sort of configuration file to use to it. For this instance, I’m utilizing the role-based entry management (RBAC) config from Helm for a service account.
$ kubectl apply -f instructions.yaml
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created
You can apply nearly any configuration you need, however you’ll all the time have to know for certain what it’s you are making use of, or you may even see unintended outcomes.
Troubleshooting Kubernetes with kubectl
Kubectl describe
Describe exhibits the small print of the useful resource you are taking a look at. The most typical use case is describing a pod or node to examine if there’s an error within the occasions, or if sources are too restricted to make use of.
Resources you possibly can describe embrace:
- Nodes
- Pods
- Services
- Deployments
- Replica units
- Cronjobs
In this instance, we will describe the cronjob at present within the cluster from our earlier examples.
$ kubectl describe cronjob my-cron
Snippet:
Name: my-cron
Namespace: default
Labels: <none>
Annotations: <none>
Schedule: */5 * * * *
Concurrency Policy: Allow
Suspend: False
Successful Job History Limit: three
Failed Job History Limit: 1
Starting Deadline Seconds: <unset>
Selector: <unset>
Parallelism: <unset>
Completions: <unset>
Pod Template:
Labels: <none>
Containers:
my-cron:
Image: busybox
Port: <none>
Host Port: <none>
Kubectl logs
While the describe command provides you the occasions occurring for the purposes inside a pod, logs provide detailed insights into what’s occurring inside Kubernetes in relation to the pod. Understanding this distinction permits you to troubleshoot points occurring inside the appliance and inside Kubernetes as a result of they aren’t all the time the identical drawback.
$ kubectl logs cherry-chart-88d49478c-dmcfv -n charts
Snippet:
172.17.zero.1 - - [19/Apr/2020:16:01:15 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
172.17.zero.1 - - [19/Apr/2020:16:01:20 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
172.17.zero.1 - - [19/Apr/2020:16:01:25 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
172.17.zero.1 - - [19/Apr/2020:16:01:30 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
172.17.zero.1 - - [19/Apr/2020:16:01:35 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
172.17.zero.1 - - [19/Apr/2020:16:01:40 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
172.17.zero.1 - - [19/Apr/2020:16:01:45 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
172.17.zero.1 - - [19/Apr/2020:16:01:50 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
172.17.zero.1 - - [19/Apr/2020:16:01:55 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
You also can take away additional noise or search for one other occasion by utilizing grep with this command. The kube-probe will be noisy, so let’s filter it out with grep.
$ kubectl logs cherry-chart-88d49478c-dmcfv -n charts | grep -vie kube-probe
127.zero.zero.1 - - [10/Apr /2020:23:01:55 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0" “-”
Since some deployments have a number of containers inside a pod, you may as well use the -c <container identify> together with your logs to solely look in a single particular container for logs.
Kubectl exec
Much just like the docker exec command, you may as well exec right into a container to troubleshoot an software instantly. This is beneficial when the logs from the pod have not offered you a solution to the problems you could be debugging. When utilizing the exec command, the top of the road should all the time present which shell you’re utilizing throughout the pod.
$ kubectl exec -it cherry-chart-88d49478c-dmcfv -n charts -- /bin/bash
root@cherry-chart-88d49478c-dmcfv:/#
Kubectl cp
This command is for copying recordsdata and directories to and from containers, very similar to the Linux cp command. It will not be one thing you’ll use on daily basis, however it’s my private favourite for pulling or restoring backups in an emergency when automation is failing.
Here’s an instance of copying an area file to a container. The syntax follows a kubectl cp <filename> <namespace/podname:/path/tofile> format:
$ kubectl cp commands_copy.txt charts/cherry-chart-88d49478c-dmcfv:instructions.txt
$ kubectl exec -it cherry-chart-88d49478c-dmcfv -n charts -- /bin/bash
root@cherry-chart-88d49478c-dmcfv:/# ls
bin boot instructions.txt dev and so on dwelling lib lib64 media mnt decide proc root run sbin srv sys tmp usr var
Here is one other instance, however this time pulling a file to our native machine from a container. The syntax is kubectl cp <namespace/podname:/path/tofile> format:
$ kubectl cp charts/cherry-chart-88d49478c-dmcfv:instructions.txt commands_copy.txt
$ ls
commands_copy.txt
There are a whole lot of little instructions which can be useful to have round as a Kubernetes administrator. I hope this cheat sheet is useful for you!