Cette page explique comment créer et gérer des charges de travail avec état dans un cluster Kubernetes d'appliance Google Distributed Cloud (GDC) isolée. Les charges de travail avec état vous permettent de mettre à l'échelle le déploiement de votre application avec un stockage persistant. Le stockage persistant fournit à votre application des identités cohérentes et des noms d'hôtes stables, quel que soit l'endroit où ses charges de travail sont planifiées.
Cette page s'adresse aux développeurs du groupe des opérateurs d'applications, qui sont chargés de créer des charges de travail d'application pour leur organisation.
Avant de commencer
Pour exécuter des commandes sur le cluster Kubernetes Bare Metal préconfiguré, assurez-vous de disposer des ressources suivantes :
Recherchez le nom du cluster Kubernetes ou demandez-le à votre administrateur de plate-forme.
Connectez-vous et générez le fichier kubeconfig pour le cluster Kubernetes si vous n'en avez pas.
Utilisez le chemin d'accès kubeconfig du cluster Kubernetes pour remplacer
CLUSTER_KUBECONFIGdans ces instructions.
Pour obtenir les autorisations requises pour créer des charges de travail avec état, demandez à votre administrateur IAM de l'organisation de vous attribuer le rôle d'administrateur de l'espace de noms (namespace-admin) dans l'espace de noms de votre projet.
Créer une ressource StatefulSet
Créez un objet StatefulSet en écrivant un fichier manifeste StatefulSet et en exécutant kubectl apply pour créer la ressource. Pour fournir aux clients un moyen stable d'envoyer des requêtes aux pods de votre ressource StatefulSet, vous devez également créer un objet Service.
La commande kubectl apply utilise des fichiers manifestes pour créer, mettre à jour et supprimer des ressources dans votre cluster. Il s'agit d'une méthode déclarative de configuration d'objet. Cette méthode conserve les écritures effectuées sur les objets actifs sans fusionner les modifications dans les fichiers de configuration d'objet.
Pour créer une ressource StatefulSet et Service, exécutez la commande suivante :
kubectl --kubeconfig CLUSTER_KUBECONFIG -n NAMESPACE \
apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
name: SERVICE_NAME
labels:
app: APP_NAME
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: APP_NAME
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: STATEFULSET_NAME
spec:
selector:
matchLabels:
app: APP_LABEL_NAME
serviceName: "SERVICE_NAME"
replicas: NUMBER_OF_REPLICAS
template:
metadata:
labels:
app: APP_LABEL_NAME
spec:
terminationGracePeriodSeconds: 10
containers:
- name: CONTAINER_NAME
image: CONTAINER_IMAGE
resources:
requests:
nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
limits:
nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: CONTAINER_STORAGE_VOLUME_PATH
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
EOF
Remplacez les éléments suivants :
CLUSTER_KUBECONFIG: fichier kubeconfig du cluster Kubernetes sur lequel vous déployez des charges de travail de conteneur.NAMESPACE: espace de noms du projet dans lequel déployer les charges de travail du conteneur.SERVICE_NAME: nom de l'objetService. Assurez-vous que l'objetStatefulSetdéfinit également l'objetServicedans sonserviceName.APP_NAME: nom de l'application à exécuter dans le déploiement.APP_LABEL_NAME: sélecteur de libellés qui détermine les pods appartenant à l'objetStatefulSet.STATEFULSET_NAME: nom de l'objetStatefulSet.NUMBER_OF_REPLICAS: nombre d'objetsPodrépliqués gérés par le déploiement.CONTAINER_NAME: nom du conteneur.CONTAINER_IMAGE: nom de l'image du conteneur. Vous devez inclure le chemin d'accès au registre de conteneurs et la version de l'image, par exempleREGISTRY_PATH/nginx:1.23. Pour en savoir plus sur la définition du chemin d'accès au registre de conteneurs, consultez la présentation du service Managed Harbor.CONTAINER_STORAGE_VOLUME_PATH: chemin d'accès dans le conteneur sur lequel un volume de stockage est installé.
Par exemple, l'objet StatefulSet suivant et l'objet Service correspondant créent des charges de travail de conteneur avec état :
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: REGISTRY_PATH/nginx:1.23Dans cet exemple :
- Un objet
Servicenomménginxest créé, indiqué par le champmetadata: name. L'objetServicecible une application appeléenginx, définie par les champslabels.app: nginxetselector.app: nginx. L'objetServiceexpose le port 80 et le nommeweb. Cet objetServicecontrôle le domaine réseau et achemine le trafic Internet vers l'application conteneurisée déployée par l'objetStatefulSet. - Un
StatefulSetnomméwebest créé avec trois objetsPodrépliqués, comme défini par le champreplicas: 3. - Le modèle
Pod, défini par la section.spec.template, indique que ses objetsPodsont libellésapp: nginx. - La spécification
Pod, définie par la section.template.spec, indique que les pods deStatefulSetexécutent un conteneur,nginx, qui exécute l'imagenginxdans sa version1.23. - La spécification
Podutilise le port Web ouvert par l'objetService. - La section
.template.spec.volumeMountsspécifie un champmountPath, nomméwww.mountPathest le chemin d'accès dans le conteneur où un volume de stockage est installé. StatefulSetprovisionne trois objetsPersistentVolumeClaim, nommésweb-www-0,web-www-1etweb-www-2, avec 1 Go d'espace de stockage provisionné chacun.
Une fois créé, le StatefulSet garantit que le nombre choisi d'objets Pod est en cours d'exécution et disponible à tout moment. L'objet StatefulSet remplace automatiquement les objets Pod qui échouent ou sont évincés de leurs nœuds, et associe de nouveaux objets Pod aux ressources de stockage, aux demandes de ressources et aux limites, ainsi qu'aux autres configurations définies dans la spécification Pod de l'objet StatefulSet.
Demander un stockage persistant dans une ressource StatefulSet
Le stockage persistant peut être provisionné de manière dynamique, de sorte que les volumes sous-jacents sont créés à la demande. Les applications peuvent demander stockage persistant à l'aide d'un objet PersistentVolumeClaim.
En règle générale, vous devez créer des objets PersistentVolumeClaim en plus de créer l'objet Pod. Cependant, les objets StatefulSet incluent un tableau volumeClaimTemplates qui génère les objets PersistentVolumeClaim. Chaque réplica StatefulSet obtient son propre objet PersistentVolumeClaim.
Pour en savoir plus, consultez Configurer le stockage des conteneurs.