Commandes propres à Kubernetes

Créer un namespace

kubectl create ns <new-namespace>

Savoir si une ressource appartient à un namespace

kubectl api-resources --namespaced=true

Savoir si une ressource appartient PAS à un namespace

kubectl api-resources --namespaced=false

Switcher de namespace

# Install kubens with the following command: 
# Sur Mac: brew install kubectx
# Sur Linux (les 3 commandes qui suivent): 
# sudo git clone https://github.com/ahmetb/kubectx /opt/kubectx
# sudo ln -s /opt/kubectx/kubectx /usr/local/bin/kubectx
# sudo ln -s /opt/kubectx/kubens /usr/local/bin/kubens

kubens <namespace>

# Enregistre de manière permanente le namespace pour toutes les commandes kubectl suivantes dans ce contexte
kubectl config set-context --current --namespace=NOM_DU_NAMESPACE

Connaître le cluster dans lequel on se situe

kubectl config get-contexts

Connaître le namespace dans lequel on se situe

kubectl config view | grep namespace

# Alternative: 
# kubectl config view --minify --output 'jsonpath={..namespace}'

Effacer un namespace

kubectl delete ns <namespace-to-delete>

Voir les ressources utilisées par les nodes

# Nécessite heapster
kubectl top node

Voir les logs d'une app particulière dans un namespace particulier

kubectl logs -l app=catalog-catalog-controller-manager -n catalog

Voir le cluster sur lequel kubectl est connecté

kubectl config current-context

Lister les clusters configurés dans kubeconfig

kubectl config get-clusters

Switcher de cluster en cluster

kubectl config use-context cluster_name

Obtenir quelques informations sur le cluster

kubectl cluster-info

Voir les noeuds du cluster

kubectl get nodes

Port forward un service sur k8s chez vous

kubectl -n NAMESPACE_DANS_LEQUEL_SE_TROUVE_LE_SERVICE port-forward svc/NOM_DU_SERVICE_AUQUEL_VOUS_VOULEZ_ACCEDER PORT_CHEZ_VOUS_POUR_ACCEDER_AU_SERVICE:PORT_DU_SERVICE_SUR_K8S

Le port sera bindé sur 127.0.0.1. Il est possible d'ajouter le flag --address 0.0.0.0. (Attention à la sécurité)


Installer le dashboard k8s et y accéder

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

kubectl proxy

Maintenant rendez-vous à l'adresse suivante:

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login

Une mire d'authentification va apparaitre pour se connecter au dashboard. Privilégier l'authentification par token. Pour obtenir ce dernier utiliser les commandes suivantes:

TOKEN=$(kubectl describe secret $(kubectl get secrets | grep default | cut -f1 -d ' ') | grep -E '^token' | cut -f2 -d':' | tr -d '\t' | sed -e 's/^[[:space:]]*//')

echo $TOKEN

Déployer un 1er service

kubectl run hello-nginx --image=nginx --port=80
kubectl get pods
kubectl get deployments
kubectl expose deployment hello-nginx --type=NodePort
kubectl describe service hello-nginx
kubectl get services

NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
hello-nginx   NodePort    10.111.152.236   <none>        80:31256/TCP   58s
kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP        46m

Se rendre sur l'URL suivante pour accéder au service Nginx (Nodeport): http://localhost:31256/


Troubleshooting

Voir les events et status des noeuds

kubectl get events --sort-by=.metadata.creationTimestamp
kubectl describe nodes

Voir la consommation cpu et memory des pods les plus gourmands

kubectl top pods

Lister les containers par pods

kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\
sort

# Pour un pod particulier, pour avoir les container names dans le pod, on peut aussi exécuter:
kubectl logs POD_NAME 
# S'il y a plusieurs containers un message d'erreur apparaîtra indiquant de selectionner un container --> choose one of: [container-name-1 container-name-2]

Entrer dans un pod

kubectl exec -it shell-demo -- /bin/bash

Créer un Single node cluster avec kubeadm sur Ubuntu

Installer kubeadm:

apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

Déployer le single node cluster:

kubeadm init
# Puis suivre les informations qui apparaissent

Effacement du cluster

# Obtenir le nom du noeud
kubectl get nodes

# Drainer le noeud 
kubectl drain NOM_DU_NOEUD --delete-local-data --force --ignore-daemonsets

# On l'efface
kubectl delete node NOM_DU_NOEUD

# On reset kubeadm
kubeadm reset

# Un reboot permet d'effacer les interfaces réseaux en trop 
sudo reboot

Commandes propres à EKS (Kubernetes AWS)

Se connecter à son cluster EKS nouvellement créé

aws --profile=<profile-name> eks update-kubeconfig --name <cluster-name>
export KUBECONFIG=~/.kube/config-<of-your-cluster>

Lister les clusters EKS

aws eks list-clusters

Commandes propres à AKS (Kubernetes Azure)

Se connecter à son cluster AKS nouvellement créé

az login

# Ajoute la conf du cluster dans le kube config
az aks get-credentials --resource-group NOM_DU_RESSOURCE_GROUPE --name NOM_DU_CLUSTER_K8S

# Vérification
kubectl config get-contexts