En production¶
Distributions¶
Les distributions suivantes sont disponibles pour administrer un cluster k8s de manière sécurisée :
- Bare metal :
- kubeadm
- Red Hat OpenShift (OKD)
- Cloud :
- OpenStack Magnum
- Terraform/OpenTofu
ArgoCD¶
Pour déployer sur un cluster k8s une application web versionnée sur GitLab (avec un artefact de type manifest, charts Helm ou des fichiers Kustomize), il est nécessaire d'utiliser un outil intermédiaire de déploiements de type Gitops. Les solutions les plus courantes sont : FluxCD, Argo CD, Jenkins X, etc. Nous utiliserons Argo CD par la suite.
Installation¶
Serveur¶
Nous allons utiliser notre cluster k8s pour déployer le service Argo CD dans un espace de nom autre que tuto
:
k create namespace argocd &&\
k apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Cela crée de nombreuses ressources :
- API Server (
pod/argcocd-server
): controls the whole Argo CD instance, all its operations, authentification, and secrets access which are stored as k8s Secrets, etc - Repository Server (
pod/argocd-repo-server
): stores and synchronizes data from configured Git-repositories and generates k8s manifests - Application Controller (
pod/argocd-application-controller
): monitores applications in a k8s cluster to make them the same as they are described in a repository, and controls PreSync, Sync, PostSync hooks
k get all -n argocd
NAME READY STATUS RESTARTS AGE
pod/argocd-application-controller-0 1/1 Running 0 42h
pod/argocd-applicationset-controller-9cbb56dff-mqmxw 1/1 Running 0 42h
pod/argocd-dex-server-74d5d76d7-4lgwc 1/1 Running 0 42h
pod/argocd-notifications-controller-68459f6cbb-jfsr9 1/1 Running 0 42h
pod/argocd-redis-794f68fb68-vv8ch 1/1 Running 0 42h
pod/argocd-repo-server-864476c5cf-n2vdn 1/1 Running 0 42h
pod/argocd-server-6496dc8859-n89nb 1/1 Running 0 42h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/argocd-applicationset-controller ClusterIP 10.43.194.160 <none> 7000/TCP,8080/TCP 42h
service/argocd-dex-server ClusterIP 10.43.90.233 <none> 5556/TCP,5557/TCP,5558/TCP 42h
service/argocd-metrics ClusterIP 10.43.94.18 <none> 8082/TCP 42h
service/argocd-notifications-controller-metrics ClusterIP 10.43.214.102 <none> 9001/TCP 42h
service/argocd-redis ClusterIP 10.43.204.43 <none> 6379/TCP 42h
service/argocd-repo-server ClusterIP 10.43.16.183 <none> 8081/TCP,8084/TCP 42h
service/argocd-server ClusterIP 10.43.21.10 <none> 80/TCP,443/TCP 42h
service/argocd-server-metrics ClusterIP 10.43.216.223 <none> 8083/TCP 42h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/argocd-applicationset-controller 1/1 1 1 42h
deployment.apps/argocd-dex-server 1/1 1 1 42h
deployment.apps/argocd-notifications-controller 1/1 1 1 42h
deployment.apps/argocd-redis 1/1 1 1 42h
deployment.apps/argocd-repo-server 1/1 1 1 42h
deployment.apps/argocd-server 1/1 1 1 42h
NAME DESIRED CURRENT READY AGE
replicaset.apps/argocd-applicationset-controller-9cbb56dff 1 1 1 42h
replicaset.apps/argocd-dex-server-74d5d76d7 1 1 1 42h
replicaset.apps/argocd-notifications-controller-68459f6cbb 1 1 1 42h
replicaset.apps/argocd-redis-794f68fb68 1 1 1 42h
replicaset.apps/argocd-repo-server-864476c5cf 1 1 1 42h
replicaset.apps/argocd-server-6496dc8859 1 1 1 42h
NAME READY AGE
statefulset.apps/argocd-application-controller 1/1 42h
Nous allons utiliser le port-forwarding pour accéder à l'interface web mais il est aussi possible d'utiliser Ingress.
CLI¶
Pour d'autres méthodes d'installation de la CLI, voir la documentation.
Il reste à récupérer le mot de passe de l'admin :
Si vous souhaitez le changer :
Pour se connecter à l'interface via la CLI :
Ou via l'interface Web (self-signed certificate not trusted) :
Note
Si le cluster k8s n'est pas un cluster interne et que le certificat n'a pas été changé lors de l'installation, il faut utliser l'option --insecure
avec la CLI.
Nous pouvons vérifier que notre cluster k8s est bien enregistré auprès d'Argo CD :
argocd cluster list
SERVER NAME VERSION STATUS MESSAGE PROJECT
https://kubernetes.default.svc in-cluster 1.31 Successful
Note
Lors d'un déploiement interne (sur le même cluster qu'Argo CD), https://kubernetes.default.svc
doit être utilisé comme adresse du serveur de l'API de k8s.
Déploiement des charts¶
Nous allons tester notre service Argo CD avec des charts fournies par le projet :
argocd app create helm-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path helm-guestbook --dest-server https://kubernetes.default.svc --dest-namespace tuto &&\
argocd app list
NAME READY STATUS RESTARTS AGE
pod/helm-guestbook-7ddc9896c4-sdbqf 1/1 Running 0 4m20s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/helm-guestbook ClusterIP 10.43.81.134 <none> 80/TCP 4m20s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/helm-guestbook 1/1 1 1 4m20s
NAME DESIRED CURRENT READY AGE
replicaset.apps/helm-guestbook-7ddc9896c4 1 1 1 4m20s
Comme précédemment, vous pouvez forwarder le port de l'application guestbook.
Nous pouvons à présent déployer notre application. Il faut d'abord enregistrer le repository que nous allons utiliser (tp-kubernetes-si
) sur lequel sont disponibles les charts que nous souhaitons déployer :
argocd repo add https://gitlab.in2p3.fr/si-apc/tp-kubernetes-si.git --name tuto-k8s &&\
argocd repo list
Pour créer le déploiement :
argocd app create jupwebapp --repo tuto-k8s --path files/charts/step0/jupyter-chart --dest-server https://kubernetes.default.svc --dest-namespace tuto &&\
argocd app list
Nous pouvons vérifier le status de l'application :
Nous devrions rencontrer le message OutOfSync
qui est dû à la Sync Policy: Manual
. Il suffit de lancer la synchronisation avec :
Et sur l'interface Web, nous avons à présent le workflow de déploiement.
Update du déploiment¶
Pour tester la gestion des mises à jour du déploiement, il faut pour cela forker le projet tp-kubernetes-si
, l'enregistrer de nouveau dans Argo CD et faire un commit sur un des chart Helm.
Autres méthodes de déploiement¶
Utilisation de k8s dans une CI¶
Si l'instance GitLab est configurée pour fournir des runners qui sont gérés par k8s, il est possible de déployer un artefact de type image de conteneur directement sur k8s :