Créer une usine à clusters kubernetes - partie 3

thumbernail kubernetes

1. principe

Partie 3 - Nous allons aborder dans ce billet le déploiement d'applications, manifestes, etc globalement sur les clusters que nous avons déployés avec notre usine. Nous allons utiliser pour cela non pas ArgoCD mais Projectsveltos. Comme ca on fourni une infrastructure de middleware gérées de manière centralisée.

Le projet Projectsveltos est un projet open source qui simplifie le déploiement et la gestion des add-ons et des applications Kubernetes sur plusieurs clusters. Il fonctionne dans le cluster de gestion et peut déployer et gérer de manière programmatique des add-ons et des applications sur n'importe quel cluster de la flotte, y compris le cluster de gestion lui-même. Sveltos prend en charge une variété de formats d'add-ons, notamment les charts Helm, le YAML brut, Kustomize, Carvel ytt, Ksonnet et Jsonnet.

Les principales fonctionnalités de Projectsveltos sont les suivantes :

Déploiement automatisé : Projectsveltos peut déployer des add-ons et des applications sur plusieurs clusters en une seule commande. Gestion centralisée : Projectsveltos peut être utilisé pour gérer les add-ons et les applications sur plusieurs clusters à partir d'un seul point de contrôle. Support multi-tenant : Projectsveltos prend en charge la gestion de plusieurs add-ons et applications pour différents tenants. Projectsveltos est un outil puissant qui peut aider les organisations à simplifier et à automatiser le déploiement et la gestion des add-ons et des applications Kubernetes sur plusieurs clusters.

Projectsveltos est encore en développement, mais il a déjà été adopté par de nombreuses organisations, notamment Google, Red Hat et IBM.

Une fois déployé on peut enregistrer des cluster kubernetes dans ProjectSveltos

Une des fonctionnalités qu'on va utiliser dans notre usine à cluster est la capacité de projectsveltos a découvrir automatiquement les clusters créés par la cluster-api.

Sveltos est fourni avec une prise en charge pour découvrir automatiquement les clusters alimentés par ClusterAPI. Si Sveltos est déployé dans un cluster de gestion avec ClusterAPI (CAPI), aucune action supplémentaire n'est requise pour que Sveltos gère les add-ons sur les clusters alimentés par CAPI. Sveltos surveillera les instances "clusters.cluster.x-k8s.io" et les configurera en conséquence.

2. Installation de ProjectSveltos

2.1. Via Helm

  • Vous pouvez l'installer en ligne de commande via helm.
helm repo add projectsveltos https://projectsveltos.github.io/helm-charts
helm install projectsveltos projectsveltos/projectsveltos -n projectsveltos --create-namespace

2.1. Via argoCD

  • Créez dans le répertoire argocd/applications l'application projectsveltos

Nous allons utiliser la possibilité d'avoir plusieurs sources pour combiner tous les manifestes Sveltos (Déploiement et CR)

cat << EOF > projectsveltos-application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: projectsveltos
  namespace: argocd
spec:
  destination:
    name: 'projectsveltos'
    namespace: projectsveltos
    server: 'https://kubernetes.default.svc'
  sources:
    - repoURL: 'https://projectsveltos.github.io/helm-charts'
      path: ''
      targetRevision: 0.20.2
    - repoURL: 'https://github.com/herveleclerc/usine-k8s.git'
      path: projectsveltos
      targetRevision:  HEAD
  project: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
EOF
  • Modifiez le fichier kustomization.yaml en ajoutant la ressource projectsveltos-application.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- usine-k8s-root-application.yaml
- projectsveltos-application.yaml

Mettez à jour votre repo git et regarder la magie d'opérer ;)

Sur votre cluster kubernetes de management regarder les pods déployés dans le namespace projectsveltos

 k get po -n projectsveltos
NAME                                        READY   STATUS    RESTARTS      AGE
access-manager-6d659d4f55-rfxx8             2/2     Running   1 (49m ago)   61m
addon-compliance-manager-5ff86466bf-jp2ch   2/2     Running   0             61m
addon-controller-545f756945-ccdzl           2/2     Running   1 (51m ago)   61m
classifier-manager-8c64b8454-lrgrm          2/2     Running   0             61m
event-manager-747758c768-dtn64              2/2     Running   0             61m
hc-manager-667bf4865f-qcn4f                 2/2     Running   0             61m
sc-manager-685c486b94-sn4n2                 2/2     Running   0             61m
shard-controller-66f9556f59-rlw58           2/2     Running   0             61m

3. Patch des custom ressource clusters

  • Nous devons mettre des labels dans les custom resources de type clusters pour qu'on puisse déployer via sveltos des resources.
  • Nous devons rajouter un SAN supplémentaire au vcluster pour que sveltos puisse correctement piloter le cluster, sans quoi nous aurions une erreur de certificat x509.

3.1 Ajout du label

Je vais le mettre en dur dans les manifestes du chart la bonne pratique serait de le paramétrer avec une variable

  • Editez le fichier chart/templates/cluster.yaml
apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
  name: {{ .Values.cluster_name }}
  labels:
    env: sveltos-managed # <---- Ici
