Aller au contenu

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.

k port-forward svc/argocd-server -n argocd 8080:443

CLI

Pour d'autres méthodes d'installation de la CLI, voir la documentation.

brew install argocd

Il reste à récupérer le mot de passe de l'admin :

argocd admin initial-password -n argocd

Si vous souhaitez le changer :

argocd account update-password

Pour se connecter à l'interface via la CLI :

argocd login 127.0.0.1:8080

Ou via l'interface Web (self-signed certificate not trusted) :

open https://127.0.0.1:8080

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 :

argocd app get jupwebapp

Nous devrions rencontrer le message OutOfSync qui est dû à la Sync Policy: Manual. Il suffit de lancer la synchronisation avec :

argocd app sync jupwebapp && argocd app get jupwebapp

Et sur l'interface Web, nous avons à présent le workflow de déploiement.

argocd_jupyter

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 :

deploy:
  stage: deploy
  script:
    - kubectl apply -f k8s/deployment.yaml