Ce document fournit un exemple de déploiement d'une application dans un cluster d'utilisateur créé avec Google Distributed Cloud (logiciel uniquement) pour VMware.
Avant de commencer
Pour l'exemple donné ici, vous avez besoin d'un cluster d'utilisateurs qui utilise l'équilibrage de charge MetalLB groupé. Pour savoir comment créer un cluster d'utilisateur minimal qui utilise MetalLB, consultez la section Créer des clusters de base.
Vous pouvez utiliser la console Google Cloud ou l'outil de ligne de commande kubectl
sur votre poste de travail administrateur pour déployer l'application.
Console
Dans la console, accédez à la page Vue d'ensemble des clusters Google Kubernetes Engine.
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, suivez les instructions de la section Gérer les clusters à partir de la console Google Cloud.
Conteneurs
Sous Spécifier un conteneur, sélectionnez Image existante du conteneur.
Dans le champ Chemin de l'image, saisissez
us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
.Cliquez sur Continuer.
Configuration
Dans le champ Nom du déploiement, saisissez
my-deployment
.Dans le champ Espace de noms, saisissez
default
.Saisissez ces deux libellés :
- Key 1:
app
, Valeur 1 :metrics
- Key 2:
department
, Valeur 2 :sales
- Key 1:
Dans la liste déroulante Cluster Kubernetes, sélectionnez votre cluster.
Cliquez sur Continuer.
Exposer
Sélectionnez l'option Exposer le déploiement en tant que nouveau service
Pour Port 1, saisissez
80
.Pour Port cible 1, saisissez
8080
. Il s'agit de la valeur appropriée, car le conteneurhello-app
écoute par défaut sur le port TCP 8080. Vous pouvez le voir en consultant le fichier Dockerfile et le code source de l'application.Pour Protocole 1, sélectionnez
TCP
.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
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 consulter les détails du déploiement et de ses trois pods.
Sous Services associés, cliquez sur le nom du service qui expose votre déploiement. Pour cet exercice, le nom est
my-deployment-service
.La page Informations sur le service s'ouvre. Sur cette page, vous pouvez consulter des informations sur le service. Par exemple, vous pouvez voir que tous les pods comportant les étiquettes
app: metrics
etdepartment: sales
sont membres du service. Rappelez-vous que ces libellés sont attribués aux pods dansmy-deployment
.
Vous pouvez également voir une valeur pour 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 extérieur au 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. Le répartiteur de charge transmet la requête à un pod membre sur le port TCP 8080. Rappelez-vous que chaque pod dans my-deployment
dispose d'un conteneur à l'écoute sur le port TCP 8080.
Teste votre service
Accédez à une machine où 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 opération supprime le déploiement et le service exposé.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
où 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 libellés
app: metrics
etdepartment: sales
sont membres de l'objet Service. Notez que ces libellés sont attribués aux pods dansmy-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
où USER_CLUSTER_KUBECONFIG représente le chemin d'accès au fichier kubeconfig de votre cluster d'utilisateur.
Lorsque vous créez le service, Google Distributed Cloud 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 en dehors du cluster peuvent utiliser pour appeler le service.
À titre d'exemple, prenons les valeurs affichées dans le résultat précédent. En d'autres termes, 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
Supprimez 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
.
Supprimez votre objet 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
.
Étape suivante
Créer un service et un objet Ingress