Cette page présente la stratégie de déploiement recommandée pour créer une application de conteneur Kubernetes robuste et à haute disponibilité (HA) dans Google Distributed Cloud (GDC) air-gapped. Vous devez déployer l'application de conteneur dans plusieurs zones GDC et configurer la réplication de stockage asynchrone afin que l'application et ses données puissent être récupérées en cas de temps d'arrêt inattendu ou de sinistre local.
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. Pour en savoir plus, consultez la documentation sur les audiences pour GDC en mode air-gapped.
Objectifs
- Créez un cluster Kubernetes dans au moins deux zones de votre univers GDC.
- Configurez l'équilibrage de charge global.
- Déployez des charges de travail de conteneur sur chaque cluster Kubernetes zonal.
- Provisionnez le stockage et associez-le à vos pods.
- Configurez la réplication asynchrone du stockage à l'aide du stockage par blocs ou du stockage d'objets.
Avant de commencer
Vérifiez que vous travaillez dans un univers GDC avec plusieurs zones disponibles. Exécutez
gdcloud zones list
pour lister les zones disponibles dans votre univers. Pour en savoir plus, consultez Lister les zones d'un univers.Demandez à votre administrateur IAM de l'organisation de vous accorder les rôles suivants :
Le rôle Administrateur d'espace de noms (
namespace-admin
) pour créer et gérer des charges de travail de conteneur.Les rôles Administrateur de cluster utilisateur (
user-cluster-admin
) et Développeur de cluster utilisateur (user-cluster-developer
) pour créer et gérer des clusters Kubernetes et leurs pools de nœuds.Rôles Administrateur de l'équilibreur de charge (
load-balancer-admin
) et Administrateur de l'équilibreur de charge mondial (global-load-balancer-admin
) Vous devez disposer de ce rôle pour créer et gérer des équilibreurs de charge.Le rôle d'administrateur général de la réplication de volumes (
app-volume-replication-admin-global
). Vous devez disposer de ce rôle pour administrer la réplication de volumes.Le rôle Administrateur PNP global (
global-project-networkpolicy-admin
) pour créer et gérer les règles réseau du projet dans les zones.Les rôles Administrateur d'instance Harbor (
harbor-instance-admin
), Lecteur d'instance Harbor(harbor-instance-viewer
) et Créateur de projet Harbor (harbor-project-creator
). Ces rôles sont nécessaires pour créer et gérer des images de conteneur dans le registre d'artefacts.Le rôle Administrateur mondial de la réplication de volumes (
app-volume-replication-admin-global
) permet d'administrer la relation de réplication de volumes pour les ressources de stockage par blocs.Les rôles Administrateur des objets du bucket de projet (
project-bucket-object-admin
) et Administrateur du bucket de projet (project-bucket-admin
) pour créer et gérer des buckets de stockage.
Pour en savoir plus, consultez les descriptions des rôles.
Installez et configurez la gdcloud CLI, puis configurez vos contextes zonaux et globaux. Pour en savoir plus, consultez Gérer les ressources dans les zones.
Installez et configurez l'CLI kubectl, avec les fichiers kubeconfig appropriés définis pour le serveur d'API global, le serveur d'API Management et le cluster Kubernetes. Pour en savoir plus, consultez Générer manuellement un fichier kubeconfig.
Créer un cluster Kubernetes dans plusieurs zones
Un cluster Kubernetes est une ressource zonale. Vous devez donc créer un cluster séparément dans chaque zone.
Console
Dans le menu de navigation, sélectionnez Kubernetes Engine > Clusters.
Cliquez sur Créer un cluster.
Dans le champ Nom, spécifiez un nom pour le cluster.
Sélectionnez la version de Kubernetes pour le cluster.
Sélectionnez la zone dans laquelle créer le cluster.
Cliquez sur Associer un projet, puis sélectionnez un projet existant à associer à votre cluster. Cliquez ensuite sur Enregistrer. Vous pouvez associer ou dissocier des projets après avoir créé le cluster à partir de la page Détails du projet. Vous devez associer un projet à votre cluster avant de déployer des charges de travail de conteneur.
Cliquez sur Suivant.
Configurez les paramètres réseau de votre cluster. Vous ne pouvez pas modifier ces paramètres réseau après avoir créé le cluster. Le protocole Internet par défaut et unique compatible avec les clusters Kubernetes est le protocole Internet version 4 (IPv4).
Spécifiez la taille du pool d'adresses IP de l'équilibreur de charge, par exemple
20
.Sélectionnez le CIDR (Classless Inter-Domain Routing) du service à utiliser. Les adresses IP de vos services déployés, tels que les équilibreurs de charge, sont allouées à partir de cette plage.
Sélectionnez le CIDR du pod à utiliser. Le cluster alloue des adresses IP de cette plage à vos pods et VM.
Cliquez sur Suivant.
Consultez les détails du pool de nœuds par défaut généré automatiquement pour le cluster. Cliquez sur edit Modifier pour modifier le pool de nœuds par défaut.
Pour créer d'autres pools de nœuds, sélectionnez Ajouter un pool de nœuds. Lorsque vous modifiez le pool de nœuds par défaut ou que vous en ajoutez un, vous pouvez le personnaliser à l'aide des options suivantes :
- Attribuez un nom au pool de nœuds. Vous ne pouvez pas modifier le nom après avoir créé le pool de nœuds.
- Spécifiez le nombre de nœuds de calcul à créer dans le pool de nœuds.
Sélectionnez la classe de machine qui correspond le mieux aux exigences de votre charge de travail. Consultez la liste des paramètres suivants :
- Type de machine
- Processeur
- Mémoire
Cliquez sur Enregistrer.
Cliquez sur Créer pour créer le cluster.
Répétez ces étapes pour chaque zone de votre univers GDC. Assurez-vous qu'un cluster Kubernetes réside dans chaque zone que vous souhaitez utiliser pour votre stratégie HA.
API
Pour créer un cluster Kubernetes à l'aide de l'API, appliquez une ressource personnalisée à chaque zone GDC.
Créez une ressource personnalisée
Cluster
et déployez-la sur le serveur de l'API Management pour votre zone :kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF \ apiVersion: cluster.gdc.goog/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: platform spec: clusterNetwork: podCIDRSize: POD_CIDR serviceCIDRSize: SERVICE_CIDR initialVersion: kubernetesVersion: KUBERNETES_VERSION loadBalancer: ingressServiceIPSize: LOAD_BALANCER_POOL_SIZE nodePools: - machineTypeName: MACHINE_TYPE name: NODE_POOL_NAME nodeCount: NUMBER_OF_WORKER_NODES taints: TAINTS labels: LABELS acceleratorOptions: gpuPartitionScheme: GPU_PARTITION_SCHEME releaseChannel: channel: UNSPECIFIED EOF
Remplacez les éléments suivants :
MANAGEMENT_API_SERVER
: chemin kubeconfig du serveur de l'API Management zonale. Pour en savoir plus, consultez Passer au contexte zonal.CLUSTER_NAME
: nom du cluster. Le nom du cluster ne doit pas se terminer par-system
. Le suffixe-system
est réservé aux clusters créés par GDC.POD_CIDR
: taille des plages de réseau à partir desquelles les adresses IP virtuelles (VIP) des pods sont allouées. Si elle n'est pas définie, la valeur par défaut21
est utilisée.SERVICE_CIDR
: taille des plages de réseau à partir desquelles les adresses IP virtuelles de service sont allouées. Si elle n'est pas définie, la valeur par défaut23
est utilisée.KUBERNETES_VERSION
: version Kubernetes du cluster, par exemple1.26.5-gke.2100
. Pour lister les versions Kubernetes disponibles à configurer, consultez Lister les versions Kubernetes disponibles pour un cluster.LOAD_BALANCER_POOL_SIZE
: taille des pools d'adresses IP non chevauchants utilisés par les services d'équilibrage de charge. Si elle n'est pas définie, la valeur par défaut20
est utilisée.MACHINE_TYPE
: type de machine pour les nœuds de calcul du pool de nœuds. Consultez les types de machines disponibles pour connaître les configurations possibles.NODE_POOL_NAME
: nom du pool de nœuds.NUMBER_OF_WORKER_NODES
: nombre de nœuds de calcul à provisionner dans le pool de nœuds.TAINTS
: rejets à appliquer aux nœuds de ce pool de nœuds. Ce champ est facultatif.LABELS
: libellés à appliquer aux nœuds de ce pool de nœuds. Il contient une liste de paires clé/valeur. Ce champ est facultatif.GPU_PARTITION_SCHEME
: schéma de partitionnement du GPU si vous exécutez des charges de travail de GPU, par exemplemixed-2
. Le GPU n'est pas partitionné si ce champ n'est pas défini. Pour connaître les profils MIG (Multi-Instance GPU) disponibles, consultez Profils MIG compatibles.
Répétez l'étape précédente pour chaque zone dans laquelle vous souhaitez héberger votre application de conteneur pour votre stratégie de haute disponibilité.
Configurer des équilibreurs de charge
Pour répartir le trafic entre vos pods dans différentes zones, créez des équilibreurs de charge. Vous pouvez créer des équilibreurs de charge externes (ELB) et des équilibreurs de charge internes (ILB), qui peuvent tous deux être configurés au niveau de la zone ou au niveau mondial. Pour cet exemple, configurez un équilibreur de charge interne global et un équilibreur de charge externe global pour votre application de conteneur.
Créer un équilibreur de charge interne global
Les équilibreurs de charge internes (ILB) exposent les services au sein de l'organisation à partir d'un pool d'adresses IP internes attribué à l'organisation. Un service ILB n'est jamais accessible depuis un point de terminaison en dehors de l'organisation.
Pour créer un équilibreur de charge interne global pour vos charges de travail de conteneur, procédez comme suit.
gdcloud
Créez un équilibreur de charge interne qui cible les charges de travail de pod à l'aide de la gcloud CLI.
Cet équilibreur de charge interne cible toutes les charges de travail du projet correspondant au libellé défini dans l'objet Backend
. La ressource personnalisée Backend
doit être limitée à une zone.
Pour créer un équilibreur de charge interne à l'aide de la gcloud CLI, procédez comme suit :
Créez une ressource
Backend
zonale dans chaque zone où vos pods sont en cours d'exécution pour définir le point de terminaison de l'ILB :gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT \ --cluster=CLUSTER_NAME \ --zone=ZONE
Remplacez les éléments suivants :
BACKEND_NAME
: nom choisi pour la ressource de backend, par exemplemy-backend
.LABELS
: sélecteur définissant les points de terminaison entre les pods à utiliser pour cette ressource de backend, par exempleapp=web
.PROJECT
: nom de votre projet.CLUSTER_NAME
: cluster Kubernetes auquel la portée des sélecteurs définis est limitée. Si ce champ n'est pas spécifié, tous les points de terminaison portant le libellé indiqué sont sélectionnés. Ce champ est facultatif.ZONE
: zone à utiliser pour cet appel. Pour prédéfinir l'indicateur de zone pour toutes les commandes qui l'exigent, exécutezgdcloud config set core/zone ZONE
. L'indicateur de zone n'est disponible que dans les environnements multizones. Ce champ est facultatif.
Répétez cette étape pour chaque zone de votre univers GDC.
Créez une ressource
BackendService
globale :gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT \ --target-ports=TARGET_PORTS \ --global
Remplacez les éléments suivants :
BACKEND_SERVICE_NAME
: nom du service de backend.PROJECT
: nom de votre projet.TARGET_PORTS
: liste de ports cibles séparés par une virgule que ce service de backend traduit. Chaque port cible spécifie le protocole, le port sur la règle de transfert et le port sur l'instance de backend. Vous pouvez spécifier plusieurs ports cibles. Ce champ doit être au formatprotocol:port:targetport
, par exempleTCP:80:8080
. Ce champ est facultatif.
Ajoutez la ressource
BackendService
à la ressourceBackend
précédemment créée dans chaque zone :gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend-zone=ZONE \ --backend=BACKEND_NAME \ --project=PROJECT \ --global
Remplacez les éléments suivants :
BACKEND_SERVICE_NAME
: nom du service de backend global.ZONE
: zone du backend.BACKEND_NAME
: nom du backend zonal.PROJECT
: nom de votre projet.
Effectuez cette étape pour chaque backend zonal que vous avez créé précédemment.
Créez une ressource
ForwardingRule
interne qui définit l'adresse IP virtuelle (VIP) à laquelle le service est disponible :gdcloud compute forwarding-rules create FORWARDING_RULE_INTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=INTERNAL \ --project=PROJECT \ --global
Remplacez les éléments suivants :
FORWARDING_RULE_INTERNAL_NAME
: nom de la règle de transfert.CIDR
: CIDR à utiliser pour votre règle de transfert. Ce champ est facultatif. Si aucune valeur n'est spécifiée, un CIDRIPv4/32
est automatiquement réservé à partir du pool d'adresses IP mondiales. Spécifiez le nom d'une ressourceSubnet
dans le même espace de noms que cette règle de transfert. Une ressourceSubnet
représente les informations de demande et d'allocation d'un sous-réseau mondial. Pour en savoir plus sur les ressourcesSubnet
, consultez Gérer les sous-réseaux.PROTOCOL_PORT
: protocole et port à exposer sur la règle de transfert. Ce champ doit être au formatip-protocol=TCP:80
. Le port exposé doit être le même que celui que l'application réelle expose à l'intérieur du conteneur.
Pour valider l'équilibreur de charge interne configuré, vérifiez la condition
Ready
sur chacun des objets créés. Vérifiez le trafic avec une requêtecurl
adressée à l'adresse IPV :Pour obtenir l'adresse IP virtuelle attribuée, décrivez la règle de transfert :
gdcloud compute forwarding-rules describe FORWARDING_RULE_INTERNAL_NAME --global
Vérifiez le trafic avec une requête
curl
à l'adresse IPV au port spécifié dans le champ de la règle de transfert :curl http://FORWARDING_RULE_VIP:PORT
Remplacez les éléments suivants :
FORWARDING_RULE_VIP
: adresse IP virtuelle de la règle de transfert.PORT
: numéro de port de la règle de transfert.
API
Créez un équilibreur de charge interne qui cible les charges de travail de conteneur à l'aide de l'API KRM. Cet équilibreur de charge interne cible toutes les charges de travail du projet correspondant au libellé défini dans l'objet Backend
. Pour créer un équilibreur de charge interne mondial à l'aide de l'API KRM, procédez comme suit :
Créez une ressource
Backend
pour définir les points de terminaison de l'équilibreur de charge interne. Créez des ressourcesBackend
pour chaque zone dans laquelle les charges de travail de conteneur sont placées :kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT name: BACKEND_NAME spec: clusterName: CLUSTER_NAME endpointsLabels: matchLabels: app: APP_NAME EOF
Remplacez les éléments suivants :
MANAGEMENT_API_SERVER
: chemin d'accès kubeconfig du serveur kubeconfig de l'API Management zonale. Pour en savoir plus, consultez Passer à un contexte zonal.PROJECT
: nom de votre projet.BACKEND_NAME
: nom de la ressourceBackend
.CLUSTER_NAME
: cluster Kubernetes auquel la portée des sélecteurs définis est limitée. Si ce champ n'est pas spécifié, tous les points de terminaison portant le libellé indiqué sont sélectionnés. Ce champ est facultatif.APP_NAME
: nom de votre application de conteneur.
Vous pouvez utiliser la même ressource
Backend
pour chaque zone ou créer des ressourcesBackend
avec des ensembles de libellés différents pour chaque zone.Créez un objet
BackendService
à l'aide de la ressourceBackend
créée précédemment. Veillez à inclure la ressourceHealthCheck
:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME zone: ZONE healthCheckName: HEALTH_CHECK_NAME targetPorts: - port: PORT protocol: PROTOCOL targetPort: TARGET_PORT EOF
Remplacez les éléments suivants :
GLOBAL_API_SERVER
: chemin d'accès kubeconfig du serveur d'API global.PROJECT
: nom de votre projet.BACKEND_SERVICE_NAME
: nom choisi pour votre ressourceBackendService
.HEALTH_CHECK_NAME
: nom de la ressourceHealthCheck
que vous avez créée précédemment.BACKEND_NAME
: nom de la ressourceBackend
zonale.ZONE
: zone dans laquelle réside la ressourceBackend
. Vous pouvez spécifier plusieurs backends dans le champbackendRefs
. Exemple :- name: my-backend-1 zone: us-east1-a - name: my-backend-2 zone: us-east1-b
Le champ
targetPorts
est facultatif. Cette ressource liste les ports que cette ressourceBackendService
traduit. Si vous utilisez cet objet, indiquez les valeurs suivantes :PORT
: port exposé par le service.PROTOCOL
: protocole de couche 4 auquel le trafic doit correspondre. Seuls les protocoles TCP et UDP sont acceptés.TARGET_PORT
: port vers lequel la valeur est traduite, par exemple8080
. La valeur ne peut pas être répétée dans un objet donné.Voici un exemple de fichier
targetPorts
:targetPorts: - port: 80 protocol: TCP targetPort: 8080
Créez une ressource
ForwardingRule
interne définissant l'adresse IP virtuelle (VIP) à laquelle le service est disponible.kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ForwardingRuleInternal metadata: namespace: PROJECT name: FORWARDING_RULE_INTERNAL_NAME spec: cidrRef: CIDR ports: - port: PORT protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF
Remplacez les éléments suivants :
GLOBAL_API_SERVER
: chemin d'accès kubeconfig du serveur d'API global.PROJECT
: nom de votre projet.FORWARDING_RULE_INTERNAL_NAME
: nom choisi pour votre ressourceForwardingRuleInternal
.CIDR
: CIDR à utiliser pour votre règle de transfert. Ce champ est facultatif. Si aucune valeur n'est spécifiée, un CIDRIPv4/32
est automatiquement réservé à partir du pool d'adresses IP mondiales. Spécifiez le nom d'une ressourceSubnet
dans le même espace de noms que cette règle de transfert. Une ressourceSubnet
représente les informations de demande et d'allocation d'un sous-réseau mondial. Pour en savoir plus sur les ressourcesSubnet
, consultez Gérer les sous-réseaux.PORT
: port à exposer sur la règle de transfert. Utilisez le champports
pour spécifier un tableau de ports de couche 4 pour lesquels les paquets sont transférés vers les backends configurés avec cette règle de transfert. Vous devez spécifier au moins un port. Utilisez le champport
pour spécifier un numéro de port. Le port exposé doit être le même que celui que l'application réelle expose à l'intérieur du conteneur.PROTOCOL
: protocole à utiliser pour la règle de transfert, tel queTCP
. Une entrée du tableauports
doit se présenter comme suit :ports: - port: 80 protocol: TCP
Pour valider l'équilibreur de charge interne configuré, vérifiez la condition
Ready
sur chacun des objets créés. Vérifiez le trafic avec une requêtecurl
adressée à l'adresse IPV :Récupérez l'adresse IP virtuelle :
kubectl get forwardingruleinternal -n PROJECT
La sortie ressemble à ceci :
NAME BACKENDSERVICE CIDR READY ilb-name BACKEND_SERVICE_NAME 192.0.2.0/32 True
Testez le trafic avec une requête
curl
à l'adresse IP virtuelle au port spécifié dans le champ de la règle de transfert :curl http://FORWARDING_RULE_VIP:PORT
Remplacez les éléments suivants :
FORWARDING_RULE_VIP
: adresse IP virtuelle de la règle de transfert.PORT
: numéro de port du champ dans la règle de transfert.
Créer un équilibreur de charge externe global
Les équilibreurs de charge externes (ELB) exposent les services pour permettre l'accès depuis l'extérieur de l'organisation à partir des adresses IP d'un pool attribué à l'organisation à partir du pool d'adresses IP externes des instances plus important.
Pour créer un ELB global pour vos charges de travail de conteneur, procédez comme suit.
gdcloud
Utilisez la gcloud CLI pour créer un équilibreur de charge externe global qui cible toutes les charges de travail du projet correspondant au libellé défini dans l'objet Backend
.
La ressource personnalisée Backend
doit être limitée à une zone.
Pour que les services ELB fonctionnent, vous devez configurer et appliquer votre propre transfert de données
ProjectNetworkPolicy
personnalisé dans la règle afin d'autoriser le trafic vers les charges de travail de ce service ELB. Les règles de réseau contrôlent l'accès à vos charges de travail, et non à l'équilibreur de charge lui-même. Les ELB exposent les charges de travail à votre réseau client, ce qui nécessite des règles de réseau explicites pour autoriser le trafic externe vers le port de charge de travail, tel que8080
.Spécifiez l'adresse CIDR externe pour autoriser le trafic vers les charges de travail de cet équilibreur de charge externe :
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: PROJECT name: allow-inbound-traffic-from-external spec: policyType: Ingress subject: subjectType: UserWorkload ingress: - from: - ipBlock: cidr: CIDR ports: - protocol: TCP port: PORT EOF
Remplacez les éléments suivants :
GLOBAL_API_SERVER
: chemin d'accès kubeconfig du serveur d'API global. Si vous n'avez pas encore généré de fichier kubeconfig pour le serveur d'API global, consultez Générer manuellement un fichier kubeconfig pour en savoir plus.PROJECT
: nom de votre projet.CIDR
: CIDR externe à partir duquel l'ELB doit être accessible. Cette règle est requise, car l'équilibreur de charge externe utilise le retour direct du serveur (DSR), qui préserve l'adresse IP externe source et contourne l'équilibreur de charge sur le chemin de retour. Pour en savoir plus, consultez Créer une règle de pare-feu d'entrée globale pour le trafic inter-organisation.PORT
: port de backend sur les pods situés derrière l'équilibreur de charge. Cette valeur se trouve dans le champ.spec.ports[].targetPortfield
du fichier manifeste de la ressourceService
. Ce champ est facultatif.
Cette configuration permet à toutes les ressources des projets d'accéder à la plage CIDR spécifiée.
Créez une ressource
Backend
dans chaque zone pour définir le point de terminaison du CLB :gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT \ --cluster=CLUSTER_NAME \ --zone=ZONE
Remplacez les éléments suivants :
BACKEND_NAME
: nom de la ressource de backend, par exemplemy-backend
.LABELS
: sélecteur définissant les points de terminaison entre les pods à utiliser pour cette ressource de backend, par exempleapp=web
.PROJECT
: nom de votre projet.CLUSTER_NAME
: cluster Kubernetes auquel la portée des sélecteurs définis est limitée. Si ce champ n'est pas spécifié, tous les points de terminaison portant le libellé indiqué sont sélectionnés. Ce champ est facultatif.ZONE
: zone à utiliser pour cet appel. Pour prédéfinir l'indicateur de zone pour toutes les commandes qui l'exigent, exécutezgdcloud config set core/zone ZONE
. L'indicateur de zone n'est disponible que dans les environnements multizones. Ce champ est facultatif.
Vous pouvez utiliser la même ressource
Backend
pour chaque zone ou créer des ressourcesBackend
avec des ensembles de libellés différents pour chaque zone.Créez une ressource
BackendService
globale :gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT \ --target-ports=TARGET_PORTS \ --health-check=HEALTH_CHECK_NAME \ --global
Remplacez les éléments suivants :
BACKEND_SERVICE_NAME
: nom choisi pour ce service de backend.PROJECT
: nom de votre projet.TARGET_PORTS
: liste de ports cibles séparés par une virgule que ce service de backend traduit. Chaque port cible spécifie le protocole, le port sur la règle de transfert et le port sur l'instance de backend. Vous pouvez spécifier plusieurs ports cibles. Ce champ doit être au formatprotocol:port:targetport
, par exempleTCP:80:8080
. Ce champ est facultatif.HEALTH_CHECK_NAME
: nom de la ressource de vérification de l'état. Ce champ est facultatif.
Ajoutez la ressource
BackendService
globale à la ressourceBackend
zonale créée précédemment :gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend=BACKEND_NAME \ --backend-zone=ZONE \ --project=PROJECT \ --global
Effectuez cette étape pour chaque backend zonal que vous avez créé précédemment.
Créez une ressource
ForwardingRule
externe qui définit l'adresse IP virtuelle à laquelle le service est disponible :gdcloud compute forwarding-rules create FORWARDING_RULE_EXTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=EXTERNAL \ --project=PROJECT \ --global
Remplacez les éléments suivants :
FORWARDING_RULE_EXTERNAL_NAME
: nom de la règle de transfert.CIDR
: CIDR à utiliser pour votre règle de transfert. Ce champ est facultatif. Si aucune valeur n'est spécifiée, un CIDRIPv4/32
est automatiquement réservé à partir du pool d'adresses IP mondiales. Spécifiez le nom d'une ressourceSubnet
dans le même espace de noms que cette règle de transfert. Une ressourceSubnet
représente les informations de demande et d'allocation d'un sous-réseau mondial. Pour en savoir plus sur les ressourcesSubnet
, consultez Gérer les sous-réseaux.PROTOCOL_PORT
: protocole et port à exposer sur la règle de transfert. Ce champ doit être au formatip-protocol=TCP:80
. Le port exposé doit être le même que celui que l'application expose réellement dans le conteneur.PROJECT
: nom de votre projet.
Pour valider l'ELB configuré, vérifiez la condition
Ready
sur chacun des objets créés. Vérifiez le trafic avec une requêtecurl
à l'adresse IP virtuelle :Pour obtenir l'adresse IP virtuelle attribuée, décrivez la règle de transfert :
gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME
Vérifiez le trafic avec une requête
curl
adressée à la VIP au port spécifié dans le champPROTOCOL_PORT
de la règle de transfert :curl http://FORWARDING_RULE_VIP:PORT
Remplacez les éléments suivants :
FORWARDING_RULE_VIP
: adresse IP virtuelle de la règle de transfert.PORT
: numéro de port du champPROTOCOL_PORT
dans la règle de transfert.
API
Créez un ELB qui cible les charges de travail des pods à l'aide de l'API KRM. Cet ELB cible toutes les charges de travail du projet correspondant au libellé défini dans l'objet Backend
. Pour créer un ELB zonal à l'aide de l'API KRM, procédez comme suit :
Pour que les services ELB fonctionnent, vous devez configurer et appliquer votre propre transfert de données
ProjectNetworkPolicy
personnalisé dans la règle afin d'autoriser le trafic vers les charges de travail de ce service ELB. Les règles de réseau contrôlent l'accès à vos charges de travail, et non à l'équilibreur de charge lui-même. Les ELB exposent les charges de travail à votre réseau client, ce qui nécessite des règles de réseau explicites pour autoriser le trafic externe vers le port de charge de travail, tel que8080
.Spécifiez l'adresse CIDR externe pour autoriser le trafic vers les charges de travail de cet équilibreur de charge externe :
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: PROJECT name: allow-inbound-traffic-from-external spec: policyType: Ingress subject: subjectType: UserWorkload ingress: - from: - ipBlock: cidr: CIDR ports: - protocol: TCP port: PORT EOF
Remplacez les éléments suivants :
GLOBAL_API_SERVER
: chemin d'accès kubeconfig du serveur d'API global. Si vous n'avez pas encore généré de fichier kubeconfig pour le serveur d'API global, consultez Générer manuellement un fichier kubeconfig pour en savoir plus.PROJECT
: nom de votre projet.CIDR
: CIDR externe à partir duquel l'ELB doit être accessible. Cette règle est requise, car l'équilibreur de charge externe utilise le retour direct du serveur (DSR), qui préserve l'adresse IP externe source et contourne l'équilibreur de charge sur le chemin de retour. Pour en savoir plus, consultez Créer une règle de pare-feu d'entrée globale pour le trafic inter-organisation.PORT
: port de backend sur les pods situés derrière l'équilibreur de charge. Cette valeur se trouve dans le champ.spec.ports[].targetPortfield
du fichier manifeste de la ressourceService
. Ce champ est facultatif.
Créez une ressource
Backend
pour définir les points de terminaison du ELB. Créez des ressourcesBackend
pour chaque zone dans laquelle les charges de travail sont placées :kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT name: BACKEND_NAME spec: clusterName: CLUSTER_NAME endpointsLabels: matchLabels: app: APP_NAME EOF
Remplacez les éléments suivants :
MANAGEMENT_API_SERVER
: chemin d'accès kubeconfig du serveur kubeconfig de l'API Management zonale. Si vous n'avez pas encore généré de fichier kubeconfig pour le serveur d'API dans votre zone cible, consultez Générer manuellement un fichier kubeconfig pour en savoir plus.PROJECT
: nom de votre projet.BACKEND_NAME
: le nom de la ressourceBackend
.CLUSTER_NAME
: cluster Kubernetes auquel la portée des sélecteurs définis est limitée. Si ce champ n'est pas spécifié, tous les points de terminaison portant le libellé indiqué sont sélectionnés. Ce champ est facultatif.APP_NAME
: nom de votre application de conteneur.
Vous pouvez utiliser la même ressource
Backend
pour chaque zone ou créer des ressourcesBackend
avec des ensembles de libellés différents pour chaque zone.Créez un objet
BackendService
à l'aide de la ressourceBackend
créée précédemment :kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME zone: ZONE healthCheckName: HEALTH_CHECK_NAME EOF
Remplacez les éléments suivants :
BACKEND_SERVICE_NAME
: nom choisi pour votre ressourceBackendService
.HEALTH_CHECK_NAME
: nom de la ressourceHealthCheck
que vous avez créée précédemment. N'incluez pas ce champ si vous configurez un ELB pour des charges de travail de pod.ZONE
: zone dans laquelle réside la ressourceBackend
. Vous pouvez spécifier plusieurs backends dans le champbackendRefs
. Exemple :
- name: my-backend-1 zone: us-east1-a - name: my-backend-2 zone: us-east1-b
Créez une ressource
ForwardingRule
externe définissant l'adresse IP virtuelle à laquelle le service est disponible.kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ForwardingRuleExternal metadata: namespace: PROJECT name: FORWARDING_RULE_EXTERNAL_NAME spec: cidrRef: CIDR ports: - port: PORT protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF
Remplacez les éléments suivants :
FORWARDING_RULE_EXTERNAL_NAME
: nom choisi pour votre ressourceForwardingRuleExternal
.CIDR
: CIDR à utiliser pour votre règle de transfert. Ce champ est facultatif. Si aucune valeur n'est spécifiée, un CIDRIPv4/32
est automatiquement réservé à partir du pool d'adresses IP mondiales. Spécifiez le nom d'une ressourceSubnet
dans le même espace de noms que cette règle de transfert. Une ressourceSubnet
représente les informations de demande et d'allocation d'un sous-réseau mondial. Pour en savoir plus sur les ressourcesSubnet
, consultez Gérer les sous-réseaux.PORT
: port à exposer sur la règle de transfert. Utilisez le champports
pour spécifier un tableau de ports de couche 4 pour lesquels les paquets sont transférés vers les backends configurés avec cette règle de transfert. Vous devez spécifier au moins un port. Utilisez le champport
pour spécifier un numéro de port. Le port exposé doit être le même que celui que l'application réelle expose à l'intérieur du conteneur.PROTOCOL
: protocole à utiliser pour la règle de transfert, tel queTCP
. Une entrée du tableauports
doit se présenter comme suit :
ports: - port: 80 protocol: TCP
Pour valider l'ELB configuré, vérifiez la condition
Ready
sur chacun des objets créés. Essayez de tester le trafic avec une requêtecurl
adressée à l'adresse IP virtuelle.Récupérez l'adresse IP virtuelle du projet :
kubectl get forwardingruleexternal -n PROJECT
La sortie ressemble à ceci :
NAME BACKENDSERVICE CIDR READY elb-name BACKEND_SERVICE_NAME 192.0.2.0/32 True
Vérifiez le trafic à l'aide d'une requête curl vers l'adresse IP virtuelle au port spécifié dans le champ
PORT
de la règle de transfert :curl http://FORWARDING_RULE_VIP:PORT
Remplacez
FORWARDING_RULE_VIP:PORT
par l'adresse IP virtuelle et le port de la règle de transfert, par exemple192.0.2.0:80
.
Déployer des charges de travail de conteneur sur chaque cluster zonal
Les charges de travail de conteneur ne sont pas une ressource globale. Vous devez donc déployer chacune de vos applications de conteneur séparément dans les clusters Kubernetes zonaux.
Connectez-vous à la zone qui héberge votre cluster Kubernetes :
gdcloud config set core/zone ZONE
Vérifiez que votre image de conteneur est disponible dans le registre Harbor géré. Pour en savoir plus, consultez le tutoriel Déployer une application de conteneur.
Créez un fichier manifeste pour votre charge de travail de conteneur et déployez-le sur votre cluster Kubernetes zonal :
kubectl --kubeconfig KUBERNETES_CLUSTER -n PROJECT \ apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: DEPLOYMENT_NAME spec: replicas: NUMBER_OF_REPLICAS selector: matchLabels: run: APP_NAME template: metadata: labels: run: APP_NAME spec: containers: - name: CONTAINER_NAME image: HARBOR_INSTANCE_URL/HARBOR_PROJECT_NAME/IMAGE:TAG EOF
Remplacez les éléments suivants :
KUBERNETES_CLUSTER
: fichier kubeconfig du cluster Kubernetes zonal sur lequel vous déployez des charges de travail de conteneurs. Si vous n'avez pas encore généré de fichier kubeconfig pour votre cluster Kubernetes zonal, consultez Générer manuellement un fichier kubeconfig pour en savoir plus.PROJECT
: espace de noms du projet dans lequel déployer les charges de travail du conteneur.DEPLOYMENT_NAME
: nom de votre déploiement de conteneur.NUMBER_OF_REPLICAS
: nombre d'objetsPod
répliqués gérés par le déploiement.APP_NAME
: nom de l'application à exécuter dans le déploiement.CONTAINER_NAME
: nom du conteneur.HARBOR_INSTANCE_URL
: URL de l'instance Harbor, par exempleharbor-1.org-1.zone1.google.gdc.test.
. Pour récupérer l'URL de l'instance Harbor, consultez Afficher les instances du registre Harbor.HARBOR_PROJECT_NAME
: nom du projet Harbor, tel quemy-project
.IMAGE
: nom de l'image, par exemplenginx
.TAG
: tag de la version de l'image que vous souhaitez extraire, par exemple1.0
.
Répétez les étapes précédentes pour chaque zone de votre univers GDC. Assurez-vous que votre application de conteneur réside dans chaque zone que vous souhaitez pour votre stratégie de haute disponibilité.
Exposer votre application de conteneur à l'aide de Kubernetes
Vous devez exposer votre application de conteneur pour permettre l'accès à partir d'autres ressources de votre univers GDC.
Créez une ressource
Service
detype: LoadBalancer
. Cette ressource expose les pods de votre application sur un réseau.kubectl --kubeconfig KUBERNETES_CLUSTER -n PROJECT \ apiVersion: v1 kind: Service metadata: name: SERVICE_NAME spec: selector: app: APP_NAME ports: - port: 80 protocol: TCP type: LoadBalancer EOF
Remplacez les éléments suivants :
KUBERNETES_CLUSTER
: fichier kubeconfig du cluster Kubernetes zonal sur lequel vous déployez des charges de travail de conteneurs.PROJECT
: espace de noms du projet dans lequel résident vos charges de travail de conteneur.SERVICE_NAME
: nom du service d'équilibreur de charge.APP_NAME
: libellé que vous avez appliqué à votre application de conteneur.
Créez une ressource personnalisée
NetworkPolicy
pour autoriser tout le trafic réseau vers l'espace de noms par défaut :kubectl --kubeconfig KUBERNETES_CLUSTER -n PROJECT \ apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: annotations: name: allow-all spec: ingress: - from: - ipBlock: cidr: 0.0.0.0/0 podSelector: {} policyTypes: - Ingress EOF
Provisionner un espace de stockage persistant pour vos pods
Vous devez créer une ressource PersistentVolumeClaim
(PVC) pour fournir un stockage persistant aux pods d'application.
Les instructions suivantes montrent comment créer un volume à l'aide de l'outil standard-rwo
StorageClass
de GDC.
Créer une ressource
PersistentVolumeClaim
Par exemple, configurez-le avec un mode d'accèsReadWriteOnce
et une classe de stockagestandard-rwo
:kubectl --kubeconfig KUBERNETES_CLUSTER \ --namespace PROJECT apply -f - <<EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: PVC_NAME spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: standard-rwo EOF
Remplacez les éléments suivants :
KUBERNETES_CLUSTER
: fichier kubeconfig pour le cluster Kubernetes.PROJECT
: espace de noms du projet dans lequel créer la PVC.PVC_NAME
: nom de l'objetPersistentVolumeClaim
.
Les objets
PersistentVolume
(PV) sont provisionnés de manière dynamique. Vérifiez l'état des nouveaux PV dans votre cluster Kubernetes :kubectl get pv --kubeconfig KUBERNETES_CLUSTER
Le résultat ressemble à ce qui suit :
NAME CAPACITY ACCESS MODES STATUS CLAIM STORAGECLASS AGE pvc-uuidd 10Gi RWO Bound pvc-name standard-rwo 60s
Configurez vos charges de travail de conteneur pour qu'elles utilisent le PVC. Voici un exemple de fichier manifeste de pod qui utilise une PVC
standard-rwo
:kubectl --kubeconfig KUBERNETES_CLUSTER \ --namespace PROJECT apply -f - <<EOF apiVersion: apps/v1 kind: Pod metadata: name: web-server-deployment labels: app: APP_LABEL spec: containers: - name: CONTAINER_NAME image: HARBOR_INSTANCE_URL/HARBOR_PROJECT_NAME/IMAGE:TAG volumeMounts: - mountPath: MOUNT_PATH name: data volumes: - name: data persistentVolumeClaim: claimName: PVC_NAME EOF
Remplacez les éléments suivants :
KUBERNETES_CLUSTER
: fichier kubeconfig du cluster Kubernetes sur lequel vous déployez des charges de travail de conteneurs.PROJECT
: espace de noms du projet dans lequel réside la PVC.APP_LABEL
: libellé que vous avez appliqué à votre application de conteneur.CONTAINER_NAME
: nom du conteneur.HARBOR_INSTANCE_URL
: URL de l'instance Harbor, par exempleharbor-1.org-1.zone1.google.gdc.test.
. Pour récupérer l'URL de l'instance Harbor, consultez Afficher les instances du registre Harbor.HARBOR_PROJECT_NAME
: nom du projet Harbor, tel quemy-project
.IMAGE
: nom de l'image, par exemplenginx
.TAG
: tag de la version de l'image que vous souhaitez extraire, par exemple1.0
.MOUNT_PATH
: chemin d'accès dans le pod pour installer votre volume.PVC_NAME
: PVC que vous avez créé.
Configurer la réplication asynchrone du stockage
Les univers multizones GDC permettent d'utiliser des ressources de stockage répliquées telles que des volumes et des buckets en mode asynchrone pour les scénarios de reprise après sinistre. Ces options de ressources de stockage permettent la réplication asynchrone des données entre deux zones d'une même région. La réplication asynchrone s'effectue en arrière-plan et fournit un objectif de point de récupération (RPO) faible, mais non nul, en cas de sinistre. Toutes les données répliquées sont en ligne et immédiatement accessibles, mais une procédure de basculement manuel peut être nécessaire pour permettre l'écriture dans la zone secondaire.
Vous pouvez choisir l'un des types de réplication de stockage asynchrone suivants pour votre application de conteneur :
Créer un bucket bizone pour le stockage d'objets
Les données de stockage d'objets sont écrites dans un seul bucket dont les données sont stockées dans les deux zones. Étant donné que les données sont copiées de manière asynchrone entre les zones, il est possible que les zones ne contiennent pas les mêmes versions d'objet à un moment donné, mais elles finiront par devenir équivalentes si aucune autre modification n'est apportée. Contrairement à la réplication de volumes, les buckets répliqués sont accessibles en écriture pendant les partitions de zone. Chaque écriture dans un objet produit une version différente. La dernière version dans l'une ou l'autre zone sera l'état final une fois la connectivité rétablie.
Vérifiez que votre opérateur d'infrastructure (IO) a créé la ressource personnalisée
BucketLocationConfig
, qui est requise pour la réplication asynchrone entre les zones pour le stockage d'objets. Cette ressource doit être déployée sur le serveur d'API global racine.Créez la ressource personnalisée
Bucket
à double zone :kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: object.global.gdc.goog/v1 kind: Bucket metadata: name: BUCKET_NAME namespace: PROJECT spec: location: LOCATION_NAME description: Sample DZ Bucket storageClass: Standard EOF
Remplacez les éléments suivants :
GLOBAL_API_SERVER
: fichier kubeconfig pour le serveur d'API global.BUCKET_NAME
: nom du bucket de stockage.PROJECT
: nom du projet dans lequel réside le bucket.LOCATION_NAME
: emplacement physique où se trouvent les données d'objets dans le bucket. Il doit correspondre au nom d'une ressourceBucketLocation
existante. Pour interroger le serveur d'API global de votre organisation afin d'obtenir la liste des ressourcesBucketLocation
disponibles, exécutezkubectl --kubeconfig GLOBAL_API_SERVER bucketlocations
. S'il n'y a pas de ressourcesBucketLocation
, contactez votre IO pour vérifier qu'il a activé la réplication asynchrone.
Configurer la réplication asynchrone du stockage de blocs entre les zones
Le stockage de blocs répliqué fournit des volumes répliqués de manière asynchrone (PV), qui maintiennent l'équivalence des blocs entre les volumes principal et secondaire. En raison de la nature asynchrone, le volume secondaire reflète l'état de la zone principale à un moment donné dans le passé (RPO non nul). Le volume secondaire ne peut pas être monté tant qu'il reste la cible de la réplication, ce qui nécessite une intervention manuelle pour mettre fin à la relation et permettre les opérations d'écriture.
Vous devez configurer une relation de réplication du stockage entre les zones pour créer des données répliquées disponibles pour le basculement si les données de la zone source deviennent indisponibles. Cela est pertinent si vous utilisez le stockage par blocs pour votre application de conteneur.
Avant de commencer, vérifiez que votre opérateur d'infrastructure (IO) a créé et configuré les ressources personnalisées StorageClusterPeering
et StorageVirtualMachinePeering
pour permettre la réplication du stockage par blocs dans les zones. Cette ressource doit être déployée sur le serveur d'API racine global.
Créez un fichier YAML de ressource personnalisée
VolumeReplicationRelationship
et déployez-le sur le serveur d'API global :kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: storage.global.gdc.goog/v1 kind: VolumeReplicationRelationship metadata: name: PVC_REPL_NAME namespace: PROJECT spec: source: pvc: clusterRef: SOURCE_PVC_CLUSTER pvcRef: SOURCE_PVC zoneRef: SOURCE_ZONE destination: pvc: clusterRef: DEST_PVC_CLUSTER zoneRef: DEST_ZONE EOF
Remplacez les éléments suivants :
GLOBAL_API_SERVER
: fichier kubeconfig pour le serveur d'API global.PVC_REPL_NAME
: nom de la relation de réplication de volume.PROJECT
: projet dans lequel réside l'infrastructure de stockage.SOURCE_PVC_CLUSTER
: cluster Kubernetes dans lequel le PVC est hébergé.SOURCE_PVC
: PVC de la zone source à répliquer.SOURCE_ZONE
: zone source où est hébergé le PVC.DEST_PVC_CLUSTER
: cluster Kubernetes de destination vers lequel répliquer le PVC.DEST_ZONE
: zone de destination vers laquelle répliquer la PVC.
Créez une ressource personnalisée
VolumeFailover
dans la zone de destination, ce qui arrête la réplication vers la zone de destination si la zone source est indisponible pour une raison quelconque :kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: storage.gdc.goog/v1 kind: VolumeFailover metadata: name: PVC_FAILOVER_NAME namespace: PROJECT spec: volumeReplicationRelationshipRef: PVC_REPL_NAME EOF
Remplacez les éléments suivants :
MANAGEMENT_API_SERVER
: fichier kubeconfig du serveur de l'API Management zonale.PVC_FAILOVER_NAME
: nom du basculement de la PVC.PROJECT
: projet dans lequel réside l'infrastructure de stockage.PVC_REPL_NAME
: nom de la relation de réplication de volume.
Étapes suivantes
- Charges de travail Kubernetes pour la haute disponibilité
- Charges de travail de conteneur dans GDC
- Présentation des zones multiples