Ce chart HELM permet de déployer l'application de [démonstration Java](https://github.com/cloud-pi-native/tuto-java. Il convient de suivre dans un premier temps le tutoriel démonstration Java depuis la branche tuto
Ce chart permet de créer :
- Appel au chart HELM par déclaration de dépendance pour la création d'une instance PosgreSQL / Bitnami
- Création d'un déploiement de l'image construite par DSO sur le projet démonstration Java
- Création d'un service sur le déploiement
- Création d'un ingress en https vers le service
Dans le cadre de ce tutoriel, nous allons déployer l'application qui a été construite dans le tutoriel précédent.
Nous allons détailler l'intégration du repo d'infra de démo à l'offre Cloud Pi Native sur la plateforme d'accéleration.
Dans un premier temps il est nécessaire d'ajouter le repo de code d'infrastructure au projet contenant la construction de l'applicatoin tuto-java :
- Depuis son projet, aller dans l'onglet Dépôt, puis ajouter un nouveau dépôt :
- Nom du dépôt Git interne : demo-java-infra
Le repo contient du code d'infrastructure donc cochez la case Dépôt contenant du code d'infrastructure.
- Renseigner l'URL du repo externe https://github.com/cloud-pi-native/tuto-java-infra-helm.git. Le repo est public, laissez donc décoché la case Dépôt de source privé
Cliquez sur le bouton Ajouter le dépôt et attendre que le dépôt apparaisse dans la console.
- depuis l'onglet Services externes vérifier en cliquant sur le service Gitlab que le dépôt demo-java-infra est bien présent dans ses projets gitlab.
Afin de déployer l'application, il est nécessaire de créer un environnement depuis la console. Pour cela, aller dans le menu Environnements puis cliquez sur le bouton "+Ajouter un nouvel environnement" :
- Nom : Donnez un nom logique à l'environnement : demo, dev, integ, prd, etc. Il est conseillé de choisir des noms cours car le nom est utilisé dans les objets Kubernetes créés or ceux-ci sont limité à 63 caractère au total. Pour le tutoriel, choisir tuto
- Choisir une zone : sur l'environnement d'accélération, une seule zone est disponible: Zone défaut.
- Type d'environnement: choisir dev. Le choix d'un type d'environnement permet de filtre les dimmensionnements proposés
- Dimensionnement: choisir small. le dimensionnement appose un quota de ressource sur le namespace correspondant au projet.
- Cluster : choisir le cluster formation-app (ce cluster est dédié aux exercices et peut être facilement purgé)
Cliquez sur le bouton Ajouter l'environnement et attendre que l'environnement soir créé dans la console et apparaisse dans la liste des environnements de son projet.
Lorsqu'un projet contient un repo d'infrastructure et (au moins) un environnement, la console crée automatiquement les applications ArgoCD associées. Ainsi, depuis le menu gauche Services externes cliquez sur la tuile ArgoCD DSO puis le bouton login via Keycloak et vérifier que vous retrouvez votre application et cliquez sur la tuile correspondant à votre application. L'application apparait en erreur, c'est normal à ce stade et nous allons corriger les différents points.
L'application est créée avec un certain nombre de paramètre par défaut qui ne correspondent pas forcément à la réalité. Pour cela, depuis l'application, cliquez sur le bouton Details en haut à gauche. Ce menu présente les informations principales de l'application ArgoCD :
- Le cluster et le namespace de déploiement
- Le repo Git associé (repo d'infrastructure)
- La branche utilisée sur le repo (par defaut HEAD)
- Le répertoire dans lequel chercher les éléments d'infrastructure.
Pour modifier les éléments de cette vue, utilisez le bouton EDIT en haut à droite. Attention, ArgoCD rafraichi régulièrement la page et "perd" l'édition en cours.
Les éléments à vérifier de façon générales sont :
- La branche utilisée, par defaut il s'agit de la branche principale du repo, mais il est possible suivant le cas de modifier cette branche. Par exemple, pour utiliser la branche develop ou dso du projet, il est possible d'éditer cette information pour remplacer HEAD par le nom de la branche à utiliser. Pour notre exemple, utilisez la branche tuto.
- Le répertoire dans lequel chercher les éléments d'infrastructure : Par defaut, la console prépositionne un répertoire helm à la racine du projet. Si ce n'est pas le cas il est possible d'éditer cette information pour remplacer ./helm par le nom du répertoire contenant le code d'infrastructure. A noter que pour utiliser le dossier "racine" du projet il convient de renseigner "./". Pour notre exemple, mettez "./"
Validez les modifications en cliquant sur le bouton "SAVE" en haut à droite. Puis fermer la fenêtre de configuration par la croix en haut à droite pour revenir à l'écran principal d'ArgoCD.
Attendre quelques secondes et les éléments de déploiement devraient arriver dans l'interface principale d'ArgoCD
L'application déployée n'est pas fonctionnelle, et certains éléments apparaissent sous la forme d'un petit coeur brisé.
Il est possible de consulter les événements en erreur en cliquant sur le POD puis en allant sur l'onglet EVENTS. A noter qu'il est églament possible de consulter les logs des PODS sur l'onglet LOGS situé à côté.
En effet, un certain nombre d'éléments ne peuvent pas être déduite par avance lors de tutoriel :
- Emplacement de l'image dans le repository Harbor car dépendant du nom du projet.
- URL de déploiement qui est laissée libre au projet.
Le chart HELM utilisé prévoit déjà le paramétrage de ces éléments, ce qui doit être le cas de tous les charts HELM utilisés.
Pour des raisons de facilité, nous allons travailler à partir du repo de code de gitlab et non depuis la source, dans un mode projet, il conviendrait de travailler depuis le repo externe et de procéder à des synchronisation repo externe -> repo interne.
-
Depuis Gitlab, aller dans le projet demo-java-infra et choisir la branche tuto puis sur le bouton edit -> web IDE créer un fichier values-tuto.yaml
-
Ajouter le contenu suivant:
image:
repository: harbor.apps.dso.numerique-interieur.com/form-tuto/java-demo
pullPolicy: Always
# Overrides the image tag whose default is the chart appVersion.
tag: "master"
ingress:
host: tuto.formation-app.cpin.numerique-interieur.com
# Contrainte de sécurité Openshift
postgresql:
primary:
containerSecurityContext:
enabled: true
podSecurityContext:
enabled: true
volumePermissions:
enabled: false
securityContext:
runAsUser: "1001"
securityContext:
enabled: true
shmVolume:
chmod:
enabled: false
containerSecurityContext:
enabled: true
podSecurityContext:
enabled: true
volumePermissions:
enabled: true
securityContext:
runAsUser: "1001"
securityContext:
enabled: true
shmVolume:
chmod:
enabled: false
containerSecurityContext:
enabled: true
podSecurityContext:
enabled: true
Adapter le contenu en fonction de votre projet :
- image.repository : correspond à l'emplacement de l'image construite dans le tuto précédent et deployer sur Harbor. Pour connaitre l'emplacement, depuis la console, aller sur le menu Tableau de bord de son projet puis cliquez sur le bouton Afficher les secrets des services dans le bloc Harbor est précisé la racine de déploiement des images du projet, par exemple harbor.apps.dso.numerique-interieur.com/mi-service-team/. Attention, lors de la modification de conserver le nom de l'image construite (/java-demo) dans l'URL du repo par exemple harbor.formation.cpin.numerique-interieur.com/test-prj/java-demo
- image.pullPolicy : Correspond à la politique de téléchargement de l'image lors du déploiement, laisser à la valeur "Always" pour être sûr de récupérer toujours la dernière version de l'image. En mode projet, une politique de tag immutable est fortement conseillée et donc la politique de déploiement pourra passer à IfNotPresent. Dans le cadre de ce tuto, laisser Always
- tag: tag de l'image associé à image.repository, pour le tuto mettre tuto
- ingress.host : Nom DNS de l'application. Sur l'environnement d'accélération, la génération des DNS et des certiifcats est automatiquement géré en respectant les sous domaines liés aux clusters. La documentation présente ce point ici. Pour le tutoriel, mettre un nom de la forme <NOM_APPLI>.formation-app.cpin.numerique-interieur.com /!\ Attention /!\ ce nom doit être unique.
Le bloc postgres est à ajouter en l'état pour permettre un déploiement de postgres sur un cluster kubernetes "sécurisé en mode openshift" ce qui est le cas pour l'environnement Scaleway.
Une fois que ce fichier est créé et commit / push sur le repos git de gitlab, retourner sur argoCD sur son application et cliquez sur le bouton REFRESH pour voir apparaitre le message de commit correspondant à la modification ci-dessus.
Nous allons maintenant configurer ArgoCD pour utiliser le fichier values-tuto.yaml
Cliquez sur "Details", puis sur l'écran qui apparait, choisir l'onglet PARAMETERS cliquez sur le bouton EDIT puis dans values files choisir par autocomplétion le fichier values-tuto.yaml.
Sauvegarder et fermer cette fenêtre de configuration pour revenir à l'écran de l'application ArgoCD. Vérifier que le déploiement s'effectue correctement (tout les éléments doivent passer en vert), cela peut prendre quelques secondes.
Une fois le déploiement terminé et opérationnel, ouvrir un navigateur et vérifier votre l'URL que vous avez saisie dans le fichier values-tuto.yaml sur la clé ingress.host https://<NOM_APPLI>.formation-app.cpin.numerique-interieur.com/api/demo/demo
Il est également possible, depuis ArgoCD de cliquer sur la 3ème icone de l'objet Ingress qui ouvre directement une nouvelle page sur l'URL de l'application.
Si tout est correctement configuré, vous devez avoir une liste au format JSON contenant la liste des personnes présentes en base de données de l'application de tuto.
[
{
"id": 1,
"name": "Alice"
},
{
"id": 2,
"name": "Bob"
},
{
"id": 3,
"name": "Charles"
},
{
"id": 4,
"name": "Denis"
},
{
"id": 5,
"name": "Emily"
}
]
Bravo vous avez terminé le tutoriel de déploiement !
Nous allons maintenant voir la gestion des secrets
Dans l'exemple de déploiement, les secrets sont présents "en clair" dans un objet Secret. Ce fichier est dans templates/secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: pg-secret
type: Opaque
data:
PG_PASSWORD: TXlTdXBFclBhU1N3T3Jk
PG_ROOT_PASSWORD: TXlTdXBFclBhU1N3T3Jk
Il est possible de décoder facilement la valeur de ces secrets car ils sont encodé en base64 :
$ echo TXlTdXBFclBhU1N3T3Jk | base64 -d
MySupErPaSSwOrd
Cette pratique ne convient pas à une utilisation en production avec des vrais mots de passe. Ainsi, l'offre Cloud Pi Native propose d"utiliser la solution de chiffrement asymétrique SOPS pour chiffrer les secrets. Le principe est que chaque cluster Cloud Pi Native possèdent sa paire de clé privée / publique. le projet chiffre ses secrets en utilisant la clé publique du cluster et lorsque les fichiers chiffrés sont déployés, le cluster les déchiffre car il connait la clé privée associée.
Pour cela nous allons avoir besoin de l'utilitaire AGE
De la documentation complémentaire est présente sur le repo d'exemple ou sur la documentation Cloud Pi Native
La clé publique des différents clusters est présente dans la console Cloud Pi dans les informations du cluster.
Récupérer la clé publique du cluster de formation (age1qt7e329qjlhqsfsyxsvws56ukp2f9h0ktmj45atleqk0q406mfhstwnudv) sur SCW
Créer un fichier sur son poste, nommé secret.yaml dont le contenu est le suivant :
apiVersion: isindir.github.com/v1alpha3
kind: SopsSecret
metadata:
name: tuto-sops-secret
spec:
secretTemplates:
- name: pg-secret-sops
stringData:
PG_PASSWORD: MySupErPaSSwOrd
PG_ROOT_PASSWORD: MySupErPaSSwOrd
Comme on peut le voir on crée un objet de type SopsSecret et non plus Secret dans le champ kind
Lancer la commande suivante pour un déploiement sur Scaleway formation :
sops -e --age age1qt7e329qjlhqsfsyxsvws56ukp2f9h0ktmj45atleqk0q406mfhstwnudv --encrypted-suffix Templates secret.yaml > secret.enc.yaml
Cette commande va chiffrer le contenu des clés dont le suffix est Templates avec la clé public passée en paramètre et l'écrire dans un fichier secret.enc.yaml Il est important de conserver l'extension du fichier donc ".enc.yaml" et pas ".yaml.enc" car SOPS se base sur cette extension pour déterminer le contenu du fichier.
Le contenu du fichier secret.enc.yaml est le suivant :
apiVersion: isindir.github.com/v1alpha3
kind: SopsSecret
metadata:
name: tuto-sops-secret
spec:
secretTemplates:
- name: ENC[AES256_GCM,data:o1j2+TbiOhCyHuEfyBQ=,iv:ojK6VrN0DAu/ZhijXo5u2ighYP/+8/qWFfW2LMKHFQ0=,tag:IFcB+WaIb0pcZydt1ZYldA==,type:str]
stringData:
PG_PASSWORD: ENC[AES256_GCM,data:3R8RJzIGf549Q0EUPhg/,iv:4O2i99sb13Dynv20G/SVxJBTZ9HoSPbkLQp1XMxP2Vc=,tag:Wbu4+jESe+lZ+L5VN3OhWQ==,type:str]
PG_ROOT_PASSWORD: ENC[AES256_GCM,data:/JGwlXwWiMF3eFY8InBF,iv:yh9e6uQAikBm+Xs0gleyxSZZ+Oi+v/8ax1J+T51MRnU=,tag:8TFLJyiQH7+0yP/m/hzIUg==,type:str]
sops:
kms: []
gcp_kms: []
azure_kv: []
hc_vault: []
age:
- recipient: age19tfqxgdgx3fe96j8fyy0c65nsfj8ku8sl4ccfxnzpn3xpakylg5s8sgac7
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB3UmpTQ2FxQ3F4KzRIM0oy
Q2p1MlFIR25tdlRhZ05TMTc2ZEJmamxTdGw4CkM0NkFRODFHdGNiMU1vYUdUbWlv
M1VqSytIQXd0T1ZUdllDaXNlbU5RdncKLS0tIG9HZXoxMEo2eFYzVVBFQ2NuRnZ4
aTlHR1FPZ2JrRDJDS25sUjFLMmh1VmsKbgYx2nnTXRLj6TIT2B4vAQUAgAnakWGB
qJYKj6+Vv4N2lfBek9to2VKNv7n9gIa4KaxKWZlk+73hwoi6Z6/ozA==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2025-01-27T14:33:22Z"
mac: ENC[AES256_GCM,data:Yva1sZYkxUD7D9h6DXpb4Ks8SseNp1gUrSKwsaTo2yvoghLfiJCW0fOdRReCVS3SgwqWi2LwjFGihEsHYFclzBqhGjkOX/zNoWkg5QENZ/5DqlJFlEwkeCNJbF+85T+vIJrP8OQ0qN/3i5Wt4qbOZW0mEhZpRRPlgTPwaJqT+Fw=,iv:rGnChbKV0BHpPpTiB7/MbS3nY24gA/sUAY0aLy4TsFI=,tag:cY2OAfn/A3a0jIYYDcMjhA==,type:str]
pgp: []
encrypted_suffix: Templates
version: 3.8.1
Comme on peut le voir le contenu du fichier de secret est chiffré :
PG_PASSWORD: ENC[AES256_GCM,data:3R8RJzIGf549Q0EUPhg/,iv:4O2i99sb13Dynv20G/SVxJBTZ9HoSPbkLQp1XMxP2Vc=,tag:Wbu4+jESe+lZ+L5VN3OhWQ==,type:str]
PG_ROOT_PASSWORD: ENC[AES256_GCM,data:/JGwlXwWiMF3eFY8InBF,iv:yh9e6uQAikBm+Xs0gleyxSZZ+Oi+v/8ax1J+T51MRnU=,tag:8TFLJyiQH7+0yP/m/hzIUg==,type:str]
Le fichier secret.yaml ne doit pas être commité / push sur le repo git alors que le fichier secret.enc.yaml peut l'être.
Créer un fichier secret.enc.yaml dans le répertoire templates du repo d'infra et copier / coller le contenu du fichier que vous avez créé en local puis redéployez, puis depuis ArgoCD faite un refresh / sync afin d'actualiser le contenu des éléments déployés. Vous devriez voir l'objet SopsSecret de créé et un objet Secret associé. Vous pouvez consulter le contenu du secret depuis ArgoCD en cliquant sur l'objet secret vous devriez voir le contenu suivant :
apiVersion: v1
data:
PG_PASSWORD: ++++++++
PG_ROOT_PASSWORD: ++++++++
kind: Secret
metadata:
creationTimestamp: '2025-01-27T15:20:15Z'
name: pg-secret-sops
namespace: bmgxew1qioi64pw69t3uzmefy--eckznliru9ii2xkqnlwa7lbu0
ownerReferences:
- apiVersion: isindir.github.com/v1alpha3
blockOwnerDeletion: true
controller: true
kind: SopsSecret
name: tuto-sops-secret
uid: 07f6095c-9e2a-4540-9ecc-046908b58827
resourceVersion: '298243071'
uid: ace1ca76-f82f-4c5c-8e04-db79760da941
type: Opaque
Les valeurs du secret ne sont pas directement accessibles et sont remplacés par des caractères '+'.
Afin de ne pas entrer en collision avec l'objet Secret pg-secret déjà existant, le nom du secret que nous avons créé est pg-secret-sops et 2 secrets sont maintenant présents sur le projet :
- pg-secret : le premier secret qui est commité en base64
- pg-secret-sops : le secret chiffré via SOPS
Afin d'utiliser le secret pg-secret-sops plutot que pg-secret, depuis Gitlab modifiez le fichier deployment.yaml pour changer le nom du secret de pg-secret à pg-secret-sops :
- name: SPRING_DATASOURCE_PASSWORD
valueFrom:
secretKeyRef:
name: pg-secret-sops
key: PG_PASSWORD
De même le secret pg-secret est référencé par postgres dans le fichier values.yaml du chart helm :
[...]
global:
postgresql:
auth:
existingSecret: pg-secret
[...]
Il convient de modifier cette valeur par pg-secret-sops ou de surcharger la clé global.postgresql.auth.existingSecret dans le fichier values-tuto.yaml
Depuis ArgoCD faite un refresh / sync afin d'actualiser le contenu des éléments déployés, vous devriez voir le POD applicatif être supprimé puis recréé pour utiliser le bon secret.
Vous pouvez maintenant supprimer le fichier secret.yaml du repo gitlab puis commit / push pour ne laisser que le fichier secret.enc.yaml car il n'est plus référencé. Sous argoCD refaite un refresh / sync pour vérifier que l'objet secret pg-secret a bien été supprimé et que le projet continue de fonctionner.
Bravo ! Vous savez maintenant comment gérer les secrets via SOPS dans CPiN !
Ceci est la fin du tutoriel de déploiement.