kube(cuttle)
Published: 2020-02-03 02:32:01

## Kubectl

Kubernetes is actually a one big API server and kubectl is the command-line client tool to manage Kubernetes clusters. Kubectl is also the new SSH for Kubernetes. Kubectl reads the cluster context from the config file present inside $HOME/kube directory. 

Here is Hightower's word on kubectl,

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/9php4tagknirqlg1pcjj.png)

## Syntax structure 

Kubectl has the following syntax, 
```Kubectl [operation] [resource] [name] [options] ```

*operations* are the tasks that you want to perform such as *create, get, describe, delete, apply -f, exec -it*

*[resource](https://book-v1.book.kubebuilder.io/basics/what_is_a_resource.html)* is the Kubernetes resource kinds like *deployment, pods, connfigmap, daemonset etc.*

*name* specifies the name of the resource such as POD name, deployment name etc.

*options* are the various choices available for the operations and the resources. Some of the common options are 
         * **-o yaml** - outputs in yaml format 
         * **-o json** - outputs in json format 
         * **--watch**
         * **--show-labels**
         * **--namespace**

## How Kubectl works?

kubectl works on REST apis. Whenever a command is entered using kubectl, it's translated into a REST API call and hits the Kubernetes API server. Now based on the kubectl command, the API server either refers kubelet or the etcd database to retrieve or modify the data.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/etot07al2mfjl80dlf1h.jpg)

## Get documentation using Kubectl

Kubernetes has a lot of resources and custom resource definitions. Kubectl has a wonderful feature to read all the documentation about these resources from the command line. It's pretty useful while writing the Kubernetes manifest yamls. For example, to view the options of the *Pod* resource, just run `kubectl explain pod`

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/wpcf28usa4ya8agsdf2x.png)

The **explain** command also works to explain any inner field of a resource. For example, to know about the **spec** of a POD resource, just call the explain API with dot notation like `kubectl explain pod.spec`

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/gc640410xleqno7gnm84.png)

## kubectl - an alternative to SSH for containers

The `kubectl exec` is a valuable command for those who are working with the pods. It helps to get into the containers and allows us to execute commands.

Say, for example when we run the `exec` command to a running nginx POD, the following happens, 

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/hytjiq31hp5j09npjdg1.png)

From the above image, the following can be noted,

1. A GET request is called to fetch the POD nginx
2. A POST request to the `exec` subresource of the POD
3. Finally, the server responds with the Response status 101 and switches to [SPDY](https://en.wikipedia.org/wiki/SPDY) protocol to serve the content.
Now technically we've logged-in to a pod and can run any commands.

## kubectl - For Local debugging of the remote services

One of the top features of kubectl is the `port-forward` command. This allows forwarding one or more local ports to the remote service/pod running in the cluster and allows debugging of a remote service locally.

The following is an example where we port forward the local 8080 port to the remote 80 port of an nginx POD and we can access the remote nginx server using localhost:8080 for the terminal.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/okvlrnkyqnb3kb57p390.png)

## Common Useful kubectl commands

* **apply** - `kubectl apply -f FILENAME.yaml` will create/apply all configurations specified in the file. `apply` also takes input from STDIN

* **annotate** - `kubectl annotate (-f FILENAME.yaml | RESOURCE NAME) KEY1=VAL1 KEY2=VAL2`. This adds or updates annotations on one or more resources.

* **delete** - `kubectl delete (-f FILENAME | RESOURCE NAME)` . This deletes the specified resources from the cluster

* **describe** - `kubectl describe RESOURCE NAME` displays all the detailed state of the specified resource.

* **diff** - `kubectl diff FILENAME [flags]` shows the diff between resources specified in the file against the live server configurations.

* **edit** - `kubectl edit ( FILENAME | RESOURCE NAME)` edits or updates the resources specified. This helps to dynamically change the server resources. 

* **get** - `kubectl get RESOURCE NAME` retrieves the specified resource information from the server. 

* **logs** - `kubectl logs -f RESOURCE NAME`. This is an equivalent of `tail -f`. This tails the logs of a resource directly from your terminal

The complete reference of kubectl commands with examples can be found in the [kubectl reference](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands) document.

Thanks for Reading ! See you soon again with another post :)