Déployer une application

Ce document donne un exemple de déploiement d'une application dans un cluster d'utilisateur pour GKE sur VMware.

Avant de commencer

Pour l'exemple donné ici, vous avez besoin d'un cluster d'utilisateur utilisant l'équilibrage de charge groupé MetalLB. Pour savoir comment créer un cluster d'utilisateur minimal utilisant MetalLB, consultez la page Créer des clusters de base.

Vous pouvez déployer l'application à l'aide de la console Google Cloud ou de l'outil de ligne de commande kubectl sur votre poste de travail administrateur.

Console

  1. Dans la console, accédez à la page de présentation des clusters Google Kubernetes Engine.

    Accéder aux clusters GKE

  2. Dans la liste des clusters, cliquez sur votre cluster d'utilisateur et vérifiez que vous êtes connecté au cluster.

    Si vous n'êtes pas déjà connecté à votre cluster d'utilisateur, connectez-vous en suivant les instructions de la section Gérer des clusters à partir de la console Google Cloud.

Conteneurs

  1. Sous Nouveau conteneur, sélectionnez Image existante du conteneur.

  2. Pour Chemin de l'image, saisissez us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0.

  3. Cliquez sur Continuer.

Configuration

  1. Dans le champ Nom du déploiement, saisissez my-deployment.

  2. Dans le champ Espace de noms, saisissez default.

  3. Saisissez ces deux libellés:

    • Clé 1: app, Valeur 1: metrics
    • Clé 2: department, Valeur 2 sales
  4. Dans la liste déroulante Cluster Kubernetes, sélectionnez votre cluster.

  5. Cliquez sur Continuer.

Exposer

  1. Cochez la case Exposer le déploiement en tant que nouveau service.

  2. Pour Port 1, saisissez 80.

  3. Dans le champ Port cible 1, saisissez 8080. Il s'agit de la valeur appropriée, car le conteneur hello-app écoute par défaut sur le port TCP 8080. Vous pouvez le constater en consultant le fichier Dockerfile et le code source de l'application.

  4. Pour Protocole 1, sélectionnez TCP.

  5. Dans le champ Type de service, sélectionnez LoadBalancer.

En bas de la page, cliquez sur le bouton Déployer.

Afficher les détails du déploiement et du service

  1. Lorsque votre déploiement est prêt, la page Informations sur le déploiement s'ouvre dans la section Charges de travail Kubernetes de la console Google Cloud. Sur cette page, vous pouvez afficher des détails sur le déploiement et ses trois pods.

  2. Sous Exposing services (Exposer les services), cliquez sur le nom du service qui expose votre déploiement. Pour cet exercice, le nom est my-deployment-service.

  3. La page Détails du service s'ouvre. Sur cette page, vous trouverez des informations sur le service. Par exemple, vous pouvez constater que tous les pods comportant les étiquettes app: metrics et department: sales sont membres du service. Rappelez-vous que les pods de my-deployment sont associés à ces étiquettes.

Vous pouvez également voir une valeur pour l'adresse IP de l'équilibreur de charge. L'adresse IP de l'équilibreur de charge a été automatiquement configurée sur l'équilibreur de charge du cluster.

Transfert pour le service

Supposons qu'un client situé en dehors du cluster envoie une requête à l'adresse IP de l'équilibreur de charge sur le port TCP 80. La requête est acheminée vers l'équilibreur de charge du cluster. L'équilibreur de charge transfère la requête à un pod membre sur le port TCP 8080. Rappelez-vous que chaque pod de my-deployment possède un conteneur à l'écoute sur le port TCP 8080.

Tester votre service

Accédez à une machine sur laquelle l'adresse IP de l'équilibreur de charge est routable.

Pour appeler votre service, saisissez l'adresse IP de l'équilibreur de charge dans un navigateur ou utilisez une commande telle que curl. Exemple :

curl [LOAD_BALANCER_IP]:80

Le résultat affiche un message Hello, world!. Exemple :

curl 203.0.113.1:80
Hello, world!
Version: 2.0.0
Hostname: my-deployment-dbd86c8c4-9wpbv

Supprimer le déploiement

Accédez à la page Charges de travail dans la section Kubernetes Engine de la console.

Accéder à la page "Charges de travail"

Dans la liste des déploiements, sélectionnez my-deployment.

En haut de la page, cliquez sur Supprimer. Cette action supprime à la fois le déploiement et le service exposant.

Ligne de commande

Se connecter au poste de travail administrateur

Obtenez une connexion SSH à votre poste de travail administrateur. Procédez comme suit sur votre poste de travail administrateur.

Créer un déploiement

Voici le fichier manifeste d'un déploiement :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      app: metrics
      department: sales
  replicas: 3
  template:
    metadata:
      labels:
        app: metrics
        department: sales
    spec:
      containers:
      - name: hello
        image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0"

Copiez le fichier manifeste dans un fichier nommé my-deployment.yaml, puis créez le déploiement :

kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f my-deployment.yaml

USER_CLUSTER_KUBECONFIG représente le chemin d'accès au fichier kubeconfig de votre cluster d'utilisateur.

Obtenez des informations générales sur votre objet Déploiement :

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get deployment my-deployment

Le résultat indique que l'objet Déploiement comporte trois pods tous disponibles :

