Déployer SuperNode à l’aide de Helm

Note

Flower Helm charts are a Flower Enterprise feature. See Flower Enterprise for details.

Le cadre de référence Flower offre une approche unifiée pour l’apprentissage fédéré, les analyses et l’évaluation, vous permettant de faire participer tout type de charge de travail, framework d’apprentissage automatique ou langage de programmation.

Ce chart Helm installe les composants côté-client du Framework Flower, en spécifiant notamment la mise en place de SuperNode.

La configuration d’installation par défaut vise à reproduire la fonctionnalité et la mise en place des sorties officielles du cadre de référence Flower.

Configuration multi-projet

Pour installer plusieurs types de SuperNodes, tels qu’un fédération pour exécuter PyTorch et un autre pour TensorFlow, vous devez installer le chart Helm plusieurs fois avec des noms différents. Cela permet à chaque déploiement d’avoir ses propres configurations et dépendances.

Par exemple, vous pouvez installer le chart pour la configuration de PyTorch en ajustant le fichier values.yaml comme suit :

supernode:
  superlink:
    address: my-superlink.example.com
    port: 9092
  node:
    config:
      partition-id: 0
      num-partitions: 2
  image:
    registry: myregistry.example.com
    repository: flwr/supernode
    tag: 1.20.0-pytorch

Installez cette configuration à l’aide du command suivant :

$ helm install pytorch . --values values.yaml

Cela déployera 10 SuperNodes nommés pytorch-flower-client-supernode-<random>.

Pour une configuration TensorFlow, modifiez le fichier values.yaml comme suit :

supernode:
  replicas: 3
  superlink:
    address: my-other-superlink.example.com
    port: 9092
  node:
    config:
      partition-id: 1
      num-partitions: 2
  image:
    registry: myregistry.example.com
    repository: flwr/supernode
    tag: 1.20.0-tensorflow

Installez cette configuration à l’aide du command suivant :

$ helm install tensorflow . --values values.yaml

Cela déployera 3 SuperNodes nommés tensorflow-flower-client-supernode-<random>.

Déployez le Framework Flower avec TLS

Par défaut, le Framework Flower est déployé avec TLS activé. Cela signifie que tls.enabled est défini sur true.

Lorsque vous utilisez des CAs privés, SuperNode doit faire confiance au certificat CA pour se connecter de manière sécurisée à SuperLink.

Pour fournir le certificat CA, définissez tls.enabled sur true et créez un Secret du type kubernetes.io/tls nommé flower-client-tls :

tls:
  enabled: true

Si vous souhaitez utiliser un autre nom de Secret, remplacez la valeur par défaut en définissant supernode.superlink.certificate.existingSecret :

tls:
  enabled: true

supernode:
  superlink:
    certificate:
      existingSecret: my-custom-tls-secret-name

Important:

La pratique recommandée est de monter différents Secrets pour SuperLink et les SuperNodes existingSecret paramètre. En gardant ces Secrets séparés, vous assurez que si le Secret contenant la clé privée et le certificat du serveur est jamais compromis, le client échouera à se connecter plutôt que de faire confiance à un serveur compromis.

Pour plus d’informations, consultez la documentation cert-manager.

Si le certificat SuperLink (du type kubernetes.io/tls) est déployé dans le même cluster et namespace que SuperNode, vous pouvez activer supernode.superlink.certificate.copyFromExistingSecret. Cela instruit le chart à créer un nouveau Secret contenant le certificat CA. Il copie ca.crt du Secret SuperLink ou tombe en arrière sur tls.crt si ca.crt n’est pas présent.

Par défaut, le Secret copié est nommé flower-client-tls. Vous pouvez personnaliser ce nom avec supernode.superlink.certificate.copyFromExistingSecret.secretName :

tls:
  enabled: true

supernode:
  superlink:
    certificate:
      existingSecret: superlink-tls-secret-name
    copyFromExistingSecret:
      enabled: true
      secretName: my-custom-tls-secret-name

Déployer le Framework Flower sans TLS

