1
votes

pourquoi l'objet conteneur dans le fichier pod yaml a une "valeur de liste" plutôt qu'une "valeur de carte"

Dans les fichiers yaml de création de pod ou dans les fichiers yaml de déploiement dans kubernetes, pourquoi la clé Containers a une valeur de liste - name: memory-demo-ctr plutôt que nous pouvons simplement fournir la valeur de la carte name: memory-demo-ctr (pourquoi nous fournissons le symbole - )?

J'ai essayé de regarder sur le Web mais je n'ai pas trouvé de solution. p>

apiVersion: v1
kind: Pod
metadata:
  name: memory-demo
  namespace: mem-example
spec:
  containers:
  - name: memory-demo-ctr
    image: polinux/stress


0 commentaires

3 Réponses :


0
votes

Vous avez une valeur de liste dans des conteneurs car un pod peut être composé de plusieurs conteneurs.

Un pod représente le plus petit bloc de construction de kubernetes. Au lieu de déployer des conteneurs individuellement, vous déployez et opérez toujours sur un groupe de conteneurs.

L'essentiel à propos des pods est que lorsqu'un pod contient plusieurs conteneurs, tous sont toujours exécutés sur un seul nœud worker, il ne s'étend jamais sur plusieurs nœuds worker.


0 commentaires

0
votes

Le pod est capable d'exécuter plusieurs conteneurs. C'est la raison pour laquelle l'objet conteneurs est une liste au lieu d'une carte.

kind: Pod
...
spec:
  containers:
  - name: busybox
    image: busybox:latest
  - name: nginx
    image: nginx:1.7.9
  - name: redis
    image: redis:latest

Si conteneurs est un objet cartographique, vous ne pouvez pas écrire de fichier de configuration pour exécuter plusieurs conteneurs dans un pod. J'espère que cette réponse a résolu votre doute.


2 commentaires

Merci, cela a du sens


@Teja veuillez voter pour / accepter la réponse si vous la trouvez utile.



0
votes

L'utilisation des deux structures mentionnées dans les manifestes yaml de kubernetes est assez bien justifiée et si vous y regardez de plus près, cela devient également assez intuitif:

Maps ( aka Dictionnaires ) sont utilisés lors de la fourniture d'un ensemble de paires clé: valeur . Veuillez noter que les clés sont uniques dans un tel ensemble, par exemple vous fournissez un ensemble différent de libellés dans la section métadonnées de votre définition de déploiement . L'élément metadata se présente également sous la forme de Dictionary car il contient un ensemble de clés uniques ( name et labels dans ce cas particulier).

- command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
  image: busybox
  name: myapp-container

Pour donner un autre exemple, jetons un œil à la section spec . Notez que les trois clés enfants de l'élément spec , à savoir répliques , sélecteur et template , sont uniques dans l'ensemble et c'est la raison pour laquelle ils sont sous la forme d'un Dictionary (ou d'une Map ):

- image: redis
  name: redis

Les Lists (aka Arrays ) sont utilisés lorsque nous devons fournir une List (ou Array ) d'objets / éléments de même type comme dans le cas de conteneurs dans la définition de Déploiement :

- name: nginx
  image: nginx:1.7.9

L'élément container est un tableau car il peut contenir de nombreux objets / éléments / éléments du même type (dans ce cas des conteneurs) qui peuvent avoir les mêmes propriétés. Dans la section container , vous pouvez définir de nombreux conteneurs et chacun d'entre eux aura son unique nom , image et ports . - signe indique un élément ou un élément du tableau . Notez que la structure à l'intérieur de cet élément d'élément est une Map ( Dictionary ) et comme dans les exemples précédents, elle contient ensemble de clés uniques avec les valeurs correspondantes .

L'utilisation de ces deux structures est assez flexible car elles peuvent être imbriquées l'une dans l'autre, par exemple vous pouvez avoir une Listes de Dictionnaires (comme dans le cas des conteneurs ), des Dictionaries dont les valeurs sont d'autres Dictionnaires ainsi que Dictionnaires contenant des Listes , pour épuiser toutes les possibilités (un exemple d'un tel cas est l'élément spec qui est un Dictionnaire qui contient entre autres la clé containers qui est une liste (la valeur de cette clé est une liste / tableau de items ).


Quant à votre question spécifique:

pourquoi la clé Containers a une valeur de liste - nom: memory-demo-ctr plutôt que nous pouvons simplement fournir le nom de la valeur de la carte: memory-demo-ctr (pourquoi nous fournissons - symbole)?

Notez qu'une valeur de liste (élément de liste) pour la clé container n'est pas seulement l'élément name mais la structure entière au même niveau d'indentation sous le conteneur . Comme je l'ai déjà mentionné ci-dessus, un élément de la liste est indiqué par le signe - . Dans l'exemple publié dans vos clés de question, nom et image avec leurs valeurs respectives appartiennent au même élément / item d'une liste ( array ) et ils forment un autre dictionnaire imbriqué ( map ). Ce n'est donc pas l'élément name qui doit être précédé du caractère - mais toute la structure (dans ce cas Dictionary / Map ) sous élément container . Lorsque vous définissez un autre conteneur (un autre élément de la liste de conteneurs), il commence toujours par un autre caractère - , peu importe si le premier élément qu'il contient est nom . Par exemple, vous pouvez construire votre structure comme ceci et elle sera également correcte:

  containers:
  - name: nginx
    image: nginx:1.7.9
  - image: redis
    name: redis
  - command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
    image: busybox
    name: myapp-container

Le dictionnaire ( map ) les éléments ne doivent pas nécessairement apparaître dans le même ordre. C'est juste une convention selon laquelle nom est généralement placé comme premier. Je vais le souligner à nouveau: ce ne sont pas name , image et command dans l'exemple ci-dessus qui sont des éléments de une liste mais toute la structure dictionnaire ( map ) précédée du caractère - , donc ce sont:

d'abord:

containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

deuxième:

spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx

et troisième:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
    type: front-end

éléments / éléments de la liste des conteneurs (qui est en même temps l'une des clés appartenant à spec dictionnaire). Oui, la valeur de cette clé est une liste donc nous pouvons dire que tout l'élément containers est une liste.

J'espère que cela a clarifié l'utilisation des deux structures et expliqué les différences entre elles.


2 commentaires

Merci mario pour une explication très détaillée, apprécie ton aide.


Je suis heureux d'avoir pu aider. Si la réponse a été utile et / ou a apporté une solution à votre problème, vous pouvez envisager de l'accepter et / ou de voter dessus. En tant que nouveau membre de la communauté, vous pouvez vous familiariser avec ce court article: stackoverflow.com/help/someone-answers