Outils pour utilisateurs

Outils du site


informatique:kebernetes:kube_service

Ceci est une ancienne révision du document !


Service / Réseau Kubernetes

Les services permettent de publier l'accès aux Pods au sein du cluster ou à l'extérieur. Les conteneurs au sein d'un Pod partagent la même configuration réseau et sont donc accessible par la même IP interne au cluster.

Il y a plusieurs possibilité selon ce que l'on souhaite faire.

ClusterIP

C'est le mode par défaut de Kubernetes lorsque l'on crée un service. Il permet d'exposer uniquement un port au sein du cluster uniquement. Il n'est pas publié vers l'extérieur.

Ci-dessous un fichier YAML pour démarrer un Pod nginx et son service :

vim pod_nginx_service.yml

Contenu :

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: mywebapp
spec:
  containers:
  - name: nginx
    image: nginx:stable
    ports:
      - containerPort: 80
        # Ci-dessous on affecte un nom au port
        #name: http-web-svc

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  # ClusterIP étant le mode par défaut, il n'est pas obligé de définir le type pour le créer.
  #type: ClusterIP
  selector:
    app: mywebapp
  ports:
  - name: mywebport
    protocol: TCP
    port: 8080
    targetPort: 80
    # Si un nom a été donné au port du conteneur on peut cibler le port par son nom.
    #targetPort: http-web-svc

Explications, nous avons un YAML pour créer 2 objets :

  • Un Pod :
    • metadata.labels.app : Il est important de définir le nom pour qu'il soit ciblé automatiquement par le service.
  • Un service:
    • metadata.name: Définir un nom pour le service afin de l'identifier.
    • spec.selector.app : Le nom doit correspondre à metadata.labels.app afin que la publication du service cible le pod à publier.
    • spec.ports.name: Indiquer le nom du port
    • spec.ports.protocol: Indiquer si le port est en TCP/UDP.
    • spec.ports.port : C'est le port qui sera publié au sein du cluster.
    • spec.ports.targetPort : C'est le port ciblé coté conteneurs.

Création du pod et du service :

kubectl apply -f pod_nginx_service.yml

Listons le pods créé :

kubectl get pods

Résultat attendu :

NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          21s

Listons les services :

kubectl get services
# Même commande en plus court
#kubectl get svc

l'IP de cluster 10.110.183.49 a été affecté au service :

NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP    8d
nginx-service   ClusterIP   10.110.183.49   <none>        8080/TCP   27s

Pour tester l'accès au nginx :

curl http://10.110.183.49:8080

Ci-dessous, nous allons lister les points de terminsons :

kubectl get endpoints
# Version courte
#kubectl get ep

Ce que nous constatons, c'est le service nginx-service cible le pod qui à l'IP 192.168.1.105 sur le port 80 :

NAME            ENDPOINTS          AGE
kubernetes      10.0.6.8:6443      8d
nginx-service   192.168.1.105:80   37s

Déployons un autre pod qui sera accessible par le même service :

vim pod_nginx2.yml

Contenu :

apiVersion: v1
kind: Pod
metadata:
  name: nginx2
  labels:
    app: mywebapp
spec:
  containers:
  - name: nginx
    image: nginx:stable
    ports:
      - containerPort: 80

Lancement du pod :

kubectl apply -f pod_nginx2.yml

Vérification des endpoints :

kubectl get endpoints

Ce que nous pouvons voir c'est le service cible nginx-service 2 pods sur le port 80 :

NAME            ENDPOINTS                           AGE
kubernetes      10.0.6.8:6443                       8d
nginx-service   192.168.1.105:80,192.168.1.106:80   7m37s

La requête ci-dessous sera alternativement redirigée vers 192.168.1.105:80 et 192.168.1.106:80 :

curl http://10.110.183.49:8080

NodePort

Ingress

informatique/kebernetes/kube_service.1702646249.txt.gz · Dernière modification: 2023/12/15 14:17 par benoit