Outils pour utilisateurs

Outils du site


informatique:kebernetes:kube_service

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
informatique:kebernetes:kube_service [2023/12/15 12:19] – [ClusterIP] benoitinformatique:kebernetes:kube_service [2023/12/18 07:23] (Version actuelle) – [LoadBalancer] benoit
Ligne 10: Ligne 10:
  
 ===== ClusterIP ===== ===== 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.+C'est le mode par défaut de Kubernetes lorsque l'on crée un service. Il permet d'exposer un port au sein du cluster uniquement.  
 + 
 +**Remarque** :!: L'IP n'est pas publiée en dehors du cluster. L'IP allouée ne sera accessible que par les nodes du cluster. A noter aussi que les ClusterIP sont assignées par des règles Iptables dans la table NAT.
  
 Ci-dessous un fichier YAML pour démarrer un Pod nginx et son service : Ci-dessous un fichier YAML pour démarrer un Pod nginx et son service :
 +
 +  vim pod_nginx_service.yml
 +
 +Contenu :
  
   apiVersion: v1   apiVersion: v1
Ligne 47: Ligne 53:
       #targetPort: http-web-svc       #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 =====  ===== NodePort ===== 
  
 +La création d'un service de type **NodePort** créé aussi un service **ClusterIP** mais en plus un port sera publié à l'extérieur du cluster. Un port sera ouvert sur chacun des nodes (le serveur virtuel ou physique). Les ports qui peuvent être utilisés sont supérieur à 30000.
 +
 +Comme pour la création d'un service ClusterIP plus haut, nous allons créer un service et lancer un Pod :
 +  vim pod_nginx_service_nodeport.yml
 +  
 +Contenu : 
 +  apiVersion: v1
 +  kind: Pod
 +  metadata:
 +    name: nginx
 +    labels:
 +      app: mywebapp
 +  spec:
 +    containers:
 +    - name: nginx
 +      image: nginx:stable
 +      ports:
 +        - containerPort: 80
 +  
 +  ---
 +  apiVersion: v1
 +  kind: Service
 +  metadata:
 +    name: nginx-service
 +  spec:
 +    type: NodePort
 +    selector:
 +      app: mywebapp
 +    ports:
 +    - name: mywebport
 +      protocol: TCP
 +      port: 8080
 +      targetPort: 80
 +      nodePort: 31000
 +
 +On retrouve les mêmes éléments que pour la création d'un ClusterIP à la différence près que : 
 +   * **Pour le service** : 
 +       * **spec.type** : Doit être défini pour forcer la création de type **NodePort**.
 +       * **spec.ports.nodePort** : Définir le port qui devra écouter sur tous les nodes.
 +
 +On liste les services : 
 +  kubectl get svc
 +
 +Résultat : 
 +  NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
 +  kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP          8d
 +  nginx-service   NodePort    10.110.183.49   <none>        8080:31000/TCP   47m
 +
 +**Explications** : On constate que le service est de type **NodePort**. Le service dispose quand même d'un Cluster IP (10.110.183.49).
 +
 +Techniquement le pods est accessible en depuis les nodes ainsi : 
 +  curl http://10.110.183.49:8080
 +
 +Mais aussi depuis l'extérieur sur chacune des IP des nodes :
 +
 +  curl http://10.0.6.8:31000
 +  curl http://10.0.4.248:31000
 +
 +Liste des nodes : 
 +  NAME         STATUS   ROLES           AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION         CONTAINER-RUNTIME
 +  k8s-master   Ready    control-plane   11d   v1.28.2   10.0.6.8      <none>        Debian GNU/Linux 12 (bookworm)   6.1.0-15-cloud-amd64   docker://24.0.7
 +  k8s-node     Ready    <none>          11d   v1.28.2   10.0.4.248    <none>        Debian GNU/Linux 12 (bookworm)   6.1.0-15-cloud-amd64   docker://24.0.7
 +
 +===== LoadBalancer =====
 +
 +:!: A approfondir :!:
 +
 +La création d'un service de type **LoadBalancer** créé aussi les services **NodePort** et **ClusterIP**. En revanche, il permet d'équilibrer la charge vers les nodes avec l'utilisation d'un service de LoadBalancer externe ou cloud.
 +
 +Fichier YAML correspond (identique à NodePort mais le type change) : 
 +  apiVersion: v1
 +  kind: Pod
 +  metadata:
 +    name: nginx
 +    labels:
 +      app: mywebapp
 +  spec:
 +    containers:
 +    - name: nginx
 +      image: nginx:stable
 +      ports:
 +        - containerPort: 80
 +  ---
 +  apiVersion: v1
 +  kind: Service
 +  metadata:
 +    name: nginx-service
 +  spec:
 +    type: LoadBalancer
 +    selector:
 +      app: mywebapp
 +    ports:
 +    - name: mywebport
 +      protocol: TCP
 +      port: 8080
 +      targetPort: 80
 +      nodePort: 31000
 +
 +===== ExternalName =====
 ===== Ingress ===== ===== Ingress =====
informatique/kebernetes/kube_service.1702642792.txt.gz · Dernière modification : de benoit