Summary: Kubernetes hints, tips, oneliners and best practices.
Date: 15 December 2024
Pods
Basic scheduling unit that holds one or more containers.
Nodes
Machines (physical or virtual) in the cluster where pods are scheduled.
Cluster
Collection of nodes and associated resources.
Kubelet
An agent running on each node, responsible for managing the node and its containers.
Kubernetes Controller Manager
Manages controllers to regulate the state of the system.
Kube Proxy
Maintains network rules to allow communication between pods and external traffic.
etcd
Consistent and highly-available key-value store used for all cluster data.
API Server
Serves the Kubernetes API and is the primary entry point for administrative tasks.
Scheduler
Assigns pods to nodes based on resource requirements and other constraints.
Controller
Maintains the desired state of the system, such as ensuring the correct number of replicas for a particular application.
Service
Provides a consistent way to access a set of pods.
Namespace
A way to divide cluster resources between multiple users.
Volumes
Kubernetes supports various types of storage volumes, providing data persistence for pods.
Secrets and ConfigMaps
Mechanisms to manage sensitive information and configuration data separately from application code.
Deployment
A higher-level resource that manages updates to applications by handling the deployment and scaling of pods.
StatefulSets
Manages stateful applications, ensuring stable network identities and persistent storage for pods.
DaemonSets
Ensures that specific pods run on all (or specific) nodes for cluster-wide tasks like logging or monitoring.
Jobs and CronJobs
Run short-lived or scheduled tasks within the cluster.
Ingress
Manages external access to services, typically HTTP.
Network Policies
Define how groups of pods can communicate with each other and other network endpoints.
Horizontal Pod Autoscaler
Automatically adjusts the number of replica pods to handle varying load.
Vertical Pod Autoscaler
Adjusts the resources allocated to individual pods based on their usage.
Operators
A way to package, deploy, and manage applications using Kubernetes APIs and controllers.
Kubectl
The command-line interface to interact with Kubernetes clusters.
Get cluster informationkubectl cluster-info
List all k8s objects from Cluster Control planekubectl get all --all-namespaces
Deploy and delete a manifest filekubectl apply -f manifest.yaml kubectl delete -f manifest.yaml
Deploy and delete a manifest folderkubectl apply -f kube-manifests/ kubectl delete -f kube-manifests/ # Recursive kubectl apply -R -f kube-manifests/ kubectl delete -R -f kube-manifests/
Deploy to a namespacekubectl apply -f manifest.yaml -n dev1
Get the kubectl versionkubectl version
List all nodeskubectl get nodes kubectl get nodes -o wide
Get detailed information about a nodekubectl describe node aks-agentpool-20417106-vmss000001
Remove taint from a nodekubectl taint nodes aks-agentpool-20417106-vmss000001 CriticalAddonsOnly=true:NoSchedule-
Get node resource performancekubectl top nodes kubectl top nodes --sort-by=cpu kubectl top nodes --sort-by=memory # Sort from low to high kubectl top nodes --sort-by=cpu --no-headers | sort -k3 -n kubectl top nodes --sort-by=memory --no-headers | sort -k3 -n
Connect to nodes in a private aks cluster# Based on https://learn.microsoft.com/en-us/azure/aks/node-access where is explained on how to connect to aks nodes. However, this does not work for a private cluster as the container is not available. You can, assuming that you've added the container to your private container registry, use that one: # Get all the nodes kubectl get nodes -o wide # Start the debug command to connect to the node using an image from a private container registry kubectl debug node/aks-npuser001-34232393-vmss000001 -it --image=acreuwprd.azurecr.io/docker/docker/library/busybox:1.37
Get & Describe Limitskubectl get limits -n dev3 kubectl describe limits default-cpu-mem-limit-range -n dev3
Get Resource Quotakubectl get quota -n dev3 kubectl describe quota ns-resource-quota -n dev3
Check cpu and memory in pods, notice that this is actually the resources of the host# cpu cat /proc/cpuinfo | grep proc # memory free -h
List all namespaces and work with namespaces for other objectskubectl get namespaces kubectl get ns kubectl get pods --all-namespaces
Create a namespacekubectl create namespace dev1 kubectl create namespace dev2
Delete a namespacekubectl delete ns dev1 kubectl delete ns dev2
Set a default namespace# Set the default namespace and expected output kubectl config set-context --current --namespace=ops Context "aks-cluster" modified.
List all podskubectl get pods kubectl get po
List all pods from a specific namespacekubectl get pods -n dev1
Get logging from a podkubectl logs -f podname # pods can have changing names, so you can use this command if you don't know the podname: kubectl logs -f $(kubectl get po | egrep -o 'external-dns[A-Za-z0-9-]+')
Get detailed information about a podkubectl describe pod podname kubectl describe pod myapp1-deployment-5bc58f6848-7vm2v
Get pod specifications like cpu and memorykubectl get pod <pod-name> -o yaml
Get pod resource performancekubectl top pods kubectl top pods --sort-by=cpu kubectl top pods --sort-by=memory
List all deploymentskubectl get deployments kubectl get deploy
Restart a deploymentkubectl rollout restart deployment/kube-prometheus-stack-grafana
Restart all deployments in a namespacekubectl rollout restart deployment -n shared
Apply a manifestkubectl apply -f kube-prometheus-stack.yaml --server-side -n shared kubectl apply -f kube-prometheus-stack.yaml --server-side --force-conflicts -n shared
List all serviceskubectl get services kubectl get svc
List all services from all namespaceskubectl get services --all-namespaces # Sorted on name kubectl get services --all-namespaces --sort-by=.metadata.name # Sorted on type kubectl get services --all-namespaces --sort-by=.spec.type # Get all services of type LoadBalancer kubectl get services --all-namespaces | grep LoadBalancer
List services with a specific labelkubectl get service -l app.kubernetes.io/name=ingress-nginx --namespace ingress-basic
Describe a servicekubectl describe svc proxy-public --namespace dev1
List all StatefulSetskubectl get statefulsets kubectl get sts
Kill all the pods in a statefulSet by setting the number of replicas to 0kubectl scale statefulset myapp1 --replicas=0
Restart a statefulsetkubectl rollout restart statefulset/myapp1
Restart all statefulsets in a namespacekubectl rollout restart statefulset -n shared
List all storage classeskubectl get storageclasses kubectl get sc
List all persistent volumes claimskubectl get pvc
List all persistent volumes (the actual storage)kubectl get pv
Delete a persistent volumekubectl delete pv my-pv
List all storage information at oncekubectl get sc,pvc,pv
Get all ingresskubectl get ingress
List all secretskubectl get secrets
Create a secretkubectl create secret generic azure-config-file --from-file=azure.json
Decode a secretecho "cGxhY2Vob2xkZXJwYXNzd29yZA==" | base64 --decode
Decode a secret with powershellkubectl get secret argocd-initial-admin-secret --namespace ops -o json | ConvertFrom-Json | select -ExpandProperty data | % { $_.PSObject.Properties | % { $_.Name + [System.Environment]::NewLine + [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($_.Value)) + [System.Environment]::NewLine + [System.Environment]::NewLine } }
Connect to MySQL using Kubectl by installing a sql client podkubectl run -it --rm --image=mysql:8.0 --restart=Never mysql-client -- mysql -h akswebappdb201.mysql.database.azure.com -u dbadmin -p<password>
Reset Grafana admin password from within the pod# Start k8s vscode extension -> vtxops -> configuration -> secrets -> kube-prometheus-stack-grafana -> Note down the admin-password # opsnamespace -> workloads -> pods -> kube-prometheus-stack-grafana-xxxx # Open the terminal (click terminal icon next to the name) grafana cli admin reset-admin-password <admin-password>
Check for kafka topics# open a terminal on one of the kafka brokers (eg kafka-kafka-0) ./bin/kafka-topics.sh --list --bootstrap-server localhost:9092
Get all resource kinds with their name from a manifest:cat opentelemetry-operator.yaml | grep -i '^kind\|^ name:'
Here are some examples I use to perform actions on multiple resources at once.
Remove all finalizers for kafka topicskubectl get kafkatopic.kafka.strimzi.io -n shared -o name | while read topic; do echo "Removing finalizer from $topic" kubectl patch $topic -n shared -p '{"metadata":{"finalizers":[]}}' --type=merge done
Delete all jobs that start with “backup”
export NAMESPACE=shared kubectl get jobs -n $NAMESPACE -o name | grep backup- | while read job; do echo "Deleting $job" kubectl delete $job -n $NAMESPACE done
Connect to AKSaz aks get-credentials --resource-group myResourceGroup --name myAKSCluster # overwrite the existing context az aks get-credentials --resource-group myResourceGroup --name myAKSCluster --overwrite-existing
Connect to AKSaz login az aks install-cli # Add C:\Users\sjoer\.azure-kubectl to path # Advanced System Settings -> Environment Variables -> User Variables -> Path -> New # Configure Cluster Creds (kube config) az aks get-credentials --resource-group aks-rg1 --name aksdemo1
az aks nodepool show --resource-group aks-rg1 --cluster-name aksdemo1 --name agentpool # Remove all taints (must be done from cloud shell as it does not work locally) az aks nodepool update --resource-group aks-rg1 --cluster-name aksdemo1 --name agentpool --node-taints "" # Get the resource group name of the AKS cluster az aks show --resource-group aks-rg1 --name aksdemo1 --query nodeResourceGroup -o tsv # Create a public IP address with a static allocation az network public-ip create --resource-group <REPLACE-OUTPUT-RG-FROM-PREVIOUS-COMMAND> --name myAKSPublicIPForIngress --sku Standard --allocation-method static --query publicIp.ipAddress -o tsv
# Install Helm3 (if not installed) choco install kubernetes-helm # Add a repository helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update
Use Helm to deploy an NGINX ingress controllerhelm install ingress-nginx ingress-nginx/ingress-nginx ` --namespace ingress-basic ` --set controller.replicaCount=2 ` --set controller.nodeSelector."kubernetes\.io/os"=linux ` --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux ` --set controller.service.externalTrafficPolicy=Local ` --set controller.service.loadBalancerIP="172.205.120.177"
This wiki has been made possible by: