Un pod est un hôte logique pouvant contenir plusieurs conteneurs. Ces conteneurs sont donc sur le même hote et partagent une adresse IP commune + un espace de port.
La mise à l'échelle est faite à partir du Pod.
Les conteneurs du pod peuvent communiquer entre eux, notamment avec localhost
. Les conteneurs doivent donc coordonner leurs ports au sein d'un même pod.
Le pod spécifie également un emsemble de volumes partagés que les conteneurs peuvent accéder. Les données peuvent donc survivre au redémarrage d'un conteneur.
Le namespace est un cluster virtuel hebergé sur le même cluster physique. Les namespace fournissent une base pour le naming. Le nom de ressources doit être unique dans un namespace.
Est le contrôleur de pod. Kubelet est un démon qui fonctionne sur chaque noeud et prend en charge le démarrage, l'arrêt et la maintenance des pod.
les applications hautement disponibles, qui attendront que les pods soient remplacés avant leur arrêt et au moins avant leur suppression.
Les resources Kubernetes permettent de définir les composant d'une application (POD):
- service (service du POD)
- serviceAccount: processes /service tournant dans un pod (généralement 1)
- deployment: lie leservice avec une image (possibilité de réaliser des version différentes - a chaque déploiement, un pod est créé)
Il s'agit de fichiers YAML
permettant de définir le déploiement d'une application/pod.
Ces définitions de ressources peuvent être étendues (notamment via des framework tournant sous K8 - Istio e.g.)
Kubernetes permet d'exposer les services de 3 manières différentes:
- ClusterIP: définit un service interne au cluster (application à l'intérieur du cluster peuvent y avoir accès, pas d'accès externe) - c'est le type par défaut.
- NodePort: ouvre un port spécifique sur tous les noeuds du cluster (VMs). Le port choisit doit être compris entre 30000 et 32767. Un service par port.
- LoadBalancer: permet d'associer une IP à un service. On peut y associer n'importe quel protocole. -> cf externalip config
Un Ingress n'est pas un type de service, l'ingress est un router qui se place en front des services. Il contrôle tout le traffic entrant. (et parfois le traffic interne - cf service Mesh)
Belle illustration + plus d'info
Un Ingress expose les routes HTTP et HTTPS de l’extérieur du cluster à services au sein du cluster
Un contrôleur d’Ingress est responsable de l’exécution de l’Ingress, généralement avec un load-balancer.
Le controleur d'ingress ne démarre pas avec le cluster, il est déployé dans un pod spécifique qui vérifie l'endpoint /ingresses.
Kubernetes maintient et supporte les controlleurs nginx et GCE (Ingress Controllers - Kubernetes)
Implémentation pour K8s (outils)
Les controleurs d'ingress implémentent généralement tous un service disovery, le SSL et un support pour les sockets.
Voici les implémentations les plus souvent citées:
- traefik
- kong
- istio (service mesh -> controle aussi bien le trafic entrant que le trafic interne)
- Skipper (Zalando) lien
Article permettant de comparer les ingress-components + sheet Excel
l'ingress controler d'Istio est divisé en 2 composant:
- Gateway: est utilisé pour configurer les istio-proxies (envoy). Une gateway permet à un type de traffic spécifique de rentrer dans le cluster via les proxys envoy.
- VirtualService: envoie le traffic à une ressource/service.
la commande suivante
kubectl get svc istio-ingressgateway -n istio-system
80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:32243/TCP,8060:31504/TCP,853:32380/TCP,15030:30112/TCP,15031:32472/TCP
permet de donner les redirection de port
plus d'info info
/!\ l'ingressgateway n'écoute que sur les ports qui lui ont été configurés (80, 443, grafana, kibana,...). Pour modifier ces ports il faut éditer le service:
kubectl edit svc istio-ingressgateway -n istio-system
ajouter:
name: custom
port: 81
targetPort: 81
Pas de besoin de fichiers de configuration pour router les services.
Quand le service rémarre, on ajoute une information permettant à treafic de detecter que le service est bien up.
exemple docker compose:
whoami:
# A container that exposes an API to show its IP address
image: containous/whoami
labels:
- "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"
Lorsque l'on travaille sur une infrastructure bare-metal, il faut que K8 puisse exposer une adresse ip
- pour son ingress controller,
- lors qu'un service est définit en load-balancing,
- ...
L'external load balancer est un service qui permet d'allouer une adresse ip an fonction d'une configuration réseau du type: 10.10.150.0/24
.
Installation de MetalLB sur:
- Istio and MetalLB on Minikube - Emir Mujic - Medium
- Kubernetes Metal LB for On-Prem / BareMetal Cluster in 10 minutes
/!\ Minikube n'est pas packagé avec un external LB car Minikube n'est pas destiné à être utilisé sur plusieurs nodes. Work around:
minikube tunnel
va créer ce LB. plus d'info: LoadBalancer support with Minikube for Kubernetes
installe miniKube en 3 etapes sur mac : Install Minikube - Kubernetes
Upgrade minikube version:
minikube version
brew cask install minikube
brew cask upgrade minikube
brew cask reinstall minikube
- hyperviseur (VirtualBox)
- kubectl
- Minikube
bonne resource: -> Local Kubernetes setup on macOS with minikube on VirtualBox and local Docker registry · GitHub
concepts Minikube: concepts minikube
minikube start
minikube start --memory=8000 --cpus=4
minikube stop
Resetting and restarting your cluster
-> minikube delete
#interface web
minikube dashboard
Afficher le service Nifi
-> minikube service nifi
Afficher la liste des services
-> minikube service list
minikube ssh
$ top
GiB Mem : 12.4/15.7
This shows 12.4GiB used of an available 15.7 GiB RAM within the virtual machine.
ce fait avec le CLI kubectl
kubectl
permet d'obtenir le résultat sour différente forme, comme en JSON (-o json).
#démarrer seulement un conteneur
kubectl apply -f ./nifi.yml
kubectl delete -f nifi/nifi.yml
Afficher la liste des pods
-> kubectl get
Obtenir seulement le nom d'un POD
-> kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}'
-> kubectl get pod --namespace logging
Afficher la liste des services pour un namespace
-> kubectl get svc -n istio-system
-> kubectl get service -n istio-system
Afficher la liste de namespaces
-> kubectl get namespace
-> kubectl delete namespaces <insert-some-namespace-name>
Supprimer tous les pod et service d'un namespace:
-> kubectl -n default delete po,svc,deployment --all
-> si on ne supprime pas les déploiements,
Afficher la liste des gateways
-> kubectl get gateway
kubectl logs my-pod
kubectl logs --tail=200 nifi-c8bf9844f-gqzjw
kubectl logs -f nifi-6f7495757b-gffqh
kubectl describe pods nifi-5d8477db68-tcg2z
kubectl exec -it nifi-c8bf9844f-gqzjw -- sh
Event liés à kubernetes
-> kubectl get events --sort-by=.metadata.creationTimestamp
kubectl cheatsheet: kubectl Cheat Sheet - Kubernetes hubernetes aide: Expose Pod Information to Containers Through Files - Kubernetes