Vous pourriez vouloir déployer le Framework Flower sans TLS pour des tests ou une utilisation interne. Soyez prudent car cela expose votre déploiement à des risques de sécurité potentiels.

tls:
  enabled: false

Authentification du nœud

Pour activer l’authentification du nœud, vous devez spécifier une clé privée au format PKCS8 ou OpenSSH (PEM-like). Cet exemple suppose que SuperLink est également configuré pour l’authentification du nœud et reconnaît la clé publique ecdsa-sha2-nistp384 [...] de ce SuperNode.

global:
  nodeAuth:
    enabled: true
    authSupernodePrivateKey: |+
      -----BEGIN OPENSSH PRIVATE KEY-----
      [...]
      -----END OPENSSH PRIVATE KEY-----
    authSupernodePublicKey: ecdsa-sha2-nistp384 [...]

tls:
  enabled: true

supernode:
  enabled: true
  superlink:
    address: my-superlink.example.com
    port: 9092

superexec:
  enabled: true
  supernode:
    address: my-supernode.example.com
    port: 9094

Configuration isolée

Isolation Tous-en-Un

Pour installer SuperNode en mode d’isolement à l’aide de la configuration « process », il faut activer à la fois SuperExec et SuperNode. Par défaut, SuperExec se connecte à SuperNode internement au sein du cluster, donc il n’est pas nécessaire de définir supernode.address et supernode.port sauf si la connexion est externe. Cette configuration suppose que les deux composants sont exécutés dans le même cluster.

supernode:
  enabled: true
  isolationMode: process

superexec:
  enabled: true

Isolation Distribuée

Vous pouvez également déployer SuperNode et SuperExec séparément. Pour cela, il faut déployer le chart deux fois : une fois avec supernode.enabled=true et une fois avec superexec.enabled=true.

supernode:
  enabled: true

superexec:
  enabled: true
  supernode:
    address: my-supernode.example.com
    port: 9094

Configuration du nœud

Vous pouvez ajouter une configuration de nœud pour configurer un SuperNode. Le datatype YAML est conservé lorsqu’il est passé dans l’application Python :

supernode:
  node:
    config:
      bool: false
      int: 1
      negative_int: -1
      float: 21.23
      negative_float: -1.34
      string: value 1
      int-as-string: "1"

Parameters

Paramètres Helm

Name

Description

Value

nameOverride

Remplace le nom du chart dans le Chart.yaml

flower-client

fullnameOverride

Remplace complètement le nom généré.

""

Paramètres globaux

Name

Description

Value

global.annotations

Annotations par défaut

{}

global.labels

Étiquettes par défaut

{}

global.podLabels

PodLabels par défaut

{}

global.nodeSelector

Sélecteur de nœud par défaut pour tous les composants

{}

global.tolerations

Tolérations par défaut pour tous les composants

[]

global.affinity.podAntiAffinity

Présentation d’affinité par défaut pour tous les composants

soft

global.affinity.podAntiAffinity

Règles d’anti-affinité du pod par défaut. Soit : rien, mou ou dur

soft

global.affinity.nodeAffinity.type

Règles d’affinité de nœud par défaut. Soit : rien, mou ou dur

hard

global.affinity.nodeAffinity.matchExpressions

Expressions de match pour l’affinité de nœud par défaut

[]

global.nodeAuth.enabled

Activer ou désactiver la liaison SuperLink <-> SuperNode

false

global.nodeAuth.authSupernodePrivateKey

Spécifie la clé privée ecdsa-sha2-nistp384

""

global.securityContext.runAsUser

Définir le contexte de sécurité runAsUser

49999

global.securityContext.runAsGroup

Définir le contexte de sécurité runAsGroup

49999

global.securityContext.fsGroup

Définir le contexte de sécurité fsGroup

49999

global.podSecurityContext.runAsNonRoot

Définir le contexte de sécurité runAsNonRoot

true

global.podSecurityContext.readOnlyRootFilesystem

Définir le contexte de sécurité readOnlyRootFilesystem

true

global.podSecurityContext.allowPrivilegeEscalation

Définir le contexte de sécurité allowPrivilegeEscalation

false

