{{tag>Brouillon K8S}} # Notes Kubernetes k8s - Utilisation Voir : * https://kubernetes.io/fr/docs/reference/kubectl/cheatsheet/ * https://signoz.io/guides/how-to-check-what-port-a-pod-is-listening-on-with-kubectl-and-not-looking-at-the-dockerfile/ ~~~bash kubectl api-resources -o wide kubectl explain deploy kubectl get nodes kubectl get pods --all-namespaces kubectl --namespace=kube-system get all kubectl --kubeconfig .kube/config get nodes export KUBECONFIG=/etc/kubernetes/admin.conf #export KUBECONFIG=~/.kube/config cp /etc/kubernetes/admin.conf ~/.kube/config kubectl --server=https://192.168.56.21:6443 get nodes -o wide kubectl get deployment --all-namespaces kubectl get svc ~~~ ## Administration Diagnostiquer le dysfonctionnement d'un pod Kubernetes ~~~bash # Voir les logs kubectl logs monpod # Si le pod est en erreur kubectl describe po monpod # Si le pod n'existe pas, voir le replicaset qui devrait le créer (s'il y en a un) kubectl describe rs monreplicaset # Si le replicaset n'existe pas, voir son déploiement/statefulset/autre kubectl describe deploy mondeploiement kubectl describe sts mon statefulset ~~~ Vous pouvez consulter ce diagramme pour le troubleshooting d'un déploiement Consulter les logs de l'api server Kubernetes On y trouvera notamment les requêtes récentes des utilisateurs et leur droits RBAC ~~~bash kubectl -n kube-system logs -l component=kube-apiserver --tail 1000 ~~~ Consulter les logs de plop Peut permettre d'avoir des détails sur les messages d'erreurs de plop ~~~bash kubectl -n plop logs -l app=plop -c plop --tail 1000 ~~~ Note: on pourra passer plop en mode debug pour avoir des informations plus complètes (kubectl -n plop edit ds plop, puis "- --log-level=debug" dans les arguments du container) Lister les pvs de chaque node Permet de voir les pvs (persistent volumes) disponibles sur chaque node, par exemple pour débugger un statefulset dont un pvc est en état "Pending" ~~~bash export JSONPATH='{range .items[*]}{@.metadata.name} {@.spec.nodeAffinity.required.nodeSelectorTerms[*].matchExpressions[*].values[]} {@.status.phase} {@.spec.capacity.storage};{end}' kubectl get pv -o jsonpath="$JSONPATH" | tr ";" "\n" ~~~ Objets Kubernetes Commandes pour retrouver le pod / daemonset / deploiement responsable du container "plop": ~~~bash # À utiliser sur un master, les noeuds n'ont pas la commande "kubectl" kubectl get pod -A | grep plop kubectl get ds -A | grep plop kubectl get deploy -A | grep plop ~~~ Attendre un état - ex que les pods soient prêts ~~~bash An alternative approach is to use kubectl wait You could: ~~~bash kubectl wait pod --all --for=condition=Ready --namespace=${ns} kubectl wait pod --all --for=condition=Ready -A ~~~ Procédures Restart des pods Se placer dans le namespace des frontaux valplop ~~~bash kubectl config set-context $(kubectl config current-context) --namespace=zzz-valplop ~~~ Vérifier qu'on accède bien au cluster k8s en listant les pods ~~~bash kubectl get pods ~~~ Résultat attendu ~~~ NAME READY STATUS RESTARTS AGE bac-valplop-8686574455-bnplq 4/4 Running 0 6d21h bac-valplop-8686574455-ddxcf 4/4 Running 0 4d3h bac-valplop-8686574455-dr25b 4/4 Running 0 6d21h [...] ~~~ Vérifier quelle ressource deployment on veut relancer ~~~bash kubectl get deployments.apps ~~~ Lancer un rollout (= restart des pods du deployment ciblé) ~~~bash kubectl rollout restart deployment ~~~ On peut surveiller le restart séquentiel des pods avec l'utilitaire k9s, les nouveaux pods passeront successivement les états Pending, ContainerCreating, Running... les anciens passeront en Terminated et disparaitront Restart pod récalcitrant ~~~bash kubectl delete pod cassandra-cl02livebgl-a-0 --grace-period=0 --force ~~~ Je veux savoir ma conso sur mon namespace ~~~bash kubectl -n $namespace get ResourceQuota kaas-compute-resources-$namespace -o yaml ~~~ ### Restart a resource Resource rollout will be restarted. ~~~bash kubectl rollout restart RESOURCE ~~~ Examples ~~~ # Restart all deployments in the test-namespace namespace kubectl rollout restart deployment -n test-namespace # Restart a deployment kubectl rollout restart deployment/nginx # Restart a daemon set kubectl rollout restart daemonset/abc # Restart deployments with the app=nginx label kubectl rollout restart deployment --selector=app=nginx ~~~ ## Notes install nodes Clef SSH /root/.ssh/ apt-get install curl Install kubectl Install kubeadm Install Docker ~~~bash kubectl get nodes -o wide kubectl version kubectl cluster-info ~~~ To further debug and diagnose cluster problems, use `kubectl cluster-info dump` ~~~bash kubectl get namespaces kubectl api-resources ~~~ ~~~ # kubectl run hello --image=hello-world pod/hello created # kubectl get pods NAME READY STATUS RESTARTS AGE hello 0/1 CrashLoopBackOff 1 (4s ago) 10s ~~~ `CrashLoopBackOff` signifit que le container fait que de cracher, ce qui est normal pour le 'hello-word' qui se termine systématiquement ~~~bash kubectl run nginx --image=nginx kubectl describe pod nginx ~~~ Get a shell to the running container ~~~bash kubectl exec -ti nginx -- /bin/bash ~~~ Get a shell to a specific running container ~~~bash # Get containers list kubectl get pod awx-task-777db545b8-7npjl -o jsonpath='{.spec.containers[*].name }{"\n"}' kubectl exec -ti awx-task-777db545b8-7npjl --container awx-ee -- /bin/bash ~~~ Port mapping ~~~bash kubectl port-forward nginx 8080:80 ~~~ ~~~bash kubectl create deployment nginx-deployment --image=nginx kubectl expose deployment nginx-deployment --port=8080 --target-port=80 kubectl get services ~~~ ~~~ # kubectl describe deployment nginx-deployment | grep ^Replicas: Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable # kubectl scale deployment nginx-deployment --replicas=2 deployment.apps/nginx-deployment scaled ~~~ Création d'un pod `nginx.yaml` ~~~yaml apiVersion: v1 kind: Pod metadata: name: www spec: containers: - name: nginx image: nginx:1.12.2 ~~~ ~~~bash kubectl create -f pod.yaml ~~~ ## Autres ~~~bash export POD_NAME=$(kubectl get pods --namespace kube-system -l "app.kubernetes.io/name=headlamp,app.kubernetes.io/instance=my-headlamp" -o jsonpath="{.items[0].metadata.name}") export CONTAINER_PORT=$(kubectl get pod --namespace kube-system $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") kubectl --namespace kube-system port-forward $POD_NAME 8080:$CONTAINER_PORT ~~~