Ce document explique comment déployer une application dans votre cluster d'utilisateur pour Anthos clusters on VMware (GKE On-Prem).
Avant de commencer
Créez un cluster d'utilisateur (guide de démarrage rapide | instructions complètes).
Se connecter en SSH au poste de travail administrateur
Connectez-vous en SSH à votre poste de travail administrateur :
ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]
où [IP_ADDRESS] est l'adresse IP de votre poste de travail administrateur.
Effectuez toutes les étapes restantes de cette page 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 loadBalancerIP: [SERVICE_IP_ADDRESS] 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.
Remplacez [SERVICE_IP_ADDRESS] par une adresse dont vous êtes le propriétaire et qui n'est pas déjà utilisée. Par exemple, vous pouvez définir une adresse IP publique appartenant à votre entreprise. Vous pouvez également définir une adresse privée dans le réseau de votre entreprise.
L'adresse que vous choisissez doit pouvoir être routée depuis l'emplacement de n'importe quel client qui envoie des demandes au Service. Par exemple, si vous choisissez une adresse privée, les clients externes ne pourront pas envoyer de requêtes à l'objet Service.
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, Anthos clusters on VMware configure automatiquement l'adresse loadBalancerIP
sur votre équilibreur de charge F5 BIG-IP.
Affichez votre service :
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get service my-service --output yaml
Le résultat est semblable à ceci :
apiVersion: v1 kind: Service metadata: ... name: my-service namespace: default ... spec: clusterIP: 10.107.84.202 externalTrafficPolicy: Cluster loadBalancerIP: 203.0.113.1 ports: - nodePort: 31919 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 nodePort
, un port
et un targetPort
.
Le clusterIP
n'est pas pertinent pour cet exercice. Le loadBalancerIP
correspond à l'adresse IP que vous avez indiquée dans my-service.yaml
.
À 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, nodePort
= 31919 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 votre équilibreur de charge F5 BIG-IP. L'équilibreur de charge choisit l'un de vos nœuds de cluster d'utilisateur et transfère la requête à [NODE_ADDRESS] sur le port TCP 31919. Les règles iptables du nœud transfèrent la requête à un pod membre sur le port 8080.
Appelez votre service :
curl [SERVICE_IP_ADDRESS]
où [SERVICE_IP_ADDRESS] représente l'adresse que vous avez spécifiée pour loadBalancerIP
.
Le résultat affiche un message Hello, world!
:
curl 21.0.133.48 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