global.podSecurityContext.seccompProfile.type

Définir le contexte de sécurité seccompProfile

RuntimeDefault

global.podSecurityContext.capabilities.drop

Définir le contexte de sécurité capabilities

["TOUT"]

global.env

Variables d’environnement par défaut

[]

global.image.pullPolicy

Politique de tirage d’image par défaut

IfNotPresent

Configuration TLS

Name

Description

Value

tls.enabled

Activer la configuration TLS pour le Framework Flower.

true

Composant SuperNode

Name

Description

Value

supernode.name

Nom du SuperNode

supernode

supernode.enabled

Activer ou désactiver SuperNode

true

supernode.resources

Définir les demandes et les limites des conteneurs pour différentes ressources comme la CPU ou la mémoire (essentiel pour les charges de travail de production)

{}

supernode.node.config

{}

supernode.isolationMode

Mode d’isolement du SuperNode

subprocess

supernode.resources

Définir les demandes et les limites des conteneurs pour différentes ressources comme la CPU ou la mémoire (essentiel pour les charges de travail de production)

{}

supernode.superlink.address

Adresse de SuperLink que les SuperNodes doivent se connecter à

my-superlink.example.com

supernode.superlink.port

Port de SuperLink que les SuperNodes doivent se connecter à

9092

supernode.superlink.certificate.existingSecret

""

supernode.superlink.certificate.copyFromExistingSecret.enabled

false

supernode.superlink.certificate.copyFromExistingSecret.secretName

""

supernode.volumes

Spécifiez une liste de volumes pour le pod(s) SuperNode

[]

supernode.volumeMounts

Permet de spécifier des VolumeMounts supplémentaires

[]

supernode.automountServiceAccountToken

Automount SA-TOKEN dans le pod.

true

supernode.serviceAccount.enabled

Activer un compte de service pour ce composant

true

supernode.serviceAccount.annotations

Annotations appliquées au compte de service activé

{}

supernode.serviceAccount.labels

Étiquettes appliquées au compte de service activé

{}

supernode.serviceAccount.automountServiceAccountToken

Automount SA-TOKEN

true

supernode.service.type

Sont valides ClusterIP, NodePort ou Loadbalancer

ClusterIP

supernode.service.servicePortClientAppIoName

Préfixe du port API ClientAppIo de SuperNode

clientappio

supernode.service.servicePortClientAppIo

Port à exposer pour l’API ClientAppIo de SuperNode

9094

supernode.service.nodePortClientAppIo

Port du nœud pour l’API ClientAppIo de SuperNode

""

supernode.containerPorts.clientAppIo

Port du conteneur pour l’API ClientAppIo de SuperNode

9094

supernode.containerPorts.health

Port du conteneur pour l’API Health de SuperNode

8081

supernode.podSecurityContext

{}

supernode.replicas

Nombre de pods SuperNode à exécuter

1

supernode.labels

Étiquettes supplémentaires pour les pods SuperNode

{}

supernode.extraArgs

Ajoutez des arguments supplémentaires aux arguments par défaut pour le SuperNode

[]

supernode.superexecAuthSecretFile

Chemin vers un fichier contenant le secret partagé SuperExec.

""

supernode.nodeSelector

Étiquettes de nœud pour les pods SuperNode qui se mélangent avec global.nodeSelector

{}

supernode.tolerations

Tolérations de nœud pour les pods SuperNode qui se mélangent avec global.tolerations

[]

supernode.updateStrategy.type

Type de stratégie de déploiement SuperNode

RollingUpdate

supernode.updateStrategy.rollingUpdate

Paramètres de configuration d’actualisation roulante du déploiement SuperNode

{}

supernode.affinity

Affinité des nœuds pour les pods SuperNode qui se mélangent avec global.affinity

{}

supernode.env

Tableau avec des variables d’environnement supplémentaires à ajouter aux nœuds SuperNode qui se mélangent avec global.env

[]

supernode.livenessProbe.enabled

Activer livenessProbe sur les conteneurs SuperNode

true

supernode.livenessProbe.initialDelaySeconds

