6
votes

Pourquoi les étiquettes sont mentionnées trois fois dans un même déploiement

J'ai parcouru la page de documentation suivante: https://kubernetes.io / docs / concepts / workloads / controllers / deployment /

L'exemple de déploiement yaml est le suivant:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

Nous pouvons voir ici trois fois où le Le libellé app: nginx est mentionné.

Pourquoi avons-nous besoin de chacun d'eux? J'ai eu du mal à comprendre la documentation officielle.


0 commentaires

3 Réponses :


5
votes

Première étiquette:

C'est l'étiquette de déploiement qui est utilisée pour sélectionner le déploiement. Vous pouvez utiliser la commande ci-dessous en utilisant la première étiquette:

kubectl get pods -l app=nginx

Deuxième étiquette:

Ce n'est pas une étiquette. C'est un sélecteur d'étiquette pour sélectionner un pod avec des étiquettes nginx. Il est utilisé par ReplicaSet.

Troisième étiquette:

C'est l'étiquette de pod pour identifier les pods. Il est utilisé par ReplicaSet pour maintenir le nombre souhaité de répliques et pour ce sélecteur d'étiquette est utilisé. Il est également utilisé pour sélectionner le pod avec la commande ci-dessous:

kubectl get deployment -l app=nginx


0 commentaires

9
votes

Le premier libellé concerne le déploiement lui-même, il donne un libellé pour ce déploiement particulier. Supposons que vous souhaitiez supprimer ce déploiement, puis exécutez la commande suivante:

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: LoadBalancer
  ports:
    - port:  80
  selector:
    app: nginx

Cela supprimera tout le déploiement.

Le deuxième libellé est selector: matchLabels qui indique aux ressources (service, etc.) de faire correspondre le pod en fonction de l'étiquette. Donc, disons si vous voulez créer le service qui a tous les pods ayant des étiquettes de app = nginx alors vous fournissez la définition suivante:

kubectl delete deployment -l app=nginx

Le le service ci-dessus recherchera les matchLabels et les pods de liaison auxquels le libellé app: nginx leur est attribué

Le troisième libellé est podTemplate code> labels, le template est en fait podTemplate . Il décrit le pod sur lequel il est lancé. Supposons donc que vous ayez deux déploiements de répliques et que k8 lancera 2 pods avec l'étiquette spécifiée dans template: metadata: labels . Il s'agit d'une différence subtile mais importante, vous pouvez donc avoir les différents libellés pour le déploiement et les pods générés par ce déploiement.


1 commentaires

Je suppose alors que le second est requis et les deux autres sont facultatifs?



2
votes

.metadata.labels sert à étiqueter l'objet déploiement lui-même, vous n'en avez pas nécessairement besoin, mais comme l'ont dit d'autres réponses, cela vous aide à organiser les objets.

/ p>

.spec.selector indique au déploiement (sous le capot, c'est l'objet ReplicaSet ) comment trouver les pods à gérer. Pour votre exemple, il gérera les pods avec l'étiquette app: nginx .

Mais comment dire au contrôleur ReplicaSet de créer des pods avec cette étiquette en premier lieu? Vous définissez cela dans le modèle de pod, .spec.template.metadata.labels .


0 commentaires