Objets : suite¶
Les objets communs que nous rencontrerons seront :
pod
replicaset
deployment
service
ingress
volume
Pod¶
Un objet de type « Pod » représente l’existence d’un conteneur. C’est l’objet le plus « simple » et qui va donner lieu à un ordonnancement immédiat du lancement de conteneur sur un noeud. Lorsqu’on crée un objet de type Pod, l’ordonnanceur de Kubernetes choisit un noeud et lui demande de s’occuper de ce pod. Grossièrement, cela va se traduire par l’exécution d’une commande telle que « docker run » sur ce noeud via le démon « kubelet ».
Par exemple :
apiVersion: v1
kind: Pod
metadata:
name: hello-world
namespace: default
spec:
containers:
- name: hello-world
image: hello-world
env:
- name: HELLO
value: WORLD
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
Pour plus de détails, la documentation est ici : https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#podspec-v1-core
ReplicaSet¶
Un objet de type replicaSet permet de demander l’existence d’un certain nombre de répliques de pods. Lorsqu’on crée un objet de type replicaset, le controleur « built in » de Kubernetes va se charger de garantir qu’à tout moment les objets pods existent. Par exemple :
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: hello-world
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: hello-world
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: hello-world
Pour la curiosité, le code source du controleur est ici : https://github.com/kubernetes/kubernetes/blob/master/pkg/controller/replicaset/replica_set.go
Deployment¶
Un objet de type deployment est un objet kubernetes qui va s’assurer de l’existence d’un ensemble de pods. Par exemple :
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: hello-world
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: hello-world
Service¶
Supposons que notre conteneur hello-world serve une page sur son port 8080. Pour des raisons de montée en charge, on demande plusieurs « replicas » de ce conteneur, et on a donc plusieurs pods qui tournent et servent cette page, cahcun ayant son adresse IP. Depuis un pod quelconque du cluser, j’aimerai pouvoir accéder à cette page sans avoir à choisir quel pod contacter précisément. Pour cela, kubernetes donne la possibilité de créer une adresse IP virtuelle, telle que si on la contacte, on sera automatiquement dirigé vers l’un quelconque des pods.
Un objet de type service est un objet kubernetes qui permet de créer un couple (IP, port) au sein du cluster et de relier ce couple à un ensemble de pods sur un targetPort donné. Lorsqu’on contactera cette (IP,port) (par exemple via curl IP:port), on sera automatiquement mis en relation avec l’un quelconque des pods, au hasard, sur le port « targetPort ».
apiVersion: v1
kind: Service
metadata:
name: hello-world
namespace: default
spec:
type: ClusterIP
ports:
- port: 8080
targetPort: 8080
protocol: TCP
name: http
selector:
app: hello-world
Ingress¶
Un objet de type ingress est un objet kubernetes qui va permettre d’exposer un hote http à l’extérieur du cluster et rediriger vers un service donné.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-world
namespace: default
spec:
rules:
- host: hello-world.info
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: hello-world
port:
number: 8080