Délai initial en secondes pour livenessProbe

0

supernode.livenessProbe.periodSeconds

Période en secondes pour livenessProbe

10

supernode.livenessProbe.timeoutSeconds

Temps d’attente en secondes pour livenessProbe

1

supernode.livenessProbe.failureThreshold

Seuil de défaillance pour livenessProbe

3

supernode.livenessProbe.successThreshold

Seuil de réussite pour livenessProbe

1

supernode.readinessProbe.enabled

Activer readinessProbe sur les conteneurs SuperNode

true

supernode.readinessProbe.initialDelaySeconds

Délai initial en secondes pour readinessProbe

0

supernode.readinessProbe.periodSeconds

Période en secondes pour readinessProbe

10

supernode.readinessProbe.timeoutSeconds

Temps d’attente en secondes pour readinessProbe

1

supernode.readinessProbe.failureThreshold

Seuil de défaillance pour readinessProbe

3

supernode.readinessProbe.successThreshold

Seuil de réussite pour readinessProbe

1

supernode.lifecycle

Conteneur(s) SuperNode pour automatiser la configuration avant ou après le démarrage

{}

supernode.annotations

Annotations personnalisées supplémentaires pour SuperNode

{}

supernode.selectorLabels

Étiquettes de sélection supplémentaires pour les pods SuperNode

{}

supernode.podAnnotations

Annotations pour les pods SuperNode

{}

supernode.podLabels

Étiquettes de pod supplémentaires pour les pods SuperNode

{}

supernode.imagePullSecrets

Secrets d’image pull SuperNode qui dépassent global.imagePullSecrets

[]

supernode.image.registry

Registre d’image SuperNode

registry.hub.docker.com

supernode.image.repository

Répertoire d’image SuperNode

flwr/supernode-ee

supernode.image.tag

Tag d’image SuperNode

1.29.0-ubuntu

supernode.image.digest

Digest d’image SuperNode

""

supernode.image.pullPolicy

Politique de tirage d’image des composants

IfNotPresent

supernode.networkPolicy.enabled

Spécifiez si une NetworkPolicy doit être créée

true

supernode.networkPolicy.allowExternal

Autoriser le trafic d’ingress externe

true

supernode.networkPolicy.allowExternalEgress

Autoriser un trafic egress non restreint

true

supernode.networkPolicy.extraIngress

Ajouter des règles d’ingress supplémentaires à la NetworkPolicy

[]

supernode.networkPolicy.extraEgress

Ajouter des règles d’ingress supplémentaires à la NetworkPolicy (ignorées si allowExternalEgress=true)

[]

supernode.networkPolicy.ingressPodMatchLabels

Étiquettes à matcher pour autoriser le trafic de autres pods. Ignoré si supernode.networkPolicy.allowExternal est vrai.

{}

supernode.networkPolicy.ingressNSMatchLabels

Étiquettes à matcher pour autoriser le trafic de autres namespaces. Ignoré si supernode.networkPolicy.allowExternal est vrai.

{}

supernode.networkPolicy.ingressNSPodMatchLabels

Étiquettes de pod à matcher pour autoriser le trafic de autres namespaces. Ignoré si supernode.networkPolicy.allowExternal est vrai.

{}

Composant SuperExec

Name

Description

Value

superexec.name

Nom du SuperExec

superexec-clientapp

superexec.enabled

Activer ou désactiver le composant SuperExec

false

superexec.pluginType

Type de plugin à utiliser.

clientapp

superexec.resources

Définir les demandes et les limites des conteneurs pour différentes ressources comme la CPU ou la mémoire (essentiel pour les charges de travail de production)

{}

superexec.supernode

Adresse du supernode auquel SuperExec doit se connecter

{}

superexec.superexecAuthSecretFile

Chemin vers un fichier contenant le secret partagé SuperExec.

""

superexec.volumes

Spécifiez une liste de volumes pour les pods SuperExec(s)

[]

superexec.volumeMounts

Permet de spécifier des VolumeMounts supplémentaires

[]

superexec.automountServiceAccountToken

Automount SA-TOKEN dans le pod.

