Kubectl commands
kubectl
is the CLI tool that interfaces with Kubernetes. It can work with either a local setup (such as with Docker desktop's K8 or Minikube) or with one or more remote clusters. Most operations on K8s will be via kubectl
.
1.minikube
Commands
First, we need to start the local cluster. For that, we need to install minikube.
Install minikube
brew
makes install easier, whether or not you are on a M1 mac. Run:
brew install minikube
followed by:
which minikube
minikube version
Starting and stopping the local cluster
Minikube uses virtualbox to isolate the local set up of kubernetes. Once installed, you can run
minikube start
which returns the following in my case:
$ minikube start
😄 minikube v1.27.1 on Darwin 12.6 (arm64)
🆕 Kubernetes 1.25.2 is now available. If you would like to upgrade, specify: --kubernetes-version=v1.25.2
✨ Using the docker driver based on existing profile
👍 Starting control plane node minikube in cluster minikube
🚜 Pulling base image ...
🔄 Restarting existing docker container for "minikube" ...
🐳 Preparing Kubernetes v1.24.1 on Docker 20.10.17 ...
🔎 Verifying Kubernetes components...
▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
▪ Using image docker.io/kubernetesui/metrics-scraper:v1.0.8
▪ Using image docker.io/kubernetesui/dashboard:v2.7.0
🌟 Enabled addons: default-storageclass, storage-provisioner, dashboard
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
Note: When minikube starts,
kubectl
will automatically bind to minikube's kubectl by modifying thekubectl
context. Thus, runningk get pods
will only return the ones running in minikube, not your remote cluster. To talk to a different cluster, use thek config use-context <context_name>
command.
Once done, you can stop the cluster by running
minikube stop
Setting up shpod
namespace
The k8s course recommends using shpod
for a consistent shell experience. The yaml file in the link has the definition of a namespace.
k apply -f https://k8smastery.com/shpod.yaml
k attach -n shpod -it shpod
The attach command follows the syntax kubectl attach -n <namespace> --interactive --tty <contianer_name>
Once done, the pod can be terminated using
k delete -f https://k8smastery.com/shpod.yaml
2.kubectl
Commands
The kubectl
command needs to know which cluster to talk to and how to authenticate. This information is stored in the ~/.kube/config
file. The provisioner (which can be GKE or minikube) will also provide / edit this file. The file as the IP address of the k8s server and the TLS certs for auth.
Get contexts
First, you need to know which k8s cluster you are talking to. For this run: The *
points to the active cluster. All kubectl
commands apply to that cluster now.
k config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
gke_dev gke_dev gke_dev default
gke_prod gke_prod gke_prod default
gke_stage gke_stage gke_stage default
* minikube minikube minikube default
Change contexts
When you want to talk to a different cluster, change the cluster using the syntax k config use-context <contxtname>
k config use-context gke_dev
The run k config get-contexts
to confirm the switch.
Get nodes k get nodes
Nodes are the physical machines that run the Kubernetes cluster.
(local2) ➜ Documents k get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 7d22h v1.24.1
The get
command is the most frequently used command. get
can return output in a variety of formats:
k get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
minikube Ready control-plane 97d v1.24.1 192.168.49.2 <none> Ubuntu 20.04.4 LTS 5.10.104-linuxkit docker://20.10.17
You can get return in json
format and pipe that to a CLI tool called jq
which can parse and extract certain info like this:
k get node -o json | jq ".items[] | {name:.metadata.name} + .status.capacity"
{
"name": "minikube",
"cpu": "5",
"ephemeral-storage": "61255492Ki",
"hugepages-1Gi": "0",
"hugepages-2Mi": "0",
"hugepages-32Mi": "0",
"hugepages-64Ki": "0",
"memory": "8039792Ki",
"pods": "110"
}
Describe node k describe node <node_name>
If you want to delve into the details of how the node is configured and its health, you can run
k describe node minikube
.
Get namespaces k get ns
(flood_ml_local2) ➜ Documents k get ns
NAME STATUS AGE
default Active 7d22h
kube-node-lease Active 7d22h
kube-public Active 7d22h
kube-system Active 7d22h
kubernetes-dashboard Active 7d22h
Create a new namespace k create ns <ns_name>
(base) ➜ Documents k create ns argo-local
namespace/argo-local created
# verify
(base) ➜ Documents k get ns
NAME STATUS AGE
argo-local Active 4h54m
default Active 8d
kube-node-lease Active 8d
kube-public Active 8d
kube-system Active 8d
kubernetes-dashboard Active 8d
(base) ➜ Documents
Create argo server on k8s
(base) ➜ Documents k apply -n argo-local -f https://raw.githubusercontent.com/argoproj/argo/stable/manifests/quick-start-postgres.yaml
customresourcedefinition.apiextensions.k8s.io/clusterworkflowtemplates.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/cronworkflows.argoproj.io created
....
Then forward the port to local machine:
(base) ➜ Documents k -n argo-local port-forward deployment/argo-server 2746:2746
Forwarding from 127.0.0.1:2746 -> 2746
Forwarding from [::1]:2746 -> 2746
Argo server UI is now accessible at https://localhost:2746. You may have to agree to security warnings before accessing this page.
Get pods k get pods -n <namespace>
(base) ➜ Documents k get pods -n argo-local
NAME READY STATUS RESTARTS AGE
argo-server-7fbf57bc87-f82wl 1/1 Running 3 (2m11s ago) 2m31s
minio-74474c548b-6hf48 1/1 Running 0 2m31s
postgres-6b5944c545-tpnfb 1/1 Running 0 2m31s
workflow-controller-7d4bf4fd7d-x4qkk 1/1 Running 2 (2m9s ago) 2m31s
(base) ➜ Documents
Creating Argo workflow using kubectl
(base) ➜ ~ k create -n argo-local -f Documents/code/temp/wf-hello-world.yaml
workflow.argoproj.io/hello-world-p4wlj created