Services


ClusterIP

Fichier de définition

Créer un service pour un pod existant

Créer un pod + service à la volée

Lister


Node port

Fichier de définition

Créer

Lister

Supprimer

$ kubectl delete services hello-minikube
service "hello-minikube" deleted

LoadBalancer

Fichier de définition

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  type: LoadBalancer
  ports:
    - targetPort: 80
      port: 80
      nodePort: 30008

Exemple

  1. Définir les différents pods

    Une application python pour voter: voting-app-pod.yaml
    
         apiVersion: v1
         kind: Pod
         metadata:
           name: voting-app-pod
           labels:
             name: voting-app-pod
             app: demo-voting-app
         spec:
          containers:
            - name: voting-app
              image: kodekloud/examplevotingapp_vote:v1
              ports:
                - containerPort: 80
       
    
    Un broker pour stocker les votes (temporairement) avant traitement: redis-pod.yaml
    
         apiVersion: v1
         kind: Pod
         metadata:
           name: redis-pod
           labels:
             name: redis-pod
             app: demo-voting-app
         spec:
          containers:
            - name: redis
              image: redis
              ports:
                - containerPort: 6379
       
    
    Une worker pour traiter les votes et stocker le résultat en BDD: worker-app-pod.yaml
    
         apiVersion: v1
         kind: Pod
         metadata:
           name: worker-app-pod
           labels:
             name: worker-app-pod
             app: demo-voting-app
         spec:
          containers:
            - name: worker-app
              image: kodekloud/examplevotingapp_worker:v1
       
    
    Une BDD: postgres-pod.yaml
    
         apiVersion: v1
         kind: Pod
         metadata:
           name: postgres-pod
           labels:
             name: postgres-pod
             app: demo-voting-app
         spec:
          containers:
            - name: postgres
              image: postgres
              ports:
                - containerPort: 5432
              env:
               - name: POSTGRES_USER
                 value: "postgres"
               - name: POSTGRES_PASSWORD
                 value: "postgres"
       
    
    Une application js pour afficher les résultats: result-app-pod.yaml
    
         apiVersion: v1
         kind: Pod
         metadata:
           name: result-app-pod
           labels:
             name: result-app-pod
             app: demo-voting-app
         spec:
          containers:
            - name: result-app
              image: kodekloud/examplevotingapp_result:v1
              ports:
                - containerPort: 80
       
    


  2. Définir les différents services

    Un ClusterIP pour exposer redis aux autres pods, en tant que "redis": redis-service.yaml
    
       apiVersion: v1
       kind: Service
       metadata:
         name: redis
         labels:
           name: redis-service
           app: demo-voting-app
       spec:
         ports:
           - port: 6379
             targetPort: 6379
         selector:
           name: redis-pod
           app: demo-voting-app
       
    
    Un ClusterIP pour exposer postgres aux autres pods, en tant que "db": postgres-service.yaml
    
       apiVersion: v1
       kind: Service
       metadata:
         name: db
         labels:
           name: postgres-service
           app: demo-voting-app
       spec:
         ports:
           - port: 5432
             targetPort: 5432
         selector:
           name: postgres-pod
           app: demo-voting-app
       
    
    Un NodePort pour permettre l'accès à l'application de vote de l'extérieur: voting-app-service.yaml
    
       apiVersion: v1
       kind: Service
       metadata:
         name: voting-service
         labels:
           name: voting-app-service
           app: demo-voting-app
       spec:
         type: NodePort
         ports:
           - port: 80
             targetPort: 80
             nodePort: 30004
         selector:
           name: voting-app-pod
           app: demo-voting-app
       
    
    Un NodePort pour permettre l'accès à l'application de résultat de l'extérieur: result-app-service.yaml
    
       apiVersion: v1
       kind: Service
       metadata:
         name: result-service
         labels:
           name: result-app-service
           app: demo-voting-app
       spec:
         type: NodePort
         ports:
           - port: 80
             targetPort: 80
             nodePort: 30005
         selector:
           name: result-app-pod
           app: demo-voting-app
       
    


  3. Mettre à jour les variables d’environnement de l’application pour qu’elle utilise le bon host

  4. Lancer les pods et services

     $ kubectl create -f redis-pod.yml
     pod/redis-pod created
     $ kubectl create -f redis-service.yml
     service/redis created
     ...
    
     $ kubectl get pods,svc
     NAME                READY  STATUS   RESTARTS  AGE
     pod/redis-pod       1/1    Running  0         9s
     pod/voting-app-pod  1/1    Running  0         4m1s
    
     NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP  PORT(S)       AGE
     service/kubernetes      ClusterIP  10.96.0.1       <none>       443/TCP       2d4h
     service/redis           ClusterIP  10.110.47.42    <none>       6379/TCP      5s
     service/voting-service  NodePort   10.109.194.132  <none>       80:80004/TCP  108s
    
  5. Pour éviter les temps d’arrêt, convertir chaque pod en déploiement.
    Pour rappel, les déploiements créent des replicas et en plus, gèrent les rolling updates, gardent une trace des changements et permettent les rollbacks.

    $ kubectl create -f voting-app-deploy.yaml
    $ kubectl create -f voting-app-service.yaml
    
    $ kubectl create -f redis-deploy.yaml
    $ kubectl create -f redis-service.yaml
    
    $ kubectl create -f worker-app-deploy.yaml
    
    $ kubectl create -f postgres-deploy.yaml
    $ kubectl create -f postgres-service.yaml
    
    $ kubectl create -f result-app-deploy.yaml
    $ kubectl create -f result-app-service.yaml