true

superexec.serviceAccount.enabled

Activer un compte de service pour ce composant

true

superexec.serviceAccount.annotations

Annotations appliquées au compte de service activé

{}

superexec.serviceAccount.labels

Étiquettes appliquées au compte de service activé

{}

superexec.serviceAccount.automountServiceAccountToken

Automount SA-TOKEN

true

superexec.containerPorts.health

Port conteneur pour l’API de santé SuperExec

8081

superexec.podSecurityContext

Paramètres de sécurité pour le Pod SuperExec

{}

superexec.livenessProbe.enabled

Activer livenessProbe sur les conteneurs SuperExec

true

superexec.livenessProbe.initialDelaySeconds

Délai initial en secondes pour livenessProbe

0

superexec.livenessProbe.periodSeconds

Période en secondes pour livenessProbe

10

superexec.livenessProbe.timeoutSeconds

Temps d’attente en secondes pour livenessProbe

1

superexec.livenessProbe.failureThreshold

Seuil de défaillance pour livenessProbe

3

superexec.livenessProbe.successThreshold

Seuil de réussite pour livenessProbe

1

superexec.readinessProbe.enabled

Activer readinessProbe sur les conteneurs SuperExec

true

superexec.readinessProbe.initialDelaySeconds

Délai initial en secondes pour readinessProbe

0

superexec.readinessProbe.periodSeconds

Période en secondes pour readinessProbe

10

superexec.readinessProbe.timeoutSeconds

Temps d’attente en secondes pour readinessProbe

1

superexec.readinessProbe.failureThreshold

Seuil de défaillance pour readinessProbe

3

superexec.readinessProbe.successThreshold

Seuil de réussite pour readinessProbe

1

superexec.replicas

Le nombre de conteneurs SuperExec à lancer

1

superexec.labels

Étiquettes supplémentaires pour les pods SuperExec

{}

superexec.extraArgs

Ajouter des arguments supplémentaires aux arguments par défaut pour le SuperExec

[]

superexec.nodeSelector

Étiquettes de nœud pour les pods SuperExec qui se mélangent avec global.nodeSelector

{}

superexec.tolerations

Tolérations de nœud pour les pods SuperExec qui se mélangent avec global.tolerations

[]

superexec.updateStrategy.type

Type de stratégie de déploiement SuperExec

RollingUpdate

superexec.updateStrategy.rollingUpdate

Paramètres de configuration d’actualisation roulante pour le déploiement SuperExec

{}

superexec.affinity

Affinité de nœud pour les pods SuperExec qui se mélangent avec global.affinity

{}

superexec.env

Tableau avec des variables d’environnement supplémentaires à ajouter aux nœuds SuperExec qui se mélangent avec global.env

[]

superexec.lifecycle

Conteneurs SuperExec à automatiser la configuration avant ou après le démarrage

{}

superexec.annotations

Annotations personnalisées supplémentaires pour les pods SuperExec

{}

superexec.selectorLabels

Étiquettes de sélection supplémentaires pour les pods SuperExec

{}

superexec.podAnnotations

Annotations pour les pods SuperExec

{}

superexec.podLabels

Étiquettes de pod supplémentaires pour les pods SuperExec

{}

superexec.imagePullSecrets

Secrets d’image pull SuperExec qui surchargent global.imagePullSecrets

[]

superexec.image.registry

Registre d’image SuperExec

registry.hub.docker.com

superexec.image.repository

Répertoire d’image SuperExec

flwr/superexec-ee

superexec.image.tag

Tag d’image du SuperExec

1.29.0-ubuntu

superexec.image.digest

Digest d’image de SuperExec

""

superexec.image.pullPolicy

Politique de tirage d’image des composants

IfNotPresent

superexec.networkPolicy.enabled

Spécifiez si une NetworkPolicy doit être créée

true

superexec.networkPolicy.allowExternalEgress

Autoriser un trafic egress non restreint

true

superexec.networkPolicy.extraEgress

Ajouter des règles d’ingress supplémentaires à la NetworkPolicy (ignorées si allowExternalEgress=true)

[]