NAME            READY   UP-TO-DATE   AVAILABLE   AGE
my-deployment   3/3     3            3           27s

Répertoriez les pods dans votre objet Déploiement :

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get pods

Le résultat indique que votre objet Déploiement comporte trois pods en cours d'exécution :

NAME                             READY   STATUS    RESTARTS   AGE
my-deployment-54944c8d55-4srm2   1/1     Running   0          6s
my-deployment-54944c8d55-7z5nn   1/1     Running   0          6s
my-deployment-54944c8d55-j62n9   1/1     Running   0          6s

Obtenez des informations détaillées sur votre objet Déploiement :

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get deployment my-deployment --output yaml

Le résultat fournit des détails sur les spécifications et l'état de l'objet Déploiement :

kind: Deployment
metadata:
  ...
  generation: 1
  name: my-deployment
  namespace: default
  ...
spec:
  ...
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: metrics
      department: sales
  ...
    spec:
      containers:
      - image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
        imagePullPolicy: IfNotPresent
        name: hello
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 3
  conditions:
  ‑ lastTransitionTime: "2019-11-11T18:44:02Z"
    lastUpdateTime: "2019-11-11T18:44:02Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  ‑ lastTransitionTime: "2019-11-11T18:43:58Z"
    lastUpdateTime: "2019-11-11T18:44:02Z"
    message: ReplicaSet "my-deployment-54944c8d55" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 1
  readyReplicas: 3
  replicas: 3
  updatedReplicas: 3

Décrivez votre objet Déploiement :

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG describe deployment my-deployment

Le résultat affiche des détails bien formatés sur l'objet Déploiement, y compris les ReplicaSet :

Name:                   my-deployment
Namespace:              default
CreationTimestamp:      Mon, 11 Nov 2019 10:43:58 -0800
Labels:                 
...
Selector:               app=metrics,department=sales
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=metrics
           department=sales
  Containers:
    hello:
    Image:        us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
    Port:         
    Host Port:    
    Environment:  
    Mounts:       
  Volumes:        
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  
NewReplicaSet:   my-deployment-54944c8d55 (3/3 replicas created)

Créer un service de type LoadBalancer

Une façon d'exposer votre objet Déploiement à des clients extérieurs à votre cluster consiste à créer un objet Service Kubernetes de type LoadBalancer.

Voici un fichier manifeste pour un objet Service de type LoadBalancer :

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: metrics
    department: sales
  type: LoadBalancer
  ports:
  ‑ port: 80
    targetPort: 8080

Pour les besoins de cet exercice, voici les points importants à noter à propos du service :

  • Tous les pods comportant les étiquettes app: metrics et department: sales sont membres du service. Notez que ces libellés sont attribués aux pods dans my-deployment.

  • Lorsqu'un client envoie une requête au service sur le port TCP 80, la requête est transmise à un pod membre sur le port TCP 8080.

  • Chaque pod membre doit disposer d'un conteneur qui écoute sur le port TCP 8080.

Il arrive que, par défaut, le conteneur hello-app écoute sur le port TCP 8080. Vous pouvez le voir en consultant le fichier Dockerfile et le code source de l'application.

Enregistrez le manifeste dans un fichier nommé my-service.yaml et créez le service :

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f my-service.yaml

USER_CLUSTER_KUBECONFIG représente le chemin d'accès au fichier kubeconfig de votre cluster d'utilisateur.

Lorsque vous créez le service, GKE sur VMware configure automatiquement l'adresse loadBalancerIP sur l'équilibreur de charge du cluster.

Affichez votre service :

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get service my-service --output yaml

Le résultat est semblable à ceci :

kind: Service
metadata:
  ...
  name: my-service
  namespace: default
  ...
spec:
  allocateLoadBalancerNodePorts: true
  clusterIP: 10.96.1.39
  clusterIPs:
  - 10.96.1.39
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - nodePort: 31184
    port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: metrics
    department: sales
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 203.0.113.1

Dans le résultat précédent, vous pouvez voir que votre objet Service possède un clusterIP et un loadBalancerIP. Il comporte également un port et un targetPort.

Le clusterIP n'est pas pertinent pour cet exercice. loadBalancerIP est l'adresse IP que les clients extérieurs au cluster peuvent utiliser pour appeler le service.

À titre d'exemple, prenons les valeurs affichées dans le résultat précédent. Autrement dit, supposons que votre service ait loadBalancerIP = 203.0.113.1, port = 80 et targetPort = 8080.

Un client envoie une requête à l'adresse 203.0.113.1 sur le port TCP 80. La requête est acheminée vers l'équilibreur de charge du cluster. L'équilibreur de charge transfère la requête à un pod membre sur le port TCP 8080.

Appelez votre service :

curl LOAD_BALANCER_IP

Le résultat affiche un message Hello, world! :

curl 203.0.113.1
Hello, world!
Version: 2.0.0
Hostname: my-deployment-dbd86c8c4-9wpbv

Supprimer votre service

Supprimez le service :

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete service my-service

Vérifiez que votre service a été supprimé :

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get services

Le résultat n'affiche plus my-service.

Supprimer votre déploiement

Supprimez le déploiement :

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete deployment my-deployment

Vérifiez que votre objet Déploiement a bien été supprimé :

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get deployments

Le résultat n'affiche plus my-deployment.

Étapes suivantes

Créer un service et un objet Ingress