Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
elearning:workbooks:kubernetes:k8s10 [2022/12/12 06:30] – admin | elearning:workbooks:kubernetes:k8s10 [2024/12/15 07:21] (Version actuelle) – admin | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
~~PDF: | ~~PDF: | ||
- | Version | + | Version |
Dernière mise-à-jour : ~~LASTMOD~~ | Dernière mise-à-jour : ~~LASTMOD~~ | ||
- | ======DOF311 - Kubernetes Avancé====== | + | ======DOF311 - Validation de la Formation====== |
- | =====Contenu du Module===== | + | =====Rappel de l' |
- | * **DOF311 | + | ^ VM ^ FQDN ^ IP ^ OS ^ Version |
- | * Contenu | + | | Gateway_10.0.2.40 | gateway.ittraining.loc | 10.0.2.40 | Debian |
+ | | CentOS_10.0.2.45 | centos8.ittraining.loc | 10.0.2.45 | CentOS | ||
+ | | Kubemaster_10.0.2.65 | kubemaster.ittraining.loc | 192.168.56.2 | Debian | ||
+ | | Kubenode01_10.0.2.66 | kubenode01.ittraining.loc | 192.168.56.3 | Debian | ||
+ | | Kubenode02_10.0.2.67 | kubenode02.ittraining.loc | 192.168.56.4 | Debian | ||
+ | |||
+ | Dans votre VirtualBox vous **devez** créer un **Réseau privé hôte** dénommé **vboxnet0** ayant l' | ||
+ | |||
+ | Les VMs **[[https:// | ||
+ | |||
+ | * **[[https:// | ||
+ | * **[[https:// | ||
+ | * **[[https:// | ||
+ | * **[[https:// | ||
+ | * **[[https:// | ||
+ | |||
+ | =====Rappel du Contenu de la Formation===== | ||
+ | |||
+ | * **DOF301 - Création de Clusters Kubernetes** | ||
+ | * L' | ||
+ | * Présentation de Kubernetes (k8s) | ||
+ | * Master | ||
+ | * Nœuds (Minions) | ||
+ | * LAB #1 - Création du Cluster Kubernetes avec des Machines Virtuelles | ||
+ | * 1.1 - Présentation | ||
+ | * 1.2 - Connexion à la Machine Virtuelle kubemaster | ||
+ | * 1.3 - Tester le Réseau | ||
+ | * 1.4 - Initialisation du Maître du Cluster | ||
+ | * 1.5 - Installation d'une Extension Réseau pour la Communication entre des PODs | ||
+ | * 1.6 - Connexion des Travailleurs au Maître | ||
+ | * 1.7 - K8s et la Haute Disponibilité | ||
+ | * LAB #2 - Création du Cluster Kubernetes avec Minikube | ||
+ | * 2.1 - Présentation de Minikube | ||
+ | * 2.2 - Installation de Minikube | ||
+ | * 2.3 - Configuration de Minikube | ||
+ | * 2.4 - Installation de Docker | ||
+ | * 2.5 - Installation de kubectl | ||
+ | * 2.6 - La Commande minikube addons | ||
+ | * 2.7 - La Commande minikube dashboard | ||
+ | |||
+ | * **DOF302 - Gestion des PODs, Contrôleurs de Réplication, | ||
+ | * LAB #1 - Création d'un POD | ||
+ | * 1.1 - Présentation d'un POD | ||
+ | * 1.2 - Création Manuelle d'un POD | ||
+ | * 1.3 - Création d'un POD à l'aide d'un fichier YAML | ||
+ | * apiVersion | ||
+ | * kind | ||
+ | * metadata | ||
+ | * spec | ||
+ | * Utilisation du Fichier YAML | ||
+ | * LAB #2 - Utilisation de Contrôleurs de Réplication et ReplicaSets | ||
+ | * 2.1 - Contrôleurs de Réplication | ||
+ | * Présentation d'un Contrôleur de Réplication | ||
+ | * Mise en Application | ||
+ | * 2.2 - ReplicaSets | ||
+ | * Présentation d'un ReplicaSet | ||
+ | * Mise en Application | ||
+ | * LAB #3 - Gestion des Deployments | ||
+ | * 3.1 - Présentation d'un Deployment | ||
+ | * 3.2 - Mise en Application | ||
+ | * Rollouts | ||
+ | * Rolling Updates | ||
+ | * Rollbacks | ||
+ | * LAB #4 - Gestion de la Maintenance | ||
+ | * 4.1 - La Commande drain | ||
+ | * 4.2 - La Commande uncordon | ||
+ | * LAB #5 - Gestion des Mises-à-jour | ||
+ | * 5.1 - Mise-à-jour de kubeadm | ||
+ | * 5.2 - Mise-à-jour des Travailleurs | ||
+ | |||
+ | * **DOF303 - Les Commandes kubectl, krew et kustomize** | ||
+ | * LAB #1 - Utilisation de la Commande kubectl | ||
+ | * 1.1 - Obtenir de l'Aide sur les Commandes de kubectl | ||
+ | * 1.2 - Obtenir de l' | ||
+ | * La Commande version | ||
+ | * La Commande cluster-info | ||
+ | * La Commande api-versions | ||
+ | * La Commande api-resources | ||
+ | * 1.3 - Obtenir de l' | ||
+ | * La Commande describe node | ||
+ | * La Commande top | ||
+ | * 1.4 - Obtenir de l' | ||
+ | * La Commande describe pod | ||
+ | * La Commande top | ||
+ | * 1.5 - Travailler avec la commande kubectl | ||
+ | * La Commande apply | ||
+ | * La Commande create | ||
+ | * La Commande get | ||
+ | * Utilisation des Options | ||
+ | * La Commande exec | ||
+ | * Commandes Impératives | ||
+ | * LAB #2 - Gestion les plugins de kubectl avec la Commande krew | ||
+ | * 2.1 - Installation de krew | ||
+ | * 2.2 - Consultation de la liste des plugins | ||
+ | * 2.3 - Installation et utilisation de plugins | ||
+ | * 2.4 - Mise à jour et suppression de plugins | ||
+ | * LAB #3 - Gestion des patchs avec la Commande kustomize | ||
+ | |||
+ | * **DOF304 - Travailler avec des Pods et des Conteneurs** | ||
+ | * LAB #1 - Application Configuration | ||
+ | * 1.1 - Présentation | ||
+ | * 1.2 - Création d'une ConfigMap | ||
+ | * 1.3 - Création d'un Secret | ||
+ | * 1.4 - Utilisation de ConfigMaps et de Secrets | ||
+ | * Utilisation de Variables d' | ||
+ | * Utilisation de Volumes de Configuration | ||
+ | * LAB #2 - Gestion des Ressources des Conteneurs | ||
+ | * 2.1 - Présentation | ||
+ | * 2.2 - Resource Requests | ||
+ | * 2.3 - Resource Limits | ||
+ | * LAB #3 - Supervision des Conteneurs | ||
+ | * 3.1 - Présentation | ||
+ | * 3.2 - Liveness Probes | ||
+ | * Le Probe exec | ||
+ | * Le Probe httpGet | ||
+ | * 3.3 - Startup Probes | ||
+ | * 3.4 - Readiness Probes | ||
+ | * LAB #4 - Gestion des Politiques de Redémarrage | ||
+ | * 4.1 - Présentation | ||
+ | * 4.2 - Always | ||
+ | * 4.3 - OnFailure | ||
+ | * 4.4 - Never | ||
+ | * LAB #5 - Création de Pods Multi-conteneurs | ||
+ | * 5.1 - Présentation | ||
+ | * 5.2 - Mise en Place | ||
+ | * LAB #6 - Conteneurs Init | ||
+ | * 6.1 - Présentation | ||
+ | * 6.2 - Mise en Place | ||
+ | * LAB #7 - Scheduling | ||
+ | * 7.1 - Présentation | ||
+ | * 7.2 - Mise en Place | ||
+ | * LAB #8 - DaemonSets | ||
+ | * 8.1 - Présentation | ||
+ | * 8.2 - Mise en Place | ||
+ | * LAB #9 - Pods Statiques | ||
+ | * 9.1 - Présentation | ||
+ | * 9.2 - Mise en Place | ||
+ | |||
+ | * **DOF305 - Gestion du Réseau, des Services et d'une Architecture de Microservices** | ||
+ | * LAB #1 - Gestion du Réseau et des Services | ||
+ | * 1.1 - Présentation des Extensions Réseau | ||
+ | * 1.2 - DNS K8s | ||
+ | * Présentation | ||
+ | * Mise en Application | ||
+ | * 1.3 - Network Policies | ||
+ | * Présentation | ||
+ | * Mise en Application | ||
+ | * 1.4 - Services | ||
+ | * Le Service NodePort | ||
+ | * Présentation | ||
+ | * Mise en Application | ||
+ | * Le Service ClusterIP | ||
+ | * Présentation | ||
+ | * Mise en Application | ||
+ | * 1.5 - Services et le DNS k8s | ||
+ | * Présentation | ||
+ | * Mise en Application | ||
+ | * 1.6 - Gestion de K8s Ingress | ||
+ | * Présentation | ||
+ | * Mise en Application | ||
+ | * LAB #2 - Gestion de l' | ||
+ | * 2.1 - Présentation | ||
+ | * 2.2 - Création des Deployments | ||
+ | * 2.3 - Création des Services | ||
+ | * 2.4 - Déployer l' | ||
+ | * 2.5 - Scaling Up | ||
+ | |||
+ | * **DOF306 - Gestion des Volumes sous K8s** | ||
+ | * Présentation | ||
+ | * Volumes | ||
+ | * Persistent Volumes | ||
+ | * Types de Volumes | ||
+ | * LAB #1 - Utiliser des Volumes K8s | ||
+ | * 1.1 - Volumes et volumeMounts | ||
+ | * 1.2 - Partager des volumes entre conteneurs | ||
+ | * LAB #2 - Volumes Persistants | ||
+ | * 2.1 - Storage Classes | ||
+ | * 2.2 - Persistent Volumes | ||
+ | * 2.3 - Persistent Volume Claims | ||
+ | * 2.4 - Utiliser un PersistentVolumeClaim dans un pod | ||
+ | * 2.5 - Redimensionnement d'un PersistentVolumeClaim | ||
+ | |||
+ | * **DOF307 - Troubleshooting K8s** | ||
+ | * LAB #1 - Le Serveur API | ||
+ | * 1.1 - Connexion Refusée | ||
+ | * 1.2 - Journaux des Pods Système | ||
+ | * LAB #2 - Les Noeuds | ||
+ | * 2.1 - Le Statut NotReady | ||
+ | * LAB #3 - Les Pods | ||
+ | * 3.1 - L' | ||
+ | * 3.2 - L' | ||
+ | * LAB #4 - Les Conteneurs | ||
+ | * 4.1 - La Commande exec | ||
+ | * LAB #5 - Le Réseau | ||
+ | * 5.1 - kube-proxy et le DNS | ||
+ | * 5.2 - Le Conteneur netshoot | ||
+ | |||
+ | * **DOF308 - Introduction à la Sécurisation de K8s** | ||
+ | * LAB #1 - Role Based Acces Control et Certificats TLS | ||
+ | * 1.1 - Présentation | ||
+ | * 1.2 - Le Fichier / | ||
+ | * 1.3 - Création d'un serviceAccount | ||
+ | * 1.4 - Création d'un Utilisateur | ||
+ | * 1.5 - Certificats TLS | ||
+ | * LAB #2 - Implémentation de la Sécurité au niveau des Pods | ||
+ | * 2.1 - Présentation | ||
+ | * 2.2 - Kubernetes | ||
+ | * ReadOnlyRootFilesystem | ||
+ | * drop | ||
+ | * 2.3 - K8s Network Policies | ||
+ | * 2.4 - K8s Resource Allocation Management | ||
+ | |||
+ | * **DOF309 - Gestion de Paquets pour K8s avec Helm** | ||
+ | * Présentation de Helm | ||
+ | * LAB #1 - Travailler avec Helm | ||
+ | * 1.1 - Installation de Helm | ||
+ | * 1.2 - La Commande helm search hub | ||
+ | * 1.3 - Rechercher dans le Helm Hub | ||
+ | * 1.4 - Ajouter et supprimer un Dépôt | ||
+ | * 1.5 - La Commande helm search repo | ||
+ | * 1.6 - La Commande helm show | ||
+ | * 1.7 - Installation d'un Chart | ||
+ | * 1.8 - La Commande helm get | ||
+ | * 1.9 - Utilisation des NOTES | ||
+ | * 1.10 - La Commande helm upgrade | ||
+ | * 1.11 - La Commande helm history | ||
+ | * 1.12 - La Commande helm rollback | ||
+ | * 1.13 - La Commande helm uninstall | ||
+ | * LAB #2 - Supervision de K8s avec le Stack EFK | ||
+ | * 2.1 - Présentation | ||
+ | * 2.2 - Installation du Chart elasticsearch | ||
+ | * 2.3 - Installation du Chart fluentd-elasticsearch | ||
+ | * 2.4 - Installation du Chart kibana | ||
+ | * 2.5 - Génération de Traces dans K8s | ||
+ | * 2.6 - Visualisation des Données avec Kibana | ||
+ | |||
+ | * **DOF310 - StatefulSets, | ||
* StatefulSets | * StatefulSets | ||
* LAB #1 - Mise en Place d'un StatefulSet Simple | * LAB #1 - Mise en Place d'un StatefulSet Simple | ||
Ligne 36: | Ligne 272: | ||
* 4.2 - Consultation des Données avec Grafana | * 4.2 - Consultation des Données avec Grafana | ||
* 4.3 - Consultation des Alertes avec le Web UI de Prometheus | * 4.3 - Consultation des Alertes avec le Web UI de Prometheus | ||
- | * Harbor | ||
- | * LAB #5 - Installation et Configuration de Harbor | ||
- | * 5.1 - Installation de Docker et de Docker Compose | ||
- | * 5.2 - Installation de Harbor | ||
- | * 5.3 - Création d'un Nouveau Projet | ||
- | * 5.4 - Création d'un Dépôt | ||
- | * 5.5 - Pousser des Images Supplémentaires | ||
- | * 5.6 - Travailler avec des Artefacts | ||
- | * 5.7 - Copier un Artefact d'un Projet vers un autre Projet | ||
- | * 5.8 - Utilisation de Labels | ||
- | * 5.9 - Authentification et RBAC | ||
- | * 5.10 - Utilisation d' | ||
- | * 5.11 - Rétention de Tags | ||
- | * 5.12 - Immutabilité des Tags | ||
- | =====StatefulSets===== | + | * **DOF311 - Validation des Acquis** |
+ | * 60 questions issues d'un pool de 104 questions | ||
- | Un StatefulSet est un composant | + | =====Évaluation |
- | Des exemples d' | + | Afin de valider |
- | + | ||
- | * MySQL | + | |
- | * elasticsearch | + | |
- | * mongoDB | + | |
- | + | ||
- | Ces applications enregistrent les données client des activités d'une session pour les utiliser lors de la session suivante. Les données enregistrées sont appelées l' | + | |
- | + | ||
- | Les applications avec état sont déployées en utilisant un StatefulSet tandis que des applications **sans** état sont déployées en utilisant un **Deployment**. | + | |
- | + | ||
- | Les StatefulSets et les Deployments sont similaires dans la mesure où les deux répliquent de multiples pods basés sur une spécification **identique** d'un conteneur. | + | |
- | + | ||
- | La différence entre un StatefulSet et un Deployment est que dans un StatefulSet les pods ne sont **pas** identiques et possèdent ce que l'on appelle un **Pod Identity**. De ce fait les pods : | + | |
- | + | ||
- | * ne peuvent pas être créés ou supprimés en même temps, | + | |
- | * ne peuvent pas être adressés d'une manière aléatoire. | + | |
- | + | ||
- | Prenons le cas d'un StatfulSet contenant trois répliques d'un pod MySQL : | + | |
- | + | ||
- | * mysql-0 | + | |
- | * mysql-1 | + | |
- | * mysql-2 | + | |
- | + | ||
- | Notez que : | + | |
- | + | ||
- | * le nom du pod prend la forme **$(Nom_du_StatefulSet)-$(ordinal)** où l' | + | |
- | * le StatefulSet ne créera pas le pod suivant tant que le pod précédent n'est pas dans un état de **Running** | + | |
- | * dans le cas de la suppression du StatefulSet ou bien dans le cas d'un **scale down**, les pods sont supprimés dans l' | + | |
- | + | ||
- | Dans ce cas de notre StatefulSet, | + | |
- | + | ||
- | * ne peuvent pas tous accepter des requêtes d' | + | |
- | * peuvent tous accepter des requêtes de lecture. | + | |
- | + | ||
- | De ce fait, un mécanisme du StatefulSet choisit un **maître** pour accepter des requêtes d' | + | |
- | + | ||
- | * mysql-0 - écriture / lecture - **Maître** | + | |
- | * mysql-1 - lecture seulement - **Esclave** | + | |
- | * mysql-2 - lecture seulement - **Esclave** | + | |
- | + | ||
- | Il existe donc une différence précise entre le pod Maître et les deux pods Esclaves. | + | |
- | + | ||
- | La différence entre les deux pods Esclaves s' | + | |
- | + | ||
- | * mysql-0 - **/ | + | |
- | * mysql-1 - **/ | + | |
- | * mysql-2 - **/ | + | |
- | + | ||
- | De façon à ce que chaque pod contient les mêmes données, un mecanisme de réplication en continu doit être mis en place entre les deux pods Esclaves et le pod Maître. | + | |
- | + | ||
- | Dans le cas où un nouveau pod est ajouté au **cluster** MySQL, celui-ci doit commencer par cloner les données du dernier pod dans le cluster existant, puis il doit commencer la réplication des données avec le Maître : | + | |
- | + | ||
- | * mysql-0 - données | + | |
- | * mysql-1 - données répliquées de mysql-0 | + | |
- | * mysql-2 - données répliquées de mysql-0 | + | |
- | * mysql-3 - clone des données du pod mysql-2 puis, par la suite, données répliquées de mysql-0 | + | |
- | + | ||
- | L' | + | |
- | + | ||
- | Par exemple, si on supprime le pod **mysql-1**, | + | |
- | + | ||
- | * mysql-0 - / | + | |
- | * pod supprimé - / | + | |
- | * mysql-2 - / | + | |
- | * mysql-3 - / | + | |
- | + | ||
- | En ajoutant un pod de remplaceement, | + | |
- | + | ||
- | * mysql-0 | + | |
- | * mysql-1 <<<<<<<<<< | + | |
- | * mysql-2 | + | |
- | * mysql-3 | + | |
- | + | ||
- | Lors de la création d'un ReplicaSet, un service d' | + | |
- | ** : | + | |
- | + | ||
- | * mysql-0 - **mysql-0.mysvc.default.svc.cluster.local** | + | |
- | * mysql-1 - **mysql-1.mysvc.default.svc.cluster.local** | + | |
- | * mysql-2 - **mysql-2.mysvc.default.svc.cluster.local** | + | |
- | * mysql-3 - **mysql-3.mysvc.default.svc.cluster.local** | + | |
- | + | ||
- | De cette façon, quand un pod est redémarré bien que son adresse IP changera : | + | |
- | + | ||
- | * son nom ne changera **pas** | + | |
- | * son Endpoint DNS ne changera **pas** | + | |
- | + | ||
- | Pour résumer : | + | |
- | + | ||
- | * mysql-0 | + | |
- | * Rôle : **Maître** | + | |
- | * Données : écriture / lecture | + | |
- | * Stockage : / | + | |
- | * Endpoint DNS : mysql-0..mysvc.default.svc.cluster.local | + | |
- | * mysql-1 | + | |
- | * Rôle : **Esclave** | + | |
- | * Données : lecture seulement | + | |
- | * Stockage : / | + | |
- | * Endpoint DNS : mysql-1.mysvc.default.svc.cluster.local | + | |
- | * mysql-2 | + | |
- | * Rôle : **Esclave** | + | |
- | * Données : lecture seulement | + | |
- | * Stockage : / | + | |
- | * Endpoint DNS : mysql-2.mysvc.default.svc.cluster.local | + | |
- | * mysql-3 | + | |
- | * Rôle : **Esclave** | + | |
- | * Données : lecture seulement | + | |
- | * Stockage : / | + | |
- | * Endpoint DNS : mysql-3.mysvc.default.svc.cluster.local | + | |
- | + | ||
- | Dernièrement, | + | |
- | + | ||
- | * la configuration du clonage des données | + | |
- | * la configuration de la réplication des données | + | |
- | * la création et la configuration du stockage physique persistant et distant | + | |
- | * la configuration et la gestion des sauvegardes des données | + | |
- | + | ||
- | ====LAB #1 - Mise en Place d'un StatefulSet Simple==== | + | |
- | + | ||
- | Créez un Namespace **quarkus** puis modifiez le **context** de **kubernetes-admin@kubernetes** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | namespace/ | + | |
- | + | ||
- | root@kubemaster: | + | |
- | Context " | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Quarkus est un framework Java natif pour Kubernetes complet, conçu pour les machines virtuelles Java (JVM) et la compilation native, qui permet d' | + | |
- | </ | + | |
- | + | ||
- | Si vous souhaitez observer les résultats des commandes suivantes en temps réel, ouvrez un deuxième terminal et saisissez la commande suivante : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | </ | + | |
- | + | ||
- | ===1.1 - Création du Service et du StatefulSet=== | + | |
- | + | ||
- | Créez maintenant le fichier **quarkus-service.yaml** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | root@kubemaster: | + | |
- | apiVersion: v1 | + | |
- | kind: Service | + | |
- | metadata: | + | |
- | name: quarkus | + | |
- | labels: | + | |
- | app: quarkus-statefulset | + | |
- | spec: | + | |
- | ports: | + | |
- | - port: 8080 | + | |
- | name: web | + | |
- | clusterIP: None | + | |
- | selector: | + | |
- | app: quarkus-statefulset | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez le nom du service - **quarkus**. La valeur **None** de l' | + | |
- | </ | + | |
- | + | ||
- | Créez le service : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | service/ | + | |
- | </ | + | |
- | + | ||
- | Créez maintenant le fichier **statefulset.yaml** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | root@kubemaster: | + | |
- | apiVersion: apps/v1 | + | |
- | kind: StatefulSet | + | |
- | metadata: | + | |
- | name: quarkus-statefulset | + | |
- | labels: | + | |
- | app: quarkus-statefulset | + | |
- | spec: | + | |
- | serviceName: | + | |
- | replicas: 2 | + | |
- | template: | + | |
- | metadata: | + | |
- | labels: | + | |
- | app: quarkus-statefulset | + | |
- | spec: | + | |
- | containers: | + | |
- | - name: quarkus-statefulset | + | |
- | image: quay.io/ | + | |
- | ports: | + | |
- | - containerPort: | + | |
- | name: web | + | |
- | selector: | + | |
- | matchLabels: | + | |
- | app: quarkus-statefulset | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que la valeur de **serviceName** est **quarkus**. | + | |
- | </ | + | |
- | + | ||
- | Créez le StatefulSet : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | statefulset.apps/ | + | |
- | </ | + | |
- | + | ||
- | Constatez la présence des deux pods dans le Namespace : | + | |
- | + | ||
- | < | + | |
- | Every 1,0s: kubectl get pods -o wide | awk ' | + | |
- | + | ||
- | NAME | + | |
- | quarkus-statefulset-0 | + | |
- | quarkus-statefulset-1 | + | |
- | </ | + | |
- | + | ||
- | Contrôlez l' | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME READY AGE | + | |
- | quarkus-statefulset | + | |
- | </ | + | |
- | + | ||
- | ainsi que la présence du service : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME TYPE CLUSTER-IP | + | |
- | quarkus | + | |
- | </ | + | |
- | + | ||
- | ===1.2 - Mise en Place d'un Scale Up=== | + | |
- | + | ||
- | Procédez à un scale up : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que le nom court d'un **serviceName** est **sts**. | + | |
- | </ | + | |
- | + | ||
- | Constatez la présence des **trois** pods dans le Namespace : | + | |
- | + | ||
- | < | + | |
- | Every 1,0s: kubectl get pods -o wide | awk ' | + | |
- | + | ||
- | NAME | + | |
- | quarkus-statefulset-0 | + | |
- | quarkus-statefulset-1 | + | |
- | quarkus-statefulset-2 | + | |
- | </ | + | |
- | + | ||
- | Constatez l' | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | LAST SEEN | + | |
- | 6m35s | + | |
- | 6m35s | + | |
- | 6m34s | + | |
- | 6m5s Normal | + | |
- | 6m4s Normal | + | |
- | 6m4s Normal | + | |
- | 6m3s Normal | + | |
- | 6m3s Normal | + | |
- | 5m58s | + | |
- | 5m22s | + | |
- | 5m21s | + | |
- | 5m21s | + | |
- | 99s | + | |
- | 99s | + | |
- | 98s | + | |
- | 97s | + | |
- | 97s | + | |
- | </ | + | |
- | + | ||
- | Créez maintenant un pod pour interroger le DNS de K8s : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | If you don't see a command prompt, try pressing enter. | + | |
- | / # nslookup quarkus-statefulset-0.quarkus | + | |
- | Server: | + | |
- | Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local | + | |
- | + | ||
- | Name: quarkus-statefulset-0.quarkus | + | |
- | Address 1: 192.168.150.2 quarkus-statefulset-0.quarkus.quarkus.svc.cluster.local | + | |
- | / # exit | + | |
- | pod " | + | |
- | root@kubemaster: | + | |
- | </ | + | |
- | + | ||
- | ===1.3 - Mise en Place d'un Scale Down=== | + | |
- | + | ||
- | Procédez maintenant à un scale down : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | statefulset.apps/ | + | |
- | </ | + | |
- | + | ||
- | Constatez la présence de **deux** pods dans le Namespace : | + | |
- | + | ||
- | < | + | |
- | Every 1,0s: kubectl get pods -o wide | awk ' | + | |
- | + | ||
- | NAME | + | |
- | quarkus-statefulset-0 | + | |
- | quarkus-statefulset-1 | + | |
- | </ | + | |
- | + | ||
- | ===1.4 - Suppression du StatefulSet=== | + | |
- | + | ||
- | Pour terminer, supprimez le StatefulSet, | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | statefulset.apps " | + | |
- | + | ||
- | root@kubemaster: | + | |
- | service " | + | |
- | + | ||
- | root@kubemaster: | + | |
- | Context " | + | |
- | </ | + | |
- | + | ||
- | =====StorageClass Avancé===== | + | |
- | + | ||
- | ====LAB #2 - Provisionnement NFS dynamique==== | + | |
- | + | ||
- | ===2.1 - Configuration du Serveur NFS=== | + | |
- | + | ||
- | Connectez-vous à la VM CentOS8 en tant que trainee au 10.0.2.46. | + | |
- | + | ||
- | Devenez root puis créez le répertoire **/ | + | |
- | + | ||
- | < | + | |
- | [root@centos8 ~]# mkdir -p / | + | |
- | </ | + | |
- | + | ||
- | Continuez maintenant par activer et démarrer le service **nfs-server** : | + | |
- | + | ||
- | < | + | |
- | [root@centos8 ~]# systemctl status nfs-server | + | |
- | ● nfs-server.service - NFS server and services | + | |
- | | + | |
- | | + | |
- | + | ||
- | [root@centos8 ~]# systemctl enable nfs-server.service | + | |
- | Created symlink / | + | |
- | + | ||
- | [root@centos8 ~]# systemctl start nfs-server.service | + | |
- | + | ||
- | [root@centos8 ~]# systemctl status nfs-server.service | + | |
- | ● nfs-server.service - NFS server and services | + | |
- | | + | |
- | | + | |
- | Process: 3276 ExecStart=/ | + | |
- | Process: 3263 ExecStart=/ | + | |
- | Process: 3261 ExecStartPre=/ | + | |
- | Main PID: 3276 (code=exited, | + | |
- | + | ||
- | Nov 21 11:02:12 centos8.ittraining.loc systemd[1]: Starting NFS server and services... | + | |
- | Nov 21 11:02:13 centos8.ittraining.loc systemd[1]: Started NFS server and services. | + | |
- | </ | + | |
- | + | ||
- | Editez le fichier **/ | + | |
- | + | ||
- | < | + | |
- | [root@centos8 ~]# vi / | + | |
- | [root@centos8 ~]# cat / | + | |
- | / | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Dans ce cas, nous avons partagé le répertoire **/ | + | |
- | </ | + | |
- | + | ||
- | Appliquez l' | + | |
- | + | ||
- | < | + | |
- | [root@centos8 ~]# exportfs -rav | + | |
- | exporting *:/ | + | |
- | + | ||
- | [root@centos8 ~]# exportfs -v | + | |
- | / | + | |
- | < | + | |
- | </ | + | |
- | + | ||
- | Passez SELinux en mode permissive : | + | |
- | + | ||
- | < | + | |
- | [root@centos8 ~]# getenforce | + | |
- | Enforcing | + | |
- | + | ||
- | [root@centos8 ~]# setenforce permissive | + | |
- | + | ||
- | </ | + | |
- | + | ||
- | Configurez ensuite le pare-feu : | + | |
- | + | ||
- | < | + | |
- | [root@centos8 ~]# firewall-cmd --permanent --add-service=nfs | + | |
- | success | + | |
- | [root@centos8 ~]# firewall-cmd --permanent --add-service=rpc-bind | + | |
- | success | + | |
- | [root@centos8 ~]# firewall-cmd --permanent --add-service=mountd | + | |
- | success | + | |
- | [root@centos8 ~]# firewall-cmd --reload | + | |
- | success | + | |
- | </ | + | |
- | + | ||
- | ===2.2 - Configuration des Clients NFS=== | + | |
- | + | ||
- | Revenez à votre gateway et connectez-vous en tant que l' | + | |
- | + | ||
- | < | + | |
- | trainee@kubenode2: | + | |
- | Mot de passe : fenestros | + | |
- | root@kubenode2: | + | |
- | </ | + | |
- | + | ||
- | Installez le paquet **nfs-common** : | + | |
- | + | ||
- | < | + | |
- | root@kubenode2: | + | |
- | ... | + | |
- | + | ||
- | root@kubenode2: | + | |
- | ... | + | |
- | </ | + | |
- | + | ||
- | Vérifiez que vous pouvez voir le répertoire exporté par le 10.0.2.46 : | + | |
- | + | ||
- | < | + | |
- | root@kubenode2: | + | |
- | Export list for 10.0.2.46: | + | |
- | / | + | |
- | </ | + | |
- | + | ||
- | Vérifiez que vous pouvez monter le répertoire exporté par le 10.0.2.46 : | + | |
- | + | ||
- | < | + | |
- | root@kubenode2: | + | |
- | root@kubenode2: | + | |
- | 10.0.2.46:/ | + | |
- | </ | + | |
- | + | ||
- | Démontez ensuite **10.0.2.46:/ | + | |
- | + | ||
- | < | + | |
- | root@kubenode2: | + | |
- | + | ||
- | root@kubenode2: | + | |
- | </ | + | |
- | + | ||
- | Connectez-vous à kubenode1 au 192.168.56.3 : | + | |
- | + | ||
- | < | + | |
- | root@kubenode2: | + | |
- | The authenticity of host ' | + | |
- | ECDSA key fingerprint is SHA256: | + | |
- | Are you sure you want to continue connecting (yes/no)? yes | + | |
- | Warning: Permanently added ' | + | |
- | trainee@192.168.56.3' | + | |
- | Linux kubenode1.ittraining.loc 4.9.0-19-amd64 #1 SMP Debian 4.9.320-2 (2022-06-30) x86_64 | + | |
- | + | ||
- | The programs included with the Debian GNU/Linux system are free software; | + | |
- | the exact distribution terms for each program are described in the | + | |
- | individual files in / | + | |
- | + | ||
- | Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent | + | |
- | permitted by applicable law. | + | |
- | Last login: Wed Sep 28 09:54:21 2022 from 192.168.56.2 | + | |
- | trainee@kubenode1: | + | |
- | Mot de passe : fenestros | + | |
- | root@kubenode1: | + | |
- | </ | + | |
- | + | ||
- | Installez ensuite le paquet **nfs-common** : | + | |
- | + | ||
- | < | + | |
- | root@kubenode1: | + | |
- | ... | + | |
- | + | ||
- | root@kubenode1: | + | |
- | ... | + | |
- | </ | + | |
- | + | ||
- | Revenez à votre gateway : | + | |
- | + | ||
- | < | + | |
- | root@kubenode1: | + | |
- | déconnexion | + | |
- | trainee@kubenode1: | + | |
- | déconnexion | + | |
- | Connection to 192.168.56.3 closed. | + | |
- | root@kubenode2: | + | |
- | déconnexion | + | |
- | trainee@kubenode2: | + | |
- | déconnexion | + | |
- | Connection to 192.168.56.4 closed. | + | |
- | </ | + | |
- | + | ||
- | ===2.3 - Configuration de K8s=== | + | |
- | + | ||
- | Connectez-vous à votre **kubemaster** au 192.168.56.2. | + | |
- | + | ||
- | Installez ensuite le paquet **nfs-common** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | ... | + | |
- | + | ||
- | root@kubemaster: | + | |
- | ... | + | |
- | </ | + | |
- | + | ||
- | Ajoutez le dépôt **nfs-subdir-external-provisioner** à **helm** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | " | + | |
- | </ | + | |
- | + | ||
- | Installez le chart helm **nfs-subdir-external-provisioner** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME: nfs-subdir-external-provisioner | + | |
- | LAST DEPLOYED: Wed Dec 7 11:12:23 2022 | + | |
- | NAMESPACE: default | + | |
- | STATUS: deployed | + | |
- | REVISION: 1 | + | |
- | TEST SUITE: None | + | |
- | </ | + | |
- | + | ||
- | Contrôlez l' | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME | + | |
- | netshoot | + | |
- | nfs-subdir-external-provisioner-59b4b5c476-wxkp4 | + | |
- | nginx-netshoot | + | |
- | postgresql-6f885d8957-tnlbb | + | |
- | sharedvolume | + | |
- | troubleshooting | + | |
- | volumepod | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Si le pod **nfs-subdir-external-provisioner-yyyyyyyyyy-xxxxx** reste dans un état de **ContainerCreating** pour plus de 5 minutes, supprimez les trois pods **calico-node-xxxxx** du Namespace **kube-system** et attendez qu'ils soient recréés. | + | |
- | </ | + | |
- | + | ||
- | Une fois recréés, vous pouvez constater que le pod **nfs-subdir-external-provisioner-yyyyyyyyyy-xxxxx** est dans un état de Running : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAMESPACE | + | |
- | default | + | |
- | default | + | |
- | default | + | |
- | default | + | |
- | default | + | |
- | default | + | |
- | default | + | |
- | </ | + | |
- | + | ||
- | L' | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | I1207 10: | + | |
- | I1207 10: | + | |
- | I1207 10: | + | |
- | I1207 10: | + | |
- | I1207 10: | + | |
- | </ | + | |
- | + | ||
- | Consultez maintenant | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME | + | |
- | localdisk | + | |
- | nfs-client | + | |
- | </ | + | |
- | + | ||
- | ===2.4 - Création d'un PersistentVolumeClaim=== | + | |
- | + | ||
- | Créez maintenant le fichier **pvc.yaml** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | root@kubemaster: | + | |
- | apiVersion: v1 | + | |
- | kind: PersistentVolumeClaim | + | |
- | metadata: | + | |
- | name: pvc1 | + | |
- | spec: | + | |
- | storageClassName: | + | |
- | accessModes: | + | |
- | - ReadWriteMany | + | |
- | resources: | + | |
- | requests: | + | |
- | storage: 500Mi | + | |
- | </ | + | |
- | + | ||
- | Appliquez le fichier pvc.yaml : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | persistentvolumeclaim/ | + | |
- | </ | + | |
- | + | ||
- | Constatez maintenant la liste de PersistentVolumes et de PersistentVolumeClaims : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME CAPACITY | + | |
- | persistentvolume/ | + | |
- | persistentvolume/ | + | |
- | + | ||
- | NAME | + | |
- | persistentvolumeclaim/ | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que le PersistentVolume **persistentvolume/ | + | |
- | </ | + | |
- | + | ||
- | Connectez-vous au serveur NFS et constatez le contenu du répertoire **/ | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | The authenticity of host ' | + | |
- | ECDSA key fingerprint is SHA256: | + | |
- | Are you sure you want to continue connecting (yes/no)? yes | + | |
- | Warning: Permanently added ' | + | |
- | trainee@10.0.2.46' | + | |
- | Activate the web console with: systemctl enable --now cockpit.socket | + | |
- | + | ||
- | Last login: Wed Dec 7 10:34:25 2022 from 10.0.2.65 | + | |
- | + | ||
- | [trainee@centos8 ~]$ ls -l / | + | |
- | total 0 | + | |
- | drwxrwxrwx. 2 root root 6 Dec 7 12:32 default-pvc1-pvc-721f5ed3-88b1-41bb-82c2-9eab3b4464da | + | |
- | [trainee@centos8 ~]$ exit | + | |
- | logout | + | |
- | Connection to 10.0.2.46 closed. | + | |
- | </ | + | |
- | + | ||
- | ===2.5 - Utilisation du PersistentVolumeClaim avec un pod=== | + | |
- | + | ||
- | Créez maintenant le fichier **nfs-busybox.yaml** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | root@kubemaster: | + | |
- | apiVersion: v1 | + | |
- | kind: Pod | + | |
- | metadata: | + | |
- | name: nfs-pv-pod | + | |
- | spec: | + | |
- | restartPolicy: | + | |
- | containers: | + | |
- | - name: busybox | + | |
- | image: busybox | + | |
- | command: [' | + | |
- | volumeMounts: | + | |
- | - name: pv-storage | + | |
- | mountPath: / | + | |
- | volumes: | + | |
- | - name: pv-storage | + | |
- | persistentVolumeClaim: | + | |
- | claimName: pvc1 | + | |
- | </ | + | |
- | + | ||
- | Appliquez le fichier nfs-busybox.yaml : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | pod/ | + | |
- | </ | + | |
- | + | ||
- | Vérifiez que le statut du pod **nfs-pv-pod** est **Running** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME | + | |
- | netshoot | + | |
- | nfs-pv-pod | + | |
- | nfs-subdir-external-provisioner-59b4b5c476-wxkp4 | + | |
- | nginx-netshoot | + | |
- | postgresql-6f885d8957-tnlbb | + | |
- | sharedvolume | + | |
- | troubleshooting | + | |
- | volumepod | + | |
- | </ | + | |
- | + | ||
- | Connectez-vous au conteneur du pod **nfs-pv-pod** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | / # | + | |
- | </ | + | |
- | + | ||
- | Créez le fichier **hello** dans le répertoire **pv-pod-storage** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | / # ls | + | |
- | bin | + | |
- | / # touch / | + | |
- | / # ls / | + | |
- | hello | + | |
- | / # exit | + | |
- | </ | + | |
- | + | ||
- | Connectez-vous au serveur NFS et constatez le contenu du répertoire **/ | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | trainee@10.0.2.46' | + | |
- | Activate the web console with: systemctl enable --now cockpit.socket | + | |
- | + | ||
- | Last login: Wed Dec 7 12:37:00 2022 from 10.0.2.65 | + | |
- | [trainee@centos8 ~]$ ls -lR / | + | |
- | / | + | |
- | total 0 | + | |
- | drwxrwxrwx. 2 root root 19 Dec 7 13:13 default-pvc1-pvc-721f5ed3-88b1-41bb-82c2-9eab3b4464da | + | |
- | + | ||
- | / | + | |
- | total 0 | + | |
- | -rw-r--r--. 1 root root 0 Dec 7 13:13 hello | + | |
- | [trainee@centos8 ~]$ exit | + | |
- | logout | + | |
- | Connection to 10.0.2.46 closed. | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez la présence du fichier **hello**. | + | |
- | </ | + | |
- | + | ||
- | ===2.6 - Création d'un Deuxième PersistentVolumeClaim=== | + | |
- | + | ||
- | Vréez le fichier **pvc2.yaml** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | root@kubemaster: | + | |
- | apiVersion: v1 | + | |
- | kind: PersistentVolumeClaim | + | |
- | metadata: | + | |
- | name: pvc2 | + | |
- | spec: | + | |
- | storageClassName: | + | |
- | accessModes: | + | |
- | - ReadWriteOnce | + | |
- | resources: | + | |
- | requests: | + | |
- | storage: 100Mi | + | |
- | </ | + | |
- | + | ||
- | Appliquez le fichier **pvc2.yaml** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | persistentvolumeclaim/ | + | |
- | </ | + | |
- | + | ||
- | Constatez maintenant la liste de PersistentVolumes et de PersistentVolumeClaims : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME CAPACITY | + | |
- | persistentvolume/ | + | |
- | persistentvolume/ | + | |
- | persistentvolume/ | + | |
- | + | ||
- | NAME | + | |
- | persistentvolumeclaim/ | + | |
- | persistentvolumeclaim/ | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que le PersistentVolume **persistentvolume/ | + | |
- | </ | + | |
- | + | ||
- | ===2.7 - Suppression des PersistentVolumeClaims=== | + | |
- | + | ||
- | Commencer par supprimer le pod **nfs-pv-pod** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | pod " | + | |
- | </ | + | |
- | + | ||
- | Constatez la suppression effective du pod : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME | + | |
- | netshoot | + | |
- | nfs-subdir-external-provisioner-59b4b5c476-wxkp4 | + | |
- | nginx-netshoot | + | |
- | postgresql-6f885d8957-tnlbb | + | |
- | sharedvolume | + | |
- | troubleshooting | + | |
- | volumepod | + | |
- | </ | + | |
- | + | ||
- | Constatez maintenant la liste de PersistentVolumes et de PersistentVolumeClaims : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME CAPACITY | + | |
- | persistentvolume/ | + | |
- | persistentvolume/ | + | |
- | persistentvolume/ | + | |
- | + | ||
- | NAME | + | |
- | persistentvolumeclaim/ | + | |
- | persistentvolumeclaim/ | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que les PersistentVolumes et les PersistentVolumeClaims sont toujours présents. | + | |
- | </ | + | |
- | + | ||
- | Supprimes les deux PersistentVolumeClaims : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | persistentvolumeclaim " | + | |
- | persistentvolumeclaim " | + | |
- | </ | + | |
- | + | ||
- | Constatez ensuite que les deux PersistentVolumes ont été supprimés automatiquement : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME CAPACITY | + | |
- | persistentvolume/ | + | |
- | </ | + | |
- | + | ||
- | Connectez-vous au serveur NFS et constatez le contenu du répertoire **/ | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | trainee@10.0.2.46' | + | |
- | Activate the web console with: systemctl enable --now cockpit.socket | + | |
- | + | ||
- | Last login: Wed Dec 7 13:15:49 2022 from 10.0.2.65 | + | |
- | [trainee@centos8 ~]$ ls -lR / | + | |
- | / | + | |
- | total 0 | + | |
- | drwxrwxrwx. 2 root root 19 Dec 7 13:13 archived-default-pvc1-pvc-721f5ed3-88b1-41bb-82c2-9eab3b4464da | + | |
- | drwxrwxrwx. 2 root root 6 Dec 7 13:24 archived-default-pvc2-pvc-6dbce6de-e473-4e4c-99be-0fbea26576de | + | |
- | + | ||
- | / | + | |
- | total 0 | + | |
- | -rw-r--r--. 1 root root 0 Dec 7 13:13 hello | + | |
- | + | ||
- | / | + | |
- | total 0 | + | |
- | [trainee@centos8 ~]$ exit | + | |
- | logout | + | |
- | Connection to 10.0.2.46 closed. | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que les répertoires ont un préfixe **archived-** | + | |
- | </ | + | |
- | + | ||
- | =====Helm Avancé===== | + | |
- | + | ||
- | Un chart est une collection de fichiers et de répertoires qui prennent la forme suivante : | + | |
- | + | ||
- | < | + | |
- | MyChart/ | + | |
- | Chart.yaml | + | |
- | LICENSE | + | |
- | README.md | + | |
- | values.yaml | + | |
- | values.schema.json | + | |
- | charts/ | + | |
- | crds/ | + | |
- | templates/ | + | |
- | templates/ | + | |
- | </ | + | |
- | + | ||
- | Le langage des templates de helm est basé sur le langage GO. | + | |
- | + | ||
- | Dans le LAB suivant, vous allez prendre les deux manifests suivants, **ghost.yaml** et **ghost-service.yaml** et créer un chart helm pour installer | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | root@kubemaster: | + | |
- | apiVersion: apps/v1 | + | |
- | kind: Deployment | + | |
- | metadata: | + | |
- | name: blog | + | |
- | labels: | + | |
- | app: blog | + | |
- | spec: | + | |
- | replicas: 1 | + | |
- | selector: | + | |
- | matchLabels: | + | |
- | app: blog | + | |
- | template: | + | |
- | metadata: | + | |
- | labels: | + | |
- | app: blog | + | |
- | spec: | + | |
- | containers: | + | |
- | - name: blog | + | |
- | image: ghost: | + | |
- | imagePullPolicy: | + | |
- | ports: | + | |
- | - containerPort: | + | |
- | env: | + | |
- | - name: url | + | |
- | value: http:// | + | |
- | </ | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | root@kubemaster: | + | |
- | apiVersion: v1 | + | |
- | kind: Service | + | |
- | metadata: | + | |
- | name: blog | + | |
- | spec: | + | |
- | type: NodePort | + | |
- | selector: | + | |
- | app: blog | + | |
- | ports: | + | |
- | - protocol: TCP | + | |
- | port: 80 | + | |
- | targetPort: 2368 | + | |
- | </ | + | |
- | + | ||
- | ====LAB #3 - Création d'un Paquet Helm Simple==== | + | |
- | + | ||
- | Commencez par créer le répertoire **~/ghost** et placez-vous dedans : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | root@kubemaster: | + | |
- | </ | + | |
- | + | ||
- | Un chart necéssite la présence d'un fichier nommé **Chart.yaml** qui doit décrire le chart en question. Créez donc ce fichier : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | </ | + | |
- | + | ||
- | ===3.1 - Le Fichier values.yaml=== | + | |
- | + | ||
- | Un chart a aussi besoin d'un fichier dénommé **values.yaml** qui contient des valeurs de configuration du chart en question. Créez donc le fichier values.yaml avec le contenu suivant : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | root@kubemaster: | + | |
- | service: | + | |
- | name: blog | + | |
- | type: NodePort | + | |
- | app: blog | + | |
- | protocol: TCP | + | |
- | port: 80 | + | |
- | targetPort: 2368 | + | |
- | </ | + | |
- | + | ||
- | ===3.2 - Les Templates=== | + | |
- | + | ||
- | Créez le sous-répertoire **templates** dans **ghost** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | </ | + | |
- | + | ||
- | Copiez le contenu du fichier **~/ | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | root@kubemaster: | + | |
- | apiVersion: v1 | + | |
- | kind: Service | + | |
- | metadata: | + | |
- | name: blog | + | |
- | spec: | + | |
- | type: NodePort | + | |
- | selector: | + | |
- | app: blog | + | |
- | ports: | + | |
- | - protocol: TCP | + | |
- | port: 80 | + | |
- | targetPort: 2368 | + | |
- | </ | + | |
- | + | ||
- | Modifiez ensuite ce fichier pour lire les valeurs du fichier **values.yaml** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | root@kubemaster: | + | |
- | apiVersion: v1 | + | |
- | kind: Service | + | |
- | metadata: | + | |
- | name: {{ .Values.service.name }} | + | |
- | spec: | + | |
- | type: {{ .Values.service.type }} | + | |
- | selector: | + | |
- | app: {{ .Values.service.app }} | + | |
- | ports: | + | |
- | - protocol: {{ .Values.service.protocol }} | + | |
- | port: {{ .Values.service.port }} | + | |
- | targetPort: {{ .Values.service.targetPort }} | + | |
- | </ | + | |
- | + | ||
- | Naviguez vers le répertoire parent du répertoire **ghost** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | </ | + | |
- | + | ||
- | Vérifiez que helm peut lire la liste des valeurs du fichier values.yaml : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | Error: validation: chart.metadata.name is required | + | |
- | </ | + | |
- | + | ||
- | L' | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | root@kubemaster: | + | |
- | name: ghost | + | |
- | version: 1 | + | |
- | </ | + | |
- | + | ||
- | Vérifiez maintenant que helm peut lire la liste des valeurs du fichier values.yaml : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | service: | + | |
- | name: blog | + | |
- | type: NodePort | + | |
- | app: blog | + | |
- | protocol: TCP | + | |
- | port: 80 | + | |
- | targetPort: 2368 | + | |
- | </ | + | |
- | + | ||
- | Vérifiez maintenant que le manifest **service.yaml** qui sera créé par Helm est correct : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME: check | + | |
- | LAST DEPLOYED: Thu Dec 8 15:54:13 2022 | + | |
- | NAMESPACE: default | + | |
- | STATUS: pending-install | + | |
- | REVISION: 1 | + | |
- | TEST SUITE: None | + | |
- | HOOKS: | + | |
- | MANIFEST: | + | |
- | --- | + | |
- | # Source: ghost/ | + | |
- | apiVersion: v1 | + | |
- | kind: Service | + | |
- | metadata: | + | |
- | name: blog | + | |
- | spec: | + | |
- | type: NodePort | + | |
- | selector: | + | |
- | app: blog | + | |
- | ports: | + | |
- | - protocol: TCP | + | |
- | port: 80 | + | |
- | targetPort: 2368 | + | |
- | </ | + | |
- | + | ||
- | Copiez maintenant le contenu du fichier **~/ | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | root@kubemaster: | + | |
- | apiVersion: apps/v1 | + | |
- | kind: Deployment | + | |
- | metadata: | + | |
- | name: blog | + | |
- | labels: | + | |
- | app: blog | + | |
- | spec: | + | |
- | replicas: 1 | + | |
- | selector: | + | |
- | matchLabels: | + | |
- | app: blog | + | |
- | template: | + | |
- | metadata: | + | |
- | labels: | + | |
- | app: blog | + | |
- | spec: | + | |
- | containers: | + | |
- | - name: blog | + | |
- | image: ghost: | + | |
- | imagePullPolicy: | + | |
- | ports: | + | |
- | - containerPort: | + | |
- | env: | + | |
- | - name: url | + | |
- | value: http:// | + | |
- | </ | + | |
- | + | ||
- | Modifiez ensuite ce fichier pour lire les valeurs du fichier **values.yaml** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | root@kubemaster: | + | |
- | apiVersion: apps/v1 | + | |
- | kind: Deployment | + | |
- | metadata: | + | |
- | name: {{ .Values.blog.name }} | + | |
- | labels: | + | |
- | app: {{ .Values.blog.label }} | + | |
- | spec: | + | |
- | replicas: {{ .Values.blog.replicas }} | + | |
- | selector: | + | |
- | matchLabels: | + | |
- | app: {{ .Values.blog.name }} | + | |
- | template: | + | |
- | metadata: | + | |
- | labels: | + | |
- | app: {{ .Values.blog.name }} | + | |
- | spec: | + | |
- | containers: | + | |
- | - name: {{ .Values.blog.name }} | + | |
- | image: {{ .Values.blog.image }} | + | |
- | imagePullPolicy: | + | |
- | ports: | + | |
- | - containerPort: | + | |
- | env: | + | |
- | - name: {{ .Values.blog.url }} | + | |
- | value: {{ .Values.blog.urlValue }} | + | |
- | </ | + | |
- | + | ||
- | Completez maintenant le contenu du fichier values.yaml : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | root@kubemaster: | + | |
- | service: | + | |
- | name: blog | + | |
- | type: NodePort | + | |
- | app: blog | + | |
- | protocol: TCP | + | |
- | port: 80 | + | |
- | targetPort: 2368 | + | |
- | blog: | + | |
- | name: blog | + | |
- | label: blog | + | |
- | replicas: 1 | + | |
- | image: ghost: | + | |
- | imagePullPolicy: | + | |
- | containerPort: | + | |
- | url: url | + | |
- | urlValue: http:// | + | |
- | </ | + | |
- | + | ||
- | Vérifiez maintenant que le manifest **ghost.yaml** qui sera créé par Helm est correct : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME: check | + | |
- | LAST DEPLOYED: Thu Dec 8 16:12:29 2022 | + | |
- | NAMESPACE: default | + | |
- | STATUS: pending-install | + | |
- | REVISION: 1 | + | |
- | TEST SUITE: None | + | |
- | HOOKS: | + | |
- | MANIFEST: | + | |
- | --- | + | |
- | # Source: ghost/ | + | |
- | apiVersion: v1 | + | |
- | kind: Service | + | |
- | metadata: | + | |
- | name: blog | + | |
- | spec: | + | |
- | type: NodePort | + | |
- | selector: | + | |
- | app: blog | + | |
- | ports: | + | |
- | - protocol: TCP | + | |
- | port: 80 | + | |
- | targetPort: 2368 | + | |
- | --- | + | |
- | # Source: ghost/ | + | |
- | apiVersion: apps/v1 | + | |
- | kind: Deployment | + | |
- | metadata: | + | |
- | name: blog | + | |
- | labels: | + | |
- | app: blog | + | |
- | spec: | + | |
- | replicas: 1 | + | |
- | selector: | + | |
- | matchLabels: | + | |
- | app: blog | + | |
- | template: | + | |
- | metadata: | + | |
- | labels: | + | |
- | app: blog | + | |
- | spec: | + | |
- | containers: | + | |
- | - name: blog | + | |
- | image: ghost: | + | |
- | imagePullPolicy: | + | |
- | ports: | + | |
- | - containerPort: | + | |
- | env: | + | |
- | - name: url | + | |
- | value: http:// | + | |
- | </ | + | |
- | + | ||
- | Consultez maintenant l' | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | ghost | + | |
- | ├── Chart.yaml | + | |
- | ├── templates | + | |
- | │ | + | |
- | │ | + | |
- | └── values.yaml | + | |
- | + | ||
- | 1 directory, 4 files | + | |
- | </ | + | |
- | + | ||
- | ===3.3 - Installation et Suppression=== | + | |
- | + | ||
- | Installez le chart **ghost** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME: live | + | |
- | LAST DEPLOYED: Thu Dec 8 16:14:13 2022 | + | |
- | NAMESPACE: default | + | |
- | STATUS: deployed | + | |
- | REVISION: 1 | + | |
- | TEST SUITE: None | + | |
- | </ | + | |
- | + | ||
- | Vérifiez l' | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME | + | |
- | blog | + | |
- | kubernetes | + | |
- | service-netshoot | + | |
- | </ | + | |
- | + | ||
- | Vérifiez la présence du pod dans le cluster : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME | + | |
- | blog-8545df8764-hk8rc | + | |
- | netshoot | + | |
- | nfs-subdir-external-provisioner-59b4b5c476-wxkp4 | + | |
- | nginx-netshoot | + | |
- | postgresql-6f885d8957-tnlbb | + | |
- | sharedvolume | + | |
- | troubleshooting | + | |
- | volumepod | + | |
- | </ | + | |
- | + | ||
- | Vérifiez le statut du chart : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME: live | + | |
- | LAST DEPLOYED: Thu Dec 8 16:14:13 2022 | + | |
- | NAMESPACE: default | + | |
- | STATUS: deployed | + | |
- | REVISION: 1 | + | |
- | TEST SUITE: None | + | |
- | </ | + | |
- | + | ||
- | Dernièrement, | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | release " | + | |
- | </ | + | |
- | + | ||
- | =====Monitoring===== | + | |
- | + | ||
- | Le serveur Prometheus est composé de trois modules : | + | |
- | + | ||
- | * **Data Retrieval Worker** qui récupére les métriques | + | |
- | * **Time Series Database** qui stocke les métriques | + | |
- | * **HTTP Server** qui accepte des requêtes PromQL et qui fournit un Web UI pour la consultation des données | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : **[[https:// | + | |
- | </ | + | |
- | + | ||
- | Des alertes sont ensuite passées à l' | + | |
- | + | ||
- | ====LAB #4 - Mise en Place d'une Solution Prometheus==== | + | |
- | + | ||
- | ===4.1 - Déploiement du Stack avec Helm=== | + | |
- | + | ||
- | Ajoutez le dépôt **prometheus-community** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | " | + | |
- | root@kubemaster: | + | |
- | Hang tight while we grab the latest from your chart repositories... | + | |
- | ...Successfully got an update from the " | + | |
- | ...Successfully got an update from the " | + | |
- | ...Successfully got an update from the " | + | |
- | Update Complete. ⎈Happy Helming!⎈ | + | |
- | </ | + | |
- | + | ||
- | Installez ensuite le chart **kube-prometheus-stack** : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME: prometheus | + | |
- | LAST DEPLOYED: Thu Dec 8 17:04:17 2022 | + | |
- | NAMESPACE: default | + | |
- | STATUS: deployed | + | |
- | REVISION: 1 | + | |
- | NOTES: | + | |
- | kube-prometheus-stack has been installed. Check its status by running: | + | |
- | kubectl --namespace default get pods -l " | + | |
- | + | ||
- | Visit https:// | + | |
- | </ | + | |
- | + | ||
- | Patientez jusqu' | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME | + | |
- | prometheus-kube-prometheus-operator-689dd6679c-2th6f | + | |
- | prometheus-kube-state-metrics-6cfd96f4c8-wrw2n | + | |
- | prometheus-prometheus-node-exporter-8cb4s | + | |
- | prometheus-prometheus-node-exporter-ll4qp | + | |
- | prometheus-prometheus-node-exporter-x87f7 | + | |
- | </ | + | |
- | + | ||
- | Consultez maintenant l' | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME | + | |
- | pod/ | + | |
- | pod/ | + | |
- | pod/ | + | |
- | pod/ | + | |
- | pod/ | + | |
- | + | ||
- | NAME TYPE CLUSTER-IP | + | |
- | service/ | + | |
- | service/ | + | |
- | service/ | + | |
- | service/ | + | |
- | service/ | + | |
- | + | ||
- | NAME | + | |
- | daemonset.apps/ | + | |
- | + | ||
- | NAME READY | + | |
- | deployment.apps/ | + | |
- | deployment.apps/ | + | |
- | + | ||
- | NAME | + | |
- | replicaset.apps/ | + | |
- | replicaset.apps/ | + | |
- | + | ||
- | NAME READY AGE | + | |
- | statefulset.apps/ | + | |
- | statefulset.apps/ | + | |
- | </ | + | |
- | + | ||
- | Dans cette sortie on constate : | + | |
- | + | ||
- | * 2 StatefulSets dont : | + | |
- | * le serveur Prometheus **statefulset.apps/ | + | |
- | * l' | + | |
- | * 2 Deployments dont : | + | |
- | * l' | + | |
- | * le kube-state-metrics **deployment.apps/ | + | |
- | * 2 ReplicaSets créés par les Deployments : | + | |
- | * **replicaset.apps/ | + | |
- | * **replicaset.apps/ | + | |
- | * 1 DaemonSet **daemonset.apps/ | + | |
- | * les pods de ce DaemonSet sont responsables pour la transformation des métriques des noeuds en métriques Prometheus | + | |
- | + | ||
- | L' | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME | + | |
- | prometheus-kube-prometheus-alertmanager-overview | + | |
- | prometheus-kube-prometheus-apiserver | + | |
- | prometheus-kube-prometheus-cluster-total | + | |
- | prometheus-kube-prometheus-controller-manager | + | |
- | prometheus-kube-prometheus-etcd | + | |
- | prometheus-kube-prometheus-grafana-datasource | + | |
- | prometheus-kube-prometheus-grafana-overview | + | |
- | prometheus-kube-prometheus-k8s-coredns | + | |
- | prometheus-kube-prometheus-k8s-resources-cluster | + | |
- | prometheus-kube-prometheus-k8s-resources-namespace | + | |
- | prometheus-kube-prometheus-k8s-resources-node | + | |
- | prometheus-kube-prometheus-k8s-resources-pod | + | |
- | prometheus-kube-prometheus-k8s-resources-workload | + | |
- | prometheus-kube-prometheus-k8s-resources-workloads-namespace | + | |
- | prometheus-kube-prometheus-kubelet | + | |
- | prometheus-kube-prometheus-namespace-by-pod | + | |
- | prometheus-kube-prometheus-namespace-by-workload | + | |
- | prometheus-kube-prometheus-node-cluster-rsrc-use | + | |
- | prometheus-kube-prometheus-node-rsrc-use | + | |
- | prometheus-kube-prometheus-nodes | + | |
- | prometheus-kube-prometheus-nodes-darwin | + | |
- | prometheus-kube-prometheus-persistentvolumesusage | + | |
- | prometheus-kube-prometheus-pod-total | + | |
- | prometheus-kube-prometheus-prometheus | + | |
- | prometheus-kube-prometheus-proxy | + | |
- | prometheus-kube-prometheus-scheduler | + | |
- | prometheus-kube-prometheus-workload-total | + | |
- | </ | + | |
- | + | ||
- | ainsi que des Secrets : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME TYPE | + | |
- | alertmanager-prometheus-kube-prometheus-alertmanager | + | |
- | alertmanager-prometheus-kube-prometheus-alertmanager-generated | + | |
- | alertmanager-prometheus-kube-prometheus-alertmanager-tls-assets-0 | + | |
- | alertmanager-prometheus-kube-prometheus-alertmanager-web-config | + | |
- | my-secret | + | |
- | prometheus-grafana | + | |
- | prometheus-kube-prometheus-admission | + | |
- | prometheus-prometheus-kube-prometheus-prometheus | + | |
- | prometheus-prometheus-kube-prometheus-prometheus-tls-assets-0 | + | |
- | prometheus-prometheus-kube-prometheus-prometheus-web-config | + | |
- | sh.helm.release.v1.nfs-subdir-external-provisioner.v1 | + | |
- | sh.helm.release.v1.prometheus.v1 | + | |
- | </ | + | |
- | + | ||
- | des **Custom Resource Definitions** ou crd : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | NAME CREATED AT | + | |
- | alertmanagerconfigs.monitoring.coreos.com | + | |
- | alertmanagers.monitoring.coreos.com | + | |
- | bgpconfigurations.crd.projectcalico.org | + | |
- | bgppeers.crd.projectcalico.org | + | |
- | blockaffinities.crd.projectcalico.org | + | |
- | caliconodestatuses.crd.projectcalico.org | + | |
- | clusterinformations.crd.projectcalico.org | + | |
- | felixconfigurations.crd.projectcalico.org | + | |
- | globalnetworkpolicies.crd.projectcalico.org | + | |
- | globalnetworksets.crd.projectcalico.org | + | |
- | hostendpoints.crd.projectcalico.org | + | |
- | ipamblocks.crd.projectcalico.org | + | |
- | ipamconfigs.crd.projectcalico.org | + | |
- | ipamhandles.crd.projectcalico.org | + | |
- | ippools.crd.projectcalico.org | + | |
- | ipreservations.crd.projectcalico.org | + | |
- | kubecontrollersconfigurations.crd.projectcalico.org | + | |
- | networkpolicies.crd.projectcalico.org | + | |
- | networksets.crd.projectcalico.org | + | |
- | podmonitors.monitoring.coreos.com | + | |
- | probes.monitoring.coreos.com | + | |
- | prometheuses.monitoring.coreos.com | + | |
- | prometheusrules.monitoring.coreos.com | + | |
- | servicemonitors.monitoring.coreos.com | + | |
- | thanosrulers.monitoring.coreos.com | + | |
- | </ | + | |
- | + | ||
- | ===4.2 - Consultation des Données avec Grafana=== | + | |
- | + | ||
- | L' | + | |
- | + | ||
- | Grafana est une plate-forme de visualisation de données interactive open source, développée par Grafana Labs, qui permet aux utilisateurs de voir leurs données via des tableaux et des graphiques qui sont unifiés dans un tableau de bord (ou plusieurs tableaux de bord ) pour une interprétation et une compréhension plus faciles. | + | |
- | + | ||
- | Consultez les objets Grafana : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | pod/ | + | |
- | service/ | + | |
- | deployment.apps/ | + | |
- | replicaset.apps/ | + | |
- | </ | + | |
- | + | ||
- | Vérifiez le port utilisé par Grafana : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | logger=http.server t=2022-12-08T16: | + | |
- | </ | + | |
- | + | ||
- | ainsi que le nom de l' | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | logger=sqlstore t=2022-12-08T16: | + | |
- | </ | + | |
- | + | ||
- | Le mot de passe par défaut de l' | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que le mot de passe est **prom-operator**. | + | |
- | </ | + | |
- | + | ||
- | Mettez en place une redirection de port : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | Forwarding from 127.0.0.1: | + | |
- | Forwarding from [::1]:3000 -> 3000 | + | |
- | + | ||
- | </ | + | |
- | + | ||
- | Consultez maintenant | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez ensuite sur **Dashboards > Browse > Kubernetes / Compute Resources / Node (Pods)** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Dernièrement, | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | ===4.3 - Consultation | + | |
- | + | ||
- | Pour consultez le Web UI de Prometheus, mettez en place une redirection de port : | + | |
- | + | ||
- | < | + | |
- | root@kubemaster: | + | |
- | Forwarding from 127.0.0.1: | + | |
- | Forwarding from [::1]:9090 -> 9090 | + | |
- | </ | + | |
- | + | ||
- | Retournez dans l' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Pour consultez la liste des alertes, cliquez sur le lien Alerts dans le menu en haut de la page : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | =====Harbor===== | + | |
- | + | ||
- | **Harbor** est un registre open source qui : | + | |
- | + | ||
- | * sécurise les artefacts (images) avec des politiques | + | |
- | * utilise un contrôle d' | + | |
- | * garantit que les images sont analysées et exemptes de vulnérabilités | + | |
- | * signe les images comme fiables. | + | |
- | + | ||
- | ====LAB #5 - Installation et Configuration de Harbor==== | + | |
- | + | ||
- | ===5.1 - Installation de Docker et de Docker Compose=== | + | |
- | + | ||
- | Connectez-vous à votre instance de Debian11 en tant que trainee au 10.0.2.46 puis devenez l' | + | |
- | + | ||
- | Installez les dépendances de Docker : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | </ | + | |
- | + | ||
- | Téléchargez la clef GPG officielle de docker : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | OK | + | |
- | </ | + | |
- | + | ||
- | Ajoutez le dépôt stable de docker : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | </ | + | |
- | + | ||
- | Installez maintenant **docker-ce** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | </ | + | |
- | + | ||
- | Téléchargez docker-compose : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | </ | + | |
- | + | ||
- | Rendez docker-compose exécutable et déplacez-le dans le répertoire **/ | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | + | ||
- | root@debian11: | + | |
- | </ | + | |
- | + | ||
- | ===5.2 - Installation de Harbor=== | + | |
- | + | ||
- | Téléchargez Harbor : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | </ | + | |
- | + | ||
- | Désarchivez Harbor : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | harbor/ | + | |
- | harbor/ | + | |
- | harbor/ | + | |
- | harbor/ | + | |
- | harbor/ | + | |
- | harbor/ | + | |
- | </ | + | |
- | + | ||
- | Placez-vous dans le répertoire **harbor** et copiez le fichier **harbor.yml.tmpl** vers **harbor.yml** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | + | ||
- | root@debian11: | + | |
- | </ | + | |
- | + | ||
- | Créez le fichier **/ | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | root@debian11: | + | |
- | { | + | |
- | " | + | |
- | } | + | |
- | </ | + | |
- | + | ||
- | Modifiez maintenant l' | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | root@debian11: | + | |
- | # Configuration file of Harbor | + | |
- | + | ||
- | # The IP address or hostname to access admin UI and registry service. | + | |
- | # DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients. | + | |
- | hostname: 10.0.2.46 | + | |
- | + | ||
- | # http related config | + | |
- | http: | + | |
- | # port for http, default is 80. If https enabled, this port will redirect to https port | + | |
- | port: 80 | + | |
- | + | ||
- | # https related config | + | |
- | # https: | + | |
- | # https port for harbor, default is 443 | + | |
- | # port: 443 | + | |
- | # The path of cert and key files for nginx | + | |
- | # certificate: | + | |
- | # private_key: | + | |
- | + | ||
- | # # Uncomment following will enable tls communication between all harbor components | + | |
- | </ | + | |
- | + | ||
- | Constatez la présence du script **install.sh** dans le répertoire **harbor/** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | common.sh | + | |
- | harbor.v2.6.2.tar.gz | + | |
- | </ | + | |
- | + | ||
- | Désactivez le service nginx dans la VM Debian11 : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | + | ||
- | root@debian11: | + | |
- | </ | + | |
- | + | ||
- | Installez maintenant Harbor avec le support pour **Chart Museum** et **Trivy** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | + | ||
- | [Step 0]: checking if docker is installed ... | + | |
- | + | ||
- | Note: docker version: 20.10.21 | + | |
- | + | ||
- | [Step 1]: checking docker-compose is installed ... | + | |
- | + | ||
- | Note: docker-compose version: 2.14.0 | + | |
- | + | ||
- | [Step 2]: loading Harbor images ... | + | |
- | ... | + | |
- | [Step 3]: preparing environment ... | + | |
- | ... | + | |
- | [Step 4]: preparing harbor configs ... | + | |
- | ... | + | |
- | [Step 5]: starting Harbor ... | + | |
- | ➜ | + | |
- | Chartmusuem will be deprecated as of Harbor v2.6.0 and start to be removed in v2.8.0 or later. | + | |
- | Please see discussion here for more details. https:// | + | |
- | [+] Running 13/13 | + | |
- | ⠿ Network harbor_harbor | + | |
- | ⠿ Network harbor_harbor-chartmuseum | + | |
- | ⠿ Container harbor-log | + | |
- | ⠿ Container registry | + | |
- | ⠿ Container registryctl | + | |
- | ⠿ Container harbor-portal | + | |
- | ⠿ Container redis Started | + | |
- | ⠿ Container chartmuseum | + | |
- | ⠿ Container harbor-db | + | |
- | ⠿ Container trivy-adapter | + | |
- | ⠿ Container harbor-core | + | |
- | ⠿ Container nginx Started | + | |
- | ⠿ Container harbor-jobservice | + | |
- | ✔ ----Harbor has been installed and started successfully.---- | + | |
- | </ | + | |
- | + | ||
- | Constatez les conteneurs créés par l' | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | CONTAINER ID | + | |
- | b8e4e3934c7a | + | |
- | 579b4b43877f | + | |
- | 57c8697b4d39 | + | |
- | ce4823c62886 | + | |
- | 57992f8f573a | + | |
- | e2df863f7009 | + | |
- | 3e7e2093a4a2 | + | |
- | 406aa384c742 | + | |
- | ddf08dcc8390 | + | |
- | b5cedbab739d | + | |
- | 13665ace83fd | + | |
- | </ | + | |
- | + | ||
- | Ainsi que les images téléchargées : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | REPOSITORY | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | </ | + | |
- | + | ||
- | Constatez maintenant les réseaux créés par l' | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | NETWORK ID | + | |
- | c080bf952007 | + | |
- | 380a2401fb01 | + | |
- | b5d0cc4623f6 | + | |
- | 3e48278ae275 | + | |
- | 4dd9174d8e25 | + | |
- | </ | + | |
- | + | ||
- | ===5.3 - Création d'un Nouveau Projet=== | + | |
- | + | ||
- | Connectez-vous à votre gateway en RDP et ouvrez le navigateur web. Allez à l'URL http:// | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Connectez-vous avec les identifiants par défaut - admin / Harbor12345 : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Harbor est organisé autour de **Projets**. Dans un projet se trouvent des **Dépôts** ou // | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que la valeur de **-1** indique que le projet a un quota de disque **illimité**. | + | |
- | </ | + | |
- | + | ||
- | Cliquez sur le bouton **OK** puis cliquez sur le nom **myproject** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | ===5.4 - Création d'un Dépôt=== | + | |
- | + | ||
- | Téléchargez maintenant l' | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | Using default tag: latest | + | |
- | latest: Pulling from library/ | + | |
- | 2db29710123e: | + | |
- | Digest: sha256: | + | |
- | Status: Downloaded newer image for hello-world: | + | |
- | docker.io/ | + | |
- | </ | + | |
- | + | ||
- | Retournez dans Harbor et cliquez sur **PUSH COMMAND** à droite. Dans la liste des commandes vous vous apercevrez la commande pour //tagger// une image pour le porjet **myproject** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Copiez cette commande puis modifiez la ainsi : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | + | ||
- | root@debian11: | + | |
- | REPOSITORY | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | hello-world | + | |
- | 10.0.2.46: | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez la spécification du port **80**. Sans spécifier le port le port par défaut **443** serait utilisé. | + | |
- | </ | + | |
- | + | ||
- | Connectez-vous à Harbor : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | Username: admin | + | |
- | Password: Harbor12345 | + | |
- | Error response from daemon: Get " | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez l' | + | |
- | </ | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | { | + | |
- | " | + | |
- | } | + | |
- | </ | + | |
- | + | ||
- | Modifiez donc ce fichier : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | root@debian11: | + | |
- | { | + | |
- | " | + | |
- | } | + | |
- | </ | + | |
- | + | ||
- | Redémarrez le service docker : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | root@debian11: | + | |
- | ● docker.service - Docker Application Container Engine | + | |
- | | + | |
- | | + | |
- | TriggeredBy: | + | |
- | Docs: https:// | + | |
- | Main PID: 487567 (dockerd) | + | |
- | Tasks: 44 | + | |
- | | + | |
- | CPU: 2.275s | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | + | ||
- | Dec 11 08:57:14 debian11 dockerd[487567]: | + | |
- | Dec 11 08:57:14 debian11 dockerd[487567]: | + | |
- | Dec 11 08:57:19 debian11 dockerd[487567]: | + | |
- | Dec 11 08:57:21 debian11 dockerd[487567]: | + | |
- | Dec 11 08:57:21 debian11 dockerd[487567]: | + | |
- | Dec 11 08:57:31 debian11 dockerd[487567]: | + | |
- | Dec 11 08:57:35 debian11 dockerd[487567]: | + | |
- | Dec 11 08:57:36 debian11 dockerd[487567]: | + | |
- | </ | + | |
- | + | ||
- | Maintenant redémarrez Harbor : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | [+] Running 13/13 | + | |
- | ⠿ Container harbor-jobservice | + | |
- | ⠿ Container nginx Removed | + | |
- | ⠿ Container chartmuseum | + | |
- | ⠿ Container trivy-adapter | + | |
- | ⠿ Container registryctl | + | |
- | ⠿ Container harbor-portal | + | |
- | ⠿ Container harbor-core | + | |
- | ⠿ Container harbor-db | + | |
- | ⠿ Container registry | + | |
- | ⠿ Container redis Removed | + | |
- | ⠿ Container harbor-log | + | |
- | ⠿ Network harbor_harbor | + | |
- | ⠿ Network harbor_harbor-chartmuseum | + | |
- | + | ||
- | root@debian11: | + | |
- | [+] Running 13/13 | + | |
- | ⠿ Network harbor_harbor | + | |
- | ⠿ Network harbor_harbor-chartmuseum | + | |
- | ⠿ Container harbor-log | + | |
- | ⠿ Container harbor-db | + | |
- | ⠿ Container harbor-portal | + | |
- | ⠿ Container chartmuseum | + | |
- | ⠿ Container redis Started | + | |
- | ⠿ Container registryctl | + | |
- | ⠿ Container registry | + | |
- | ⠿ Container trivy-adapter | + | |
- | ⠿ Container harbor-core | + | |
- | ⠿ Container harbor-jobservice | + | |
- | ⠿ Container nginx Started | + | |
- | </ | + | |
- | + | ||
- | Connectez-vous à Harbor : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | Username: admin | + | |
- | Password: | + | |
- | WARNING! Your password will be stored unencrypted in / | + | |
- | Configure a credential helper to remove this warning. See | + | |
- | https:// | + | |
- | + | ||
- | Login Succeeded | + | |
- | </ | + | |
- | + | ||
- | Les coordonnées de connexion sont stockées dans le fichier **/ | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | { | + | |
- | " | + | |
- | " | + | |
- | " | + | |
- | } | + | |
- | } | + | |
- | }root@debian11: | + | |
- | </ | + | |
- | + | ||
- | De cette façon, lors des logins futur, docker ne demandera ni le nom de l' | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | Removing login credentials for https:// | + | |
- | + | ||
- | root@debian11: | + | |
- | Authenticating with existing credentials... | + | |
- | WARNING! Your password will be stored unencrypted in / | + | |
- | Configure a credential helper to remove this warning. See | + | |
- | https:// | + | |
- | + | ||
- | Login Succeeded | + | |
- | </ | + | |
- | + | ||
- | Procédez maintenant au **push** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | Using default tag: latest | + | |
- | The push refers to repository [10.0.2.46: | + | |
- | e07ee1baac5f: | + | |
- | latest: digest: sha256: | + | |
- | </ | + | |
- | + | ||
- | Retournez à Harbor et constatez la présence du dépôt : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur le nom du dépôt et constatez son contenu : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que l' | + | |
- | </ | + | |
- | + | ||
- | ===5.5 - Pousser des Images Supplémentaires=== | + | |
- | + | ||
- | Modifiez le tag de l' | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | </ | + | |
- | + | ||
- | Procédez maintenant au **push** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | The push refers to repository [10.0.2.46: | + | |
- | e07ee1baac5f: | + | |
- | 1.0: digest: sha256: | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que la valeur du SHA256 est indentique au push précédent. De cette façon Docker n'a pas poussé l' | + | |
- | </ | + | |
- | + | ||
- | Constatez le résultat dans Harbor : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Téléchargez maintenant l' | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | Using default tag: latest | + | |
- | latest: Pulling from library/ | + | |
- | c158987b0551: | + | |
- | Digest: sha256: | + | |
- | Status: Downloaded newer image for alpine: | + | |
- | docker.io/ | + | |
- | </ | + | |
- | + | ||
- | Modifiez le tag de l' | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | </ | + | |
- | + | ||
- | Procédez maintenant au **push** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | Using default tag: latest | + | |
- | The push refers to repository [10.0.2.46: | + | |
- | ded7a220bb05: | + | |
- | latest: digest: sha256: | + | |
- | </ | + | |
- | + | ||
- | Constatez le résultat dans Harbor : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | ===5.6 - Travailler avec des Artefacts=== | + | |
- | + | ||
- | Cliquez sur **Projects > myproject > myproject/ | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez ensuite sur le bouton **ADD TAG** et ajoutez le tag **anothertag** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Sur la ligne 1.0 et dans la colonne **Pull Command**, cliquez sur l' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Revenez à l' | + | |
- | + | ||
- | < | + | |
- | REPOSITORY | + | |
- | 10.0.2.46: | + | |
- | alpine | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | 10.0.2.46: | + | |
- | 10.0.2.46: | + | |
- | hello-world | + | |
- | </ | + | |
- | + | ||
- | Supprimez l' | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | Untagged: 10.0.2.46: | + | |
- | </ | + | |
- | + | ||
- | Consultez la liste des images de nouveau : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | REPOSITORY | + | |
- | 10.0.2.46: | + | |
- | alpine | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | 10.0.2.46: | + | |
- | hello-world | + | |
- | </ | + | |
- | + | ||
- | Téléchargez maintenant l' | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | 1.0: Pulling from myproject/ | + | |
- | Digest: sha256: | + | |
- | Status: Downloaded newer image for 10.0.2.46: | + | |
- | 10.0.2.46: | + | |
- | </ | + | |
- | + | ||
- | Lister maintenant les images : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | REPOSITORY | + | |
- | 10.0.2.46: | + | |
- | alpine | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | hello-world | + | |
- | 10.0.2.46: | + | |
- | 10.0.2.46: | + | |
- | </ | + | |
- | + | ||
- | Modifiez le tag de l' | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | + | ||
- | root@debian11: | + | |
- | REPOSITORY | + | |
- | 10.0.2.46: | + | |
- | alpine | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | 10.0.2.46: | + | |
- | 10.0.2.46: | + | |
- | 10.0.2.46: | + | |
- | hello-world | + | |
- | </ | + | |
- | + | ||
- | Procédez maintenant au **push** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | The push refers to repository [10.0.2.46: | + | |
- | e07ee1baac5f: | + | |
- | latest: digest: sha256: | + | |
- | </ | + | |
- | + | ||
- | ===5.7 - Copier un Artefact d'un Projet vers un autre Projet=== | + | |
- | + | ||
- | Commencez par créer un autre projet appelé **devtest** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur **Projects > myproject > myproject/ | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez ensuite sur **ACTIONS > Copy** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Renseignez les champs et cliquez sur le bouton **CONFIRM** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur **Projects > devtest** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez ensuite sur **devtest/ | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | ===5.8 - Suppression d'un Artefact, d'un Dépôt et d'un Projet=== | + | |
- | + | ||
- | Sélectionnez l' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Confirmez la suppression en cliquant sur le bouton **CONFIRM** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur **devtest** et cochez **devtest/ | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur le bouton **DELETE** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Confirmez la suppression en cliquant sur le bouton **CONFIRM** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur **Projects** puis cochez **devtest** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur **ACTION** puis sur **Delete** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Confirmez la suppression en cliquant sur le bouton **CONFIRM** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | ===5.8 - Utilisation de Labels=== | + | |
- | + | ||
- | Harbor gère des **Labels** ou étiquettes. Ces étiquettes peuvent être globales ou spécifiques à un Projet. Quand une étiquette est spécifique, | + | |
- | + | ||
- | Cliquez sur **Labels** dans Harbor : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur **NEW LABEL** et créez les deux étiquettes suivantes : | + | |
- | + | ||
- | * **gtested** - global tested | + | |
- | * **gprodready** global production ready | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur **Projects > myproject > myproject/ | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur **ACTIONS** > **Add Labels** puis sélectionnez **gtested** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez maintenant sur **myproject > Labels** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez ensuite sur **NEW LABEL** et créez ensuite une étiguette spécifique au projet appelé **myproject-deploy** ayant une description **myproject label** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur **Repositories > myproject/ | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur **ACTIONS** > **Add Labels** et sélectionnez l' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Pour visualiser toutes les étiguettes, | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur **Projects > NEW PROJECT** et créez le projet **project2** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur **project2 > Labels > NEW LABEL** et créez l' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur **Projects > myproject > myproject/ | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur **ACTIONS** > **Add Labels** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que l' | + | |
- | </ | + | |
- | + | ||
- | ===5.9 - Authentification et RBAC=== | + | |
- | + | ||
- | Cliquez sur **Users** puis sur **NEW USER** et creéz l' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que pour être valide le mot de passe doit comporter une lettre Majuscule et un chiffre. | + | |
- | </ | + | |
- | + | ||
- | Sélectionnez l' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur **Projects > myproject** puis sur **Members** et **+ USER** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Pour consulter les privilèges de chaque rôle, cliquez sur **[[https:// | + | |
- | </ | + | |
- | + | ||
- | Cliquez sur **OK** et sélectionnez l' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Pour modifier son rôle, cliquez sur **ACTION** et choississez le rôle désiré : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que le bouton **+ GROUP** est grisé. Si un Active Directory ou bien LDAP avait été configuré, Harbor pourrait lire la liste des groupes et n ous permettrait d' | + | |
- | </ | + | |
- | + | ||
- | ===5.10 - Utilisation d' | + | |
- | + | ||
- | Créez un répertoire nommé myDocker : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | root@debian11: | + | |
- | root@debian11: | + | |
- | root@debian11: | + | |
- | </ | + | |
- | + | ||
- | Créez le fichier myEntrypoint.sh : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | root@debian11: | + | |
- | # | + | |
- | if [ -z " | + | |
- | echo "La variable myVariable doit être renseignée" | + | |
- | return 1 | + | |
- | fi | + | |
- | + | ||
- | while true; | + | |
- | do | + | |
- | echo $1 \($(date +%H: | + | |
- | sleep " | + | |
- | done | + | |
- | </ | + | |
- | + | ||
- | Testez ce script : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | salut (16: | + | |
- | salut (16: | + | |
- | salut (16: | + | |
- | ^C | + | |
- | root@debian11: | + | |
- | </ | + | |
- | + | ||
- | Rendez ce script exécutable : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | </ | + | |
- | + | ||
- | Créez maintenant le fichier **Dockerfile** dans le répertoire **~/ | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | FROM centos: | + | |
- | MAINTAINER ittraining " | + | |
- | COPY myEntrypoint.sh / | + | |
- | ENV myVariable 3 | + | |
- | ENTRYPOINT ["/ | + | |
- | CMD [" | + | |
- | </ | + | |
- | + | ||
- | Connectez-vous à Harbor : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | Authenticating with existing credentials... | + | |
- | WARNING! Your password will be stored unencrypted in / | + | |
- | Configure a credential helper to remove this warning. See | + | |
- | https:// | + | |
- | + | ||
- | Login Succeeded | + | |
- | </ | + | |
- | + | ||
- | Générez maintenant l' | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | Sending build context to Docker daemon | + | |
- | Step 1/6 : FROM centos: | + | |
- | latest: Pulling from library/ | + | |
- | a1d0c7532777: | + | |
- | Digest: sha256: | + | |
- | Status: Downloaded newer image for centos: | + | |
- | | + | |
- | Step 2/6 : MAINTAINER ittraining " | + | |
- | | + | |
- | Removing intermediate container 7e359420ea95 | + | |
- | | + | |
- | Step 3/6 : COPY myEntrypoint.sh / | + | |
- | | + | |
- | Step 4/6 : ENV myVariable 3 | + | |
- | | + | |
- | Removing intermediate container edf989144c38 | + | |
- | | + | |
- | Step 5/6 : ENTRYPOINT ["/ | + | |
- | | + | |
- | Removing intermediate container 0490b6a50bbc | + | |
- | | + | |
- | Step 6/6 : CMD [" | + | |
- | | + | |
- | Removing intermediate container e2ecfea5be53 | + | |
- | | + | |
- | Successfully built ccb27534d7f2 | + | |
- | Successfully tagged 10.0.2.46: | + | |
- | + | ||
- | root@debian11: | + | |
- | REPOSITORY | + | |
- | 10.0.2.46: | + | |
- | 10.0.2.46: | + | |
- | alpine | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | goharbor/ | + | |
- | 10.0.2.46: | + | |
- | hello-world | + | |
- | 10.0.2.46: | + | |
- | 10.0.2.46: | + | |
- | centos | + | |
- | </ | + | |
- | + | ||
- | Procédez maintenant au **push** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | The push refers to repository [10.0.2.46: | + | |
- | 7c7558b01004: | + | |
- | 74ddd0ec08fa: | + | |
- | latest: digest: sha256: | + | |
- | </ | + | |
- | + | ||
- | Retournez à l' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que le dépôt **myproject/ | + | |
- | </ | + | |
- | + | ||
- | Cliquez sur **myproject/ | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que l' | + | |
- | </ | + | |
- | + | ||
- | Refaites un build de l' | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | Sending build context to Docker daemon | + | |
- | Step 1/6 : FROM centos: | + | |
- | | + | |
- | Step 2/6 : MAINTAINER ittraining " | + | |
- | | + | |
- | | + | |
- | Step 3/6 : COPY myEntrypoint.sh / | + | |
- | | + | |
- | | + | |
- | Step 4/6 : ENV myVariable 3 | + | |
- | | + | |
- | | + | |
- | Step 5/6 : ENTRYPOINT ["/ | + | |
- | | + | |
- | | + | |
- | Step 6/6 : CMD [" | + | |
- | | + | |
- | | + | |
- | Successfully built ccb27534d7f2 | + | |
- | Successfully tagged 10.0.2.46: | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez l' | + | |
- | </ | + | |
- | + | ||
- | Procédez maintenant au **push** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | The push refers to repository [10.0.2.46: | + | |
- | 7c7558b01004: | + | |
- | 74ddd0ec08fa: | + | |
- | rel1: digest: sha256: | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que seul le nouveau tag a été poussé. | + | |
- | </ | + | |
- | + | ||
- | Editez le Dockerfile et changez la valeur de **myVariable** de 3 à **5** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | root@debian11: | + | |
- | FROM centos: | + | |
- | MAINTAINER ittraining " | + | |
- | COPY myEntrypoint.sh / | + | |
- | ENV myVariable 5 | + | |
- | ENTRYPOINT ["/ | + | |
- | CMD [" | + | |
- | </ | + | |
- | + | ||
- | Compilez de nouveau l' | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | Sending build context to Docker daemon | + | |
- | Step 1/6 : FROM centos: | + | |
- | | + | |
- | Step 2/6 : MAINTAINER ittraining " | + | |
- | | + | |
- | | + | |
- | Step 3/6 : COPY myEntrypoint.sh / | + | |
- | | + | |
- | | + | |
- | Step 4/6 : ENV myVariable 5 | + | |
- | | + | |
- | Removing intermediate container c90f60beee6f | + | |
- | | + | |
- | Step 5/6 : ENTRYPOINT ["/ | + | |
- | | + | |
- | Removing intermediate container 8aabb88b172d | + | |
- | | + | |
- | Step 6/6 : CMD [" | + | |
- | | + | |
- | Removing intermediate container 8e1bd939a7c2 | + | |
- | | + | |
- | Successfully built 9a12b543b94b | + | |
- | Successfully tagged 10.0.2.46: | + | |
- | </ | + | |
- | + | ||
- | Procédez maintenant au **push** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | The push refers to repository [10.0.2.46: | + | |
- | 7c7558b01004: | + | |
- | 74ddd0ec08fa: | + | |
- | rel2: digest: sha256: | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que la valeur du SHA256 de rel2 est différente - **b918acd244c70cf528d8e96584d8d34099d2a8eefc1edd86ba972dd975934f52** par rapport à **323ab8f05733ac369963b338bb8fe81bd5cb2d77b46ac3650b7924e7da3aa9cf**. | + | |
- | </ | + | |
- | + | ||
- | De ce fait un nouvel Artefact a été créé : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Editez le Dockerfile et changez la valeur de **CMD** de " | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | FROM centos: | + | |
- | MAINTAINER ittraining " | + | |
- | COPY myEntrypoint.sh / | + | |
- | ENV myVariable 5 | + | |
- | ENTRYPOINT ["/ | + | |
- | CMD [" | + | |
- | </ | + | |
- | + | ||
- | Compilez de nouveau l' | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | Sending build context to Docker daemon | + | |
- | Step 1/6 : FROM centos: | + | |
- | | + | |
- | Step 2/6 : MAINTAINER ittraining " | + | |
- | | + | |
- | | + | |
- | Step 3/6 : COPY myEntrypoint.sh / | + | |
- | | + | |
- | | + | |
- | Step 4/6 : ENV myVariable 5 | + | |
- | | + | |
- | | + | |
- | Step 5/6 : ENTRYPOINT ["/ | + | |
- | | + | |
- | | + | |
- | Step 6/6 : CMD [" | + | |
- | | + | |
- | Removing intermediate container ac174f91145b | + | |
- | | + | |
- | Successfully built 56cc6362dc99 | + | |
- | Successfully tagged 10.0.2.46: | + | |
- | </ | + | |
- | + | ||
- | Procédez maintenant au **push** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | The push refers to repository [10.0.2.46: | + | |
- | 7c7558b01004: | + | |
- | 74ddd0ec08fa: | + | |
- | rel2: digest: sha256: | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que la valeur du SHA256 de rel2 est différente - **fcf710f98e14ac3df4d3cf365f04423da8ceb42325eca9efe87f67082904728e** par rapport à **b918acd244c70cf528d8e96584d8d34099d2a8eefc1edd86ba972dd975934f52**. Par contre, puisque le même tag a été utilisé, le tag **rel2** a été attribué au dernier Artefact créé et le même tag a été supprimé de l' | + | |
- | </ | + | |
- | + | ||
- | ===5.11 - Rétention de Tags=== | + | |
- | + | ||
- | Pour gérer ce comportement, | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur **ADD RULE** et remplissez le formulaire ainsi : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Cette règle s' | + | |
- | </ | + | |
- | + | ||
- | Cliquez sur **EDIT** sur la ligne **Schedule** et choisissez **hourly** puis cliquez **Save** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur **OK** dans la boîte d' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez ensuite sur le bouton **DRY RUN**. Quand le Dry Run a terminé avec le message **Success**, | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Sur la dernière ligne, cliquez sur le bouton **Log** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Consultez la colonne **Retention** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Revenez dans l' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Editez de nouveau le Dockerfile et changez la valeur de **myVariable** de 5 à **10** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | root@debian11: | + | |
- | FROM centos: | + | |
- | MAINTAINER ittraining " | + | |
- | COPY myEntrypoint.sh / | + | |
- | ENV myVariable 10 | + | |
- | ENTRYPOINT ["/ | + | |
- | CMD [" | + | |
- | </ | + | |
- | + | ||
- | Compilez de nouveau l' | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | Sending build context to Docker daemon | + | |
- | Step 1/6 : FROM centos: | + | |
- | | + | |
- | Step 2/6 : MAINTAINER ittraining " | + | |
- | | + | |
- | | + | |
- | Step 3/6 : COPY myEntrypoint.sh / | + | |
- | | + | |
- | | + | |
- | Step 4/6 : ENV myVariable 10 | + | |
- | | + | |
- | Removing intermediate container 7c938717175f | + | |
- | | + | |
- | Step 5/6 : ENTRYPOINT ["/ | + | |
- | | + | |
- | Removing intermediate container b2dc04a9363d | + | |
- | | + | |
- | Step 6/6 : CMD [" | + | |
- | | + | |
- | Removing intermediate container fd7a8952dd7f | + | |
- | | + | |
- | Successfully built 3bbe34d8d430 | + | |
- | Successfully tagged 10.0.2.46: | + | |
- | </ | + | |
- | + | ||
- | Procédez maintenant au **push** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | The push refers to repository [10.0.2.46: | + | |
- | 7c7558b01004: | + | |
- | 74ddd0ec08fa: | + | |
- | rel3: digest: sha256: | + | |
- | </ | + | |
- | + | ||
- | Exécutez la règle : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Constatez la liste des Artefacts dans **mydocker** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que c'est l' | + | |
- | </ | + | |
- | + | ||
- | ===5.12 - Immutabilité des Tags=== | + | |
- | + | ||
- | Cliquez sur **myproject > Policy > TAG IMMUTABILITY** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez maintenant sur le bouton **ADD RULE** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Cliquez sur le bouton **ADD** : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Cette règle s' | + | |
- | </ | + | |
- | + | ||
- | Essayez de faire un push de l' | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | The push refers to repository [10.0.2.46: | + | |
- | 7c7558b01004: | + | |
- | 74ddd0ec08fa: | + | |
- | unknown: Failed to process request due to ' | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez qu'il n'est pas possible de faire un push car la règle d' | + | |
- | </ | + | |
- | + | ||
- | Éditez le Dockerfile et changez la valeur de **myVariable** de 10 à **8** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | root@debian11: | + | |
- | FROM centos: | + | |
- | MAINTAINER ittraining " | + | |
- | COPY myEntrypoint.sh / | + | |
- | ENV myVariable 8 | + | |
- | ENTRYPOINT ["/ | + | |
- | CMD [" | + | |
- | </ | + | |
- | + | ||
- | Faites un build de **mydocker: | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | Sending build context to Docker daemon | + | |
- | Step 1/6 : FROM centos: | + | |
- | | + | |
- | Step 2/6 : MAINTAINER ittraining " | + | |
- | | + | |
- | | + | |
- | Step 3/6 : COPY myEntrypoint.sh / | + | |
- | | + | |
- | | + | |
- | Step 4/6 : ENV myVariable 8 | + | |
- | | + | |
- | Removing intermediate container 541758cf561f | + | |
- | | + | |
- | Step 5/6 : ENTRYPOINT ["/ | + | |
- | | + | |
- | Removing intermediate container 9d309f201613 | + | |
- | | + | |
- | Step 6/6 : CMD [" | + | |
- | | + | |
- | Removing intermediate container e7397e408526 | + | |
- | | + | |
- | Successfully built 85f1cbc19cee | + | |
- | Successfully tagged 10.0.2.46: | + | |
- | </ | + | |
- | + | ||
- | Procédez maintenant au **push** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | The push refers to repository [10.0.2.46: | + | |
- | 7c7558b01004: | + | |
- | 74ddd0ec08fa: | + | |
- | rel4: digest: sha256: | + | |
- | </ | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez qu'il est possible de faire un push car le tag rel4 n' | + | |
- | </ | + | |
- | + | ||
- | Dans l' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Essayez de supprimer l' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Notez l' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Pour pouvoir supprimer l' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Maintenant, essayez de supprimer l' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Vous verrez que la suppression a réussi : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Editez le Dockerfile et changez la valeur de **myVariable** de 8 à **7** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | root@debian11: | + | |
- | FROM centos: | + | |
- | MAINTAINER ittraining " | + | |
- | COPY myEntrypoint.sh / | + | |
- | ENV myVariable 7 | + | |
- | ENTRYPOINT ["/ | + | |
- | CMD [" | + | |
- | </ | + | |
- | + | ||
- | Faites un build de **mydocker: | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | Sending build context to Docker daemon | + | |
- | Step 1/6 : FROM centos: | + | |
- | | + | |
- | Step 2/6 : MAINTAINER ittraining " | + | |
- | | + | |
- | | + | |
- | Step 3/6 : COPY myEntrypoint.sh / | + | |
- | | + | |
- | | + | |
- | Step 4/6 : ENV myVariable 7 | + | |
- | | + | |
- | Removing intermediate container b2153c9b0781 | + | |
- | | + | |
- | Step 5/6 : ENTRYPOINT ["/ | + | |
- | | + | |
- | Removing intermediate container 81b97d9082ed | + | |
- | | + | |
- | Step 6/6 : CMD [" | + | |
- | | + | |
- | Removing intermediate container 7252818184fc | + | |
- | | + | |
- | Successfully built f9466edbe1f3 | + | |
- | Successfully tagged 10.0.2.46: | + | |
- | </ | + | |
- | + | ||
- | Procédez maintenant au **push** : | + | |
- | + | ||
- | < | + | |
- | root@debian11: | + | |
- | The push refers to repository [10.0.2.46: | + | |
- | 7c7558b01004: | + | |
- | 74ddd0ec08fa: | + | |
- | rel5: digest: sha256: | + | |
- | </ | + | |
- | + | ||
- | Pour pouvoir supprimer l' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Maintenant, essayez de supprimer l' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Vous verrez que la suppression a réussi : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Retournez dans Harbor et modifier la règle d' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Rappelez-vous que la règle de Rétention de Tags ne garde que les deux Artefacts les plus récents : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Procédez à un Dry Run de la règle de Rétention de Tags et consultez le log de mydocker : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | <WRAP center round important 60%> | + | |
- | **Important** : Notez que la règle d' | + | |
- | </ | + | |
----- | ----- | ||
- | Copyright © 2022 Hugh Norris | + | Copyright © 2024 Hugh Norris |
- | + | ||
- | + |