Ce tutoriel explique comment importer une application de conteneur dans un environnement Google Distributed Cloud (GDC) isolé et exécuter cette application sur un cluster Kubernetes. Une charge de travail en conteneur s'exécute sur un cluster Kubernetes dans un espace de noms de projet. Les clusters sont logiquement distincts des projets et les uns des autres pour fournir différents domaines de défaillance et garanties d'isolation. Toutefois, vous devez vous assurer que votre cluster est associé à un projet pour permettre la gestion des charges de travail conteneurisées dans un projet.
L'un des plus grands obstacles au déploiement d'une application conteneurisée est d'obtenir le binaire de l'application dans votre centre de données isolé. Collaborez avec votre équipe d'infrastructure et vos administrateurs pour transférer l'application vers votre poste de travail ou implémenter ce tutoriel directement sur votre serveur d'intégration et de déploiement continus (CI/CD).
Ce tutoriel utilise un exemple d'application de serveur Web disponible dans le Google Cloud dépôt Artifact Registry.
Objectifs
- Créez un registre Harbor géré.
- Transférez une image de conteneur vers le registre Harbor géré.
- Créez un cluster Kubernetes.
- Déployez l'exemple d'application de conteneur sur le cluster.
Coûts
Étant donné que GDC est conçu pour s'exécuter dans un centre de données sous air gap, les processus et informations de facturation sont limités au déploiement GDC et ne sont pas gérés par d'autres produits Google.
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.
Utilisez le tableau de bord "Coût prévu" pour anticiper les futurs coûts des SKU sur vos factures.
Pour suivre la consommation de stockage et de calcul, utilisez les tableaux de bord sur l'utilisation de la facturation.
Avant de commencer
Assurez-vous de disposer d'un projet pour gérer vos déploiements conteneurisés. Créez un projet si vous n'en avez pas.
Définissez l'espace de noms de votre projet en tant que variable d'environnement :
export NAMESPACE=PROJECT_NAMESPACE
Demandez à votre administrateur IAM de l'organisation de vous accorder les rôles suivants :
Rôle Administrateur d'espace de noms (
namepspace-admin
) pour l'espace de noms de votre projet. Ce rôle est nécessaire pour déployer des charges de travail de conteneur dans votre projet.Rôle d'administrateur d'instance Harbor (
harbor-instance-admin
) pour l'espace de noms de votre projet. Ce rôle est requis pour accéder en lecture et en écriture à toutes les ressources Harbor. Il est également nécessaire pour supprimer les instances Harbor.Rôle Lecteur d'instance Harbor (
harbor-instance-viewer
) pour l'espace de noms de votre projet. Ce rôle est requis pour afficher et sélectionner une instance Harbor.Rôle de créateur de projet Harbor (
harbor-project-creator
) pour l'espace de noms de votre projet. Ce rôle est requis pour accéder à un projet Harbor et le gérer.Rôle Administrateur de cluster utilisateur (
user-cluster-admin
) : ce rôle est requis pour créer un cluster Kubernetes et n'est pas lié à un espace de noms.
Connectez-vous au serveur d'API de gestion zonale et générez son fichier kubeconfig avec une identité utilisateur. Définissez le chemin d'accès kubeconfig en tant que variable d'environnement :
export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
Créer un registre Harbor géré
GDC air-gapped fournit Harbor en tant que service. Il s'agit d'un service entièrement géré qui vous permet de stocker et de gérer des images de conteneurs à l'aide de Harbor.
Pour utiliser Harbor en tant que service, vous devez d'abord créer une instance de registre Harbor et un projet Harbor.
Créer une instance de registre Harbor
Pour créer une instance de registre de conteneurs Harbor, procédez comme suit :
Console
Dans le menu de navigation, sélectionnez Harbor Container Registry (Registre de conteneurs Harbor) dans la section CI/CD.
Sélectionnez la zone dans laquelle créer votre instance Harbor. Une instance Harbor est une ressource zonale et doit être créée manuellement dans chaque zone pour garantir une haute disponibilité.
Cliquez sur Créer une instance.
Saisissez le nom de l'instance et acceptez les conditions d'utilisation de Harbor Managed.
Cliquez sur Créer une instance.
Vérifiez que votre nouvelle instance Harbor figure dans la section Instance Harbor.
Cliquez sur le lien externe Accéder à l'instance Harbor et notez l'URL de l'instance. Par exemple, le format de l'URL de l'instance ressemble à
harbor-1.org-1.zone1.google.gdc.test
. L'URL de l'instance ne doit pas inclure le préfixehttps://
.Définissez l'URL de l'instance en tant que variable à utiliser plus tard dans le tutoriel :
export INSTANCE_URL=INSTANCE_URL
Remplacez INSTANCE_URL par l'URL de l'instance de registre Harbor.
Exemple :
export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
gdcloud
Créez la nouvelle instance de registre de conteneurs Harbor :
gdcloud harbor instances create INSTANCE_NAME \ --project=PROJECT \
Remplacez les éléments suivants :
INSTANCE_NAME
: nom de l'instance Harbor.PROJECT
: nom du projet GDC.
Listez l'URL de l'instance :
gdcloud harbor instances describe INSTANCE_NAME \ --project=PROJECT
La sortie ressemble à ceci :
# Several lines of code are omitted here. status: url: https://harbor-1.org-1.zone1.google.gdc.test
Définissez l'URL de l'instance en tant que variable à utiliser plus tard dans le tutoriel :
export INSTANCE_URL=INSTANCE_URL
Remplacez INSTANCE_URL par l'URL de l'instance de registre Harbor. Assurez-vous que l'URL de l'instance n'inclut pas le préfixe
https://
.Exemple :
export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
Créer un projet Harbor dans le registre
Vous devez créer un projet Harbor dans l'instance de registre Harbor pour gérer vos images de conteneurs :
Console
Sur la page Harbor Container Registry, cliquez sur Create A Harbor Project (Créer un projet Harbor).
Saisissez le nom du projet.
Cliquez sur Créer.
Définissez le nom du projet Harbor comme variable à utiliser plus tard dans le tutoriel :
export HARBOR_PROJECT=HARBOR_PROJECT
gdcloud
Créez le projet Harbor :
gdcloud harbor harbor-projects create HARBOR_PROJECT \ --project=PROJECT \ --instance=INSTANCE_NAME
Remplacez les éléments suivants :
HARBOR_PROJECT
: nom du projet Harbor à créer.PROJECT
: nom du projet GDC.INSTANCE_NAME
: nom de l'instance Harbor.
Définissez le nom du projet Harbor comme variable à utiliser plus tard dans le tutoriel :
export HARBOR_PROJECT=HARBOR_PROJECT
Configurer Docker
Pour utiliser Docker dans votre registre Harbor, procédez comme suit :
Configurez Docker pour qu'il fasse confiance à Harbor en tant que service. Pour en savoir plus, consultez Configurer Docker pour qu'il fasse confiance à l'autorité de certification racine Harbor.
Configurez l'authentification Docker sur Harbor. Pour en savoir plus, consultez Configurer l'authentification Docker pour les instances de registre Harbor.
Créer un secret Kubernetes pour l'extraction d'images
Étant donné que vous utilisez un projet Harbor privé, vous devez créer un secret Kubernetes pour extraire les images.
Ajoutez un compte robot de projet Harbor pour qu'il serve de compte de service.
Dans la console Harbor, sélectionnez votre projet Harbor.
Cliquez sur Comptes de robot.
Sélectionnez New Robot Account (Nouveau compte robot).
Attribuez un nom à votre nouveau compte robot et définissez les paramètres supplémentaires.
Cliquez sur Ajouter.
Le nom et le secret du compte robot s'affichent sur l'écran de confirmation. Gardez cet écran ouvert pour vous y référer lors de la prochaine étape.
Pour en savoir plus, consultez la documentation de Harbor : https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account.
Dans une nouvelle fenêtre de terminal, connectez-vous à Docker avec le compte robot et le jeton secret de votre projet Harbor :
docker login ${INSTANCE_URL}
Lorsque vous y êtes invité, insérez le nom du projet robot pour le nom d'utilisateur et le jeton secret pour le mot de passe qui ont été fournis à l'étape précédente à partir de l'écran de réussite de la console Harbor.
Définissez un nom arbitraire pour le secret d'extraction d'image :
export SECRET=SECRET
Créez le secret requis pour l'extraction de l'image :
kubectl create secret docker-registry ${SECRET} \ --from-file=.dockerconfigjson=DOCKER_CONFIG \ -n ${NAMESPACE}
Remplacez
DOCKER_CONFIG
par le chemin d'accès au fichier.docker/config.json
.Vérifiez que votre secret existe dans l'espace de noms de votre projet GDC :
kubectl get secrets -n ${NAMESPACE}
Le résultat ressemble à ce qui suit :
NAME TYPE DATA AGE my-secret kubernetes.io/dockerconfigjson 1 23s
Transférer une image de conteneur vers le registre Harbor géré
Pour ce tutoriel, vous allez télécharger et transférer l'image du serveur Web nginx
vers le registre Harbor géré, puis l'utiliser pour déployer un exemple d'application de serveur Web nginx sur un cluster Kubernetes. L'application de serveur Web nginx est disponible dans le dépôt public Docker Hub.
Extrayez l'image
nginx
de Docker Hub vers votre poste de travail local à l'aide d'un réseau externe :docker pull nginx
Ajoutez à l'image locale le tag correspondant au nom du dépôt :
docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
Transférez l'image de conteneur
nginx
vers votre registre Harbor géré :docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
Créer un cluster Kubernetes
Maintenant que l'image de conteneur nginx
est stockée dans le registre Harbor géré et que vous pouvez y accéder, créez un cluster Kubernetes pour exécuter le serveur Web nginx.
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 zone dans laquelle créer votre cluster Kubernetes. Un cluster Kubernetes est une ressource zonale et doit être créé manuellement dans chaque zone pour garantir une haute disponibilité.
Cliquez sur Associer un projet, puis sélectionnez un projet à associer à votre cluster. Cliquez ensuite sur Enregistrer.
Cliquez sur Créer.
Attendez que le cluster soit créé. Lorsque le cluster est disponible, l'état
READY
s'affiche à côté de son nom.
API
Créez une ressource personnalisée
Cluster
et enregistrez-la en tant que fichier YAML, par exemplecluster.yaml
:apiVersion: cluster.gdc.goog/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: platform
Remplacez la valeur
CLUSTER_NAME
par le nom du cluster.Appliquez la ressource personnalisée à votre instance GDC :
kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}
Associez un projet à votre cluster Kubernetes à l'aide de la console GDC. Pour le moment, vous ne pouvez pas associer de projet au cluster à l'aide de l'API.
Pour en savoir plus sur la création d'un cluster Kubernetes, consultez Créer un cluster Kubernetes.
Déployer l'exemple d'application de conteneur
Vous êtes maintenant prêt à déployer l'image de conteneur nginx
sur votre cluster Kubernetes.
Kubernetes représente les applications sous forme de ressources Pod
, qui sont des unités évolutives contenant un ou plusieurs conteneurs. Le pod est la plus petite unité déployable dans Kubernetes. Généralement, vous déployez les pods sous la forme d'un ensemble d'instances dupliquées pouvant être mises à l'échelle et réparties sur votre cluster. Pour déployer un ensemble de répliques, vous pouvez utiliser un Deployment
Kubernetes.
Dans cette section, vous allez créer un Deployment
Kubernetes pour exécuter l'application de conteneur nginx
sur votre cluster. Ce déploiement possède des répliques ou des pods. Un pod Deployment
ne contient qu'un seul conteneur : l'image de conteneur nginx
. Vous créez également une ressource Service
qui fournit aux clients un moyen stable d'envoyer des requêtes aux pods de votre Deployment
.
Déployez le serveur Web nginx sur votre cluster Kubernetes :
Connectez-vous au cluster Kubernetes et générez son fichier kubeconfig avec une identité utilisateur. Définissez le chemin d'accès kubeconfig en tant que variable d'environnement :
export KUBECONFIG=CLUSTER_KUBECONFIG_PATH
Créez et déployez les ressources personnalisées Kubernetes
Deployment
etService
:kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \ create -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25 ports: - containerPort: 80 imagePullSecrets: - name: ${SECRET} --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - port: 80 protocol: TCP type: LoadBalancer EOF
Vérifiez que les pods ont été créés par le déploiement :
kubectl get pods -l app=nginx -n ${NAMESPACE}
Le résultat ressemble à ce qui suit :
NAME READY STATUS RESTARTS AGE nginx-deployment-1882529037-6p4mt 1/1 Running 0 1h nginx-deployment-1882529037-p29za 1/1 Running 0 1h nginx-deployment-1882529037-s0cmt 1/1 Running 0 1h
Créez une règle de réseau pour autoriser tout le trafic réseau vers l'espace de noms :
kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \ create -f - <<EOF 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
Exportez l'adresse IP du service
nginx
:export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \ -n ${NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`
Testez l'adresse IP du serveur
nginx
à l'aide decurl
:curl http://$IP
Effectuer un nettoyage
Pour éviter que les ressources utilisées dans ce tutoriel ne soient facturées sur votre compte GDC, vous devez les supprimer.
Supprimer l'image de conteneur
Pour supprimer l'image de conteneur de votre environnement GDC isolé, supprimez l'instance Harbor contenant l'image, ou conservez l'instance Harbor et supprimez l'image de conteneur individuelle.
Pour supprimer l'image de conteneur du registre Harbor géré, utilisez la console GDC :
Dans le menu de navigation, sélectionnez Harbor Container Registry (Registre de conteneurs Harbor) dans la section CI/CD.
Cliquez sur le lien externe Accéder à l'instance Harbor.
Supprimez l'image de conteneur à l'aide de l'interface utilisateur Harbor. Pour en savoir plus, consultez Supprimer des instances du registre Harbor.
Supprimer l'application de conteneur
Pour supprimer l'application de conteneur déployée, supprimez le projet GDC contenant les ressources, ou conservez le projet GDC et supprimez les ressources individuelles.
Pour supprimer les ressources individuelles, procédez comme suit :
Supprimez l'objet
Service
pour votre application de conteneur :kubectl delete service nginx-service -n ${NAMESPACE}
Supprimez l'objet
Deployment
pour votre application de conteneur :kubectl delete deployment nginx-deployment -n ${NAMESPACE}
Si vous avez créé un cluster Kubernetes de test uniquement pour ce tutoriel, supprimez-le :
kubectl delete clusters.cluster.gdc.goog/USER_CLUSTER_NAME \ -n platform --kubeconfig ${MANAGEMENT_API_SERVER}
Cela supprime les ressources qui constituent le cluster Kubernetes, telles que les instances de calcul, les disques et les ressources réseau :
Étapes suivantes
Explorez la hiérarchie des ressources et les détails concernant l'isolation des ressources.
Découvrez l'architecture des clusters.
Consultez la documentation Conteneurs Kubernetes pour GDC pour savoir comment gérer les conteneurs déployés sur vos clusters Kubernetes.
Découvrez comment gérer vos clusters Kubernetes une fois vos charges de travail de conteneurs déployées.
Découvrez les bonnes pratiques pour configurer vos charges de travail de conteneurs et d'autres ressources de service.