#
Kubectl
The Kubernetes command-line tool, Kubectl allows you to run commands against Kubernetes clusters. You can use kubectl to deploy applications, inspect and manage cluster resources, and view logs.
#
Basic Commands
Get configured contexts: kubectl config get-contexts
Switch context: kubectl config use-context <NAME>
Get pods: kubectl get pods -n <NAMESPACE>
Kill pod: kubectl delete pod -n <NAMESPACE> <POD_NAME> --force --grace-period=0
Get more details (for example of a pod): kubectl get pod -n <NAMESPACE> <POD_NAME> -o wide
Describe pod: kubectl describe pod -n <NAMESPACE> <POD_NAME>
Get persistent volumes: kubectl get pvc
Get pods filtered on label: kubectl get pods --all-namespaces -l app=nginx
Open container shell: kubectl exec -n <NAMESPACE> --stdin --tty <POD_NAME> -- /bin/sh
Sort by (for example pod names): kubectl get pods --all-namespaces --sort-by=.metadata.name
Sort by (for example persistent volumes): kubectl get pods --all-namespaces --sort-by=.spec.capacity.storage
Sort by (for example events): kubectl get events --sort-by=.metadata.creationTimestamp
Get all supported resource types: kubectl api-resources
Create file and apply (secret example)
Because kubectl create
can only be run once, you can output the secret as YAML and pipe this to kubectl apply
.
kubectl create secret generic <SECRET_NAME> -n <NAMESPACE> --from-literal=<USERNAME_VARIABLE>=<USERNAME> --from-literal=<PASSWORD_VARIABLE>=<PASSWORD> --dry-run=client -o yaml | kubectl apply -f -
-> More in the Cheatsheet
#
Namespaces
Get all namespaces: kubectl get namespace
Create namespace: kubectl create namespace <NAMESPACE_NAME>
Create namespace (example YAML):
apiVersion: v1
kind: Namespace
metadata:
name: <NAMESPACE>
-> Apply namespace: kubectl apply -f .\namespace.yml
#
Examples
#
Deployment of a basic Nginx Server
deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: <DEPLOYMENT_NAME>
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
-> Apply deployment: kubectl apply -f .\deployment.yml -n <NAMESPACE>
service.yaml:
apiVersion: v1
kind: Service
metadata:
name: <SERVICE_NAME>
spec:
type: ClusterIP
selector:
app: nginx
ports:
# By default and for convenience, the `targetPort` is set to the same value as the `port` field.
- port: 80
targetPort: 80
# Optional field
# By default and for convenience, the Kubernetes control plane will allocate a port from a range (default: 30000-32767)
# nodePort: 30011
-> Apply service: kubectl apply -f .\service.yml -n <NAMESPACE>
ingress.yaml:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: <INGRESS_NAME>
spec:
rules:
- host: nginx.apps.yourdomain.ch
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: <SERVICE_NAME>
port:
number: 80
-> Apply ingress: kubectl apply -f .\ingress.yaml -n <NAMESPACE>
#
Windows: Autocompletion
Add Kubectl autocompletion to load on each PowerShell session:
kubectl completion powershell >> $PROFILE
#
Troubleshooting Kubernetes
#
Kubectl: Get Containers Resource Configuration (find Containers without configured Resources)
JSONPATH
kubectl get pods -n <NAMESPACE> -o jsonpath="{range .items[*]}{.metadata.name}{'\t'}{.spec.containers[*].resources}{'\n'}{end}"
Custom Columns
kubectl get pods -n grafana --output=custom-columns="POD:.metadata.name,CONTAINERS:.spec.containers[*].name,REQUESTS:.spec.containers[*].resources.requests,LIMITS:.spec.containers[*].resources.limits"