Vous consultez la documentation d'une version précédente d'Anthos GKE On-Prem. Accédez à la documentation la plus récente

Déployer votre première application

Cette page explique comment déployer une application dans votre cluster d'utilisateur.

Se connecter en mode SSH au poste de travail administrateur

Connectez-vous en mode SSH à votre poste de travail administrateur :

ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]

[IP_ADDRESS] est l'adresse IP de votre poste de travail administrateur.

Effectuez toutes les étapes restantes de cette rubrique 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: "gcr.io/google-samples/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] est le chemin d'accès au fichier kubeconfig pour votre cluster d'utilisateur.

Obtenez des informations générales sur votre déploiement :

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get deployment my-deployment

Le résultat indique que le 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 déploiement :

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get pods

Le résultat indique que votre 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 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 du 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: gcr.io/google-samples/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 déploiement :

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] describe deployment my-deployment

Le résultat affiche des détails bien formatés sur le 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:        gcr.io/google-samples/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 déploiement à des clients extérieurs à votre cluster consiste à créer un service Kubernetes de type LoadBalancer.

Voici un fichier manifeste pour un 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 et department: sales sont membres du service. Notez que les pods dans my-deployment ont ces libellés.

  • 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 au 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

[USER_CLUSTER_KUBECONFIG] est le chemin d'accès au fichier kubeconfig de votre cluster d'utilisateur.

Lorsque vous créez le service, GKE On-Prem 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: 21.0.133.48
  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 service a 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 à 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 TCP 8080.

Appelez votre service :

curl [SERVICE_IP_ADDRESS]

[SERVICE_IP_ADDRESS] est 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 votre 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 votre déploiement :

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete deployment my-deployment

Vérifiez que votre déploiement a bien été supprimé :

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get deployments

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