spec:
  controlPlaneRef:
    apiVersion: infrastructure.cluster.x-k8s.io/v1alpha1
    kind: VCluster
    name: {{ .Values.cluster_name }}
  infrastructureRef:
    apiVersion: infrastructure.cluster.x-k8s.io/v1alpha1
    kind: VCluster
    name: {{ .Values.cluster_name }}
  • Editez le fichier chart/templates/vcluster.yaml
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha1
kind: VCluster
metadata:
  name: {{ .Values.cluster_name }}
spec:
  controlPlaneEndpoint:
    host: ""
    port: 0
  helmRelease:
    chart:
      name: vcluster-k8s
      repo: https://charts.loft.sh
      version: 0.13.0
    values: |
      syncer:
        extraArgs:
          - --tls-san={{ .Values.cluster_fqdn }}
          - --tls-san={{ .Values.cluster_name }}.{{ .Values.cluster_name }}.svc # <------ ICI
          - --out-kube-config-server=https://{{ .Values.cluster_fqdn }}
      ingress:
        enabled: true
        pathType: ImplementationSpecific
        ingressClassName: nginx
        host: {{ .Values.cluster_fqdn }}
        annotations:
          nginx.ingress.kubernetes.io/backend-protocol: HTTPS
          nginx.ingress.kubernetes.io/ssl-passthrough: 'true'
          nginx.ingress.kubernetes.io/ssl-redirect: 'true'
          cert-manager.io/cluster-issuer: letsencrypt
  kubernetesVersion: {{ .Values.k8s_version }}
  • Valider et pousser vos modifications.
  • Validez que vous avez bien ces modifications propagées.

4. Déploiement d'un chart Helm de manière centralisée

Prenons l'exemple de la documentation: Déployons un kyverno pour gérer de la compliance dans les clusters déployés.

Pour cela nous allons créer une Custom resource "CR" du type ClusterProfile

cat << EOF > kyverno-clusterprofile.yaml
apiVersion: config.projectsveltos.io/v1alpha1
kind: ClusterProfile
metadata:
  name: kyverno
spec:
  clusterSelector: env=sveltos-managed
  helmCharts:
  - repositoryURL:    https://kyverno.github.io/kyverno/
    repositoryName:   kyverno
    chartName:        kyverno/kyverno
    chartVersion:     v3.0.1
    releaseName:      kyverno-latest
    releaseNamespace: kyverno
    helmChartAction:  Install

Cette ressource va déployer le chart Kyverno en version 3.0.1 sur tous les clusters suivis si ils ont le label "env: sveltos-managed"

  • Mettez ce fichier dans le répertoire argocd/applications

  • Modifiez/Créer le fichier kustomization.yaml en ajoutant la ressource kyverno-clusterprofile.yaml dans le répertoire projectsveltos

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- kyverno-clusterprofile.yaml

Mettez à jour votre repo git et regarder la magie d'opérer pour la deuxième fois;)

5. Utilisation de sveltosctl

Sveltosctl est un outil en ligne de commande (CLI) qui permet de visualiser les ressources Kubernetes déployées par Sveltos, un contrôleur d'add-ons Kubernetes. Sveltosctl peut également être utilisé pour collecter des informations de support technique sur les clusters Kubernetes gérés par Sveltos.

Voici quelques-unes des fonctionnalités de sveltosctl :

  • Visualisation des add-ons Kubernetes déployés par Sveltos
  • Visualisation des ressources dans les clusters Kubernetes gérés
  • Visualisation de l'utilisation de Sveltos
  • Affichage des permissions administratives pour les clusters multi-locataires
  • Configuration des niveaux de sévérité des journaux
  • Affichage du résultat du profil de cluster en mode DryRun
  • Collecte d'informations de support technique

Dans notre cas

 sveltosctl show usage
+----------------+--------------------+---------------+---------------------------+
| RESOURCE KIND  | RESOURCE NAMESPACE | RESOURCE NAME |         CLUSTERS          |
+----------------+--------------------+---------------+---------------------------+
| ClusterProfile |                    | kyverno       | cluster-dev0/cluster-dev0 |
|                |                    |               | cluster-dev1/cluster-dev1 |
+----------------+--------------------+---------------+---------------------------+


❯ sveltosctl show addons
+---------------------------+---------------+-----------+----------------+---------+-------------------------------+------------------+
|          CLUSTER          | RESOURCE TYPE | NAMESPACE |      NAME      | VERSION |             TIME              | CLUSTER PROFILES |
+---------------------------+---------------+-----------+----------------+---------+-------------------------------+------------------+
| cluster-dev0/cluster-dev0 | helm chart    | kyverno   | kyverno-latest | 3.0.1   | 2023-12-05 21:17:14 +0100 CET | kyverno          |
| cluster-dev1/cluster-dev1 | helm chart    | kyverno   | kyverno-latest | 3.0.1   | 2023-12-05 21:18:24 +0100 CET | kyverno          |
+---------------------------+---------------+-----------+----------------+---------+-------------------------------+------------------+

Sveltos a bien déployé kyverno sur l'ensemble des cluster ayant le label env: sveltos-managed

Maintenant vous avez toutes les clés pour Administrer de manière centralisée une flotte de cluster kubernetes, virtuels ou non :)

Découvrez les technologies d'alter way