Skip to content

Installation d'un Cluster Kubernetes SingleNode - avec Muppy Tasks

Ce document décrit comment configurer un Cluster SingleNode sécurisé géré avec Muppy Pack8s (HA Multi Cloud).

Un cluster single node est un cluster k8s qui ne contient qu'une seul noeud sur lequel tournent:

  • le Control Plane
  • Kubelet (worker)
  • PostgreSQL (cf. options)

Info

Il y a trois options pour PostreSQL:

  • Ne pas l'installer
  • l'installer sur le Node
  • l'installer sur un host distinct.

Stratégies de sécurité

2 stratégies de sécurité des Clusters Kubernetes sont gérées par Muppy actuellement:

  • Private
  • Public (Mode WAF ou Whitelist)

Private

Dans ce mode, tout est publié sur l'IP Privée (Tailscale) et le firewall est configurée pour ne laisser passer que les flux administratifs.

Cette stratégie est bien adaptée aux serveurs de developpement ou contenant des informations sensibles. Mais ils sont complètement isolés.

Dans cette confguration, aucun service n'est configuré sur l'IP Public.

Public

Dans ce mode, chaque Service peut être publié sur l'interface Public ou Private.

Pour cela, Muppy installe un Router TCP (Level 4) qui redirige le traffic TCP de l'IP Public vers l'IP Privée.

En complément, les Services publiés sur l'interface Public peuvent être filtrés en utilisant:

  • ipWhiteListing ; l'accès est réservé à une liste d'address IP qui peut être mise à jour dynamiquement (CIDR Dynamic Range)
  • TocToc ; l'accès est géré par Muppy TocToc qui permet de gérer les accès par email ou autres moyens.
  • HTTP Basic Auth ; permet d'ajouter une protection rudimentaire par user et mot de passe (A éviter absolument).

Ces 3 systèmes de filtrage sont adaptés aux sites réservés à un usage interne, mais ils sont inutiles pour un site Public.

Warning

Pour maximiser la sécurité, les packages d'infrastructure déployés par Muppy, sont toujours déployés sur l'IP Private et filtrés par IP Whitelisting.

Sites internet Public

Pour les sites complètement Public, Muppy permet de filtrer toutes les requêtes avec OWASP ModSecurity Core Rule Set.

Danger

Si votre site Public est ouvert à une volume important, nous vous conseillons de déployer un niveau de filtrage / sécurité supplémentaire.

Conclusion

Avant de lancer l'installation, vous devez avoir:

  • Sélectionné une stratégie de sécurité: private ou public
  • [Option] Défini une liste d'IP Fixes autorisées à accéder aux services publiés par le cluster

Prérequis

  1. Le Host doit disposer d'au moins une interface Private.

  2. Vous avez défini la stratégie de sécurité à appliquer au Cluster parmis les options suivantes:

    • IP Publique + Mesh VPN (Tailscale, Nebula, Wireguard,...)
    • IP Publique + IP Private
    • IP Private
  3. Vous avez créer un CIDR Dynamic Range qui contient au minimum l'IP Public du Host. Ceci est obligtoire car Muppy va protéger les Dashboards en les publiant sur le réseau Private et en les "whitelistant" avec le contenu de ce CIDR Dynamic Range.
    Vous devez ajouter l'IP public du Host pour laisser passer le traffic Tailscale.

  4. Si le cluster est accessible publiquement, vous devez autoriser le traffic entrant sur le(s) port(s) 443 (et 80).
    Pour cela, utilisez l'onglet UFW de l'objet Host de Muppy.

Warning

Pour l'instant seul l'option IP Publique + Tailscale rentre dans le cadre du support.

Workflow d'installation

Les étapes d'installation sont les suivantes:

  • Provisionner un Host avec Ubuntu 20.04 et enrollez le dans Muppy.
  • Installer Tailscale (Task tailscale:tailscale_install)
  • Installer microk8s (Task: k8s_cluster:install_single_node_microk8s)
  • Installer PostgreSQL
  • Installer les packages d'infrastructure (Task: k8s_cluster:install_single_node_infra_packages)

Tailscale

microk8s

Créez un Task Run avec la Task install_single_node_microk8s et complétez les paramètres:

  • k8s_private_ip
  • k8s_public_ip
  • system_resources_reservation

Appuyez vous sur l'aide associée aux paramètres (et signalez nous quand le help est merdique).

system_resources_reservation

C'est le paramètre le pius compliqué !

Un cluster SingleNode héberge tous les services dans une seule machine. Le cluster K8s et la base de données notamment sont en compétition pour l'utilisation des ressources (ram, cpu, disque).

Ce paramètre system_resources_reservation permet de restreindre les ressources allouées aux cluster en spécifiant les ressources réservées au système. Kubernetes se débrouillera pour laisser au système les ressources que vous allez définir.

Le paramètre est un objet JSON composé des clefs suivantes (optionnelles):

{
  "cpu": "2", // (or "200m") cores reserved for system and non k8s daemons
  "memory": "56G", // (or 1500M) size of RAM reserved for system and non k8s daemons
  "ephemeral-storage": "200G", // disk space reserved for system and non k8s daemons
  "pid": "2000" // number of pid reserved for system and non k8s daemons
}

Un peu de doc si vous voulez creuser le sujet: Doc Kubernetes

Danger

Sur un serveur de Production, vous devez définir des valeurs pour system_resources_reservation.

Tip

Sur un serveur de Test ou Dev, vous pouvez ignorer ces valeurs, mais le mieux est quand meme de réserver quelques ressources pour garder un SSH fonctionnel au cas où.

A la fin du Task Run, vous récupérez un K8s Cluster avec le même Qualifier que le Host sur lequel il est installé.

PostgreSQL

Si vous souhaitez utiliser PostgreSQL, installez le maintenant.

L'installation se fait en suivant la doc Muppy (https://docs.muppy.io).

La seule particularité tient à la configuration de UFW, il faut:

  • Autoriser le traffic provenant du réseau privée ou du cluster si PostgreSQL est sur un serveur dédié
  • Autoriser le traffic provenant des Pods si la base de données est sur le worker kubernetes.

Info

Pour récupérer le CIDR des Pods, utilisez la commande suivante sur node sudo grep -R 'cluster-cidr=' /var/snap/microk8s/current/args/. Sauf modification, le CIDR des Pods est 10.1.0.0/16 sur microk8S (default Calico Pods Range) et 10.244.0.0/24 sur K0s

  • Autoriser le trafdic provenant d'un éventuel Replica

Packages d'Infrastructure

Créez un Task Run avec la Task install_single_node_infra_packages et complétez les paramètres:

  • k8s_cluster_obj
  • k8s_private_cidr_obj
  • k8s_public_cidr_obj
  • acme_registration_email
  • default_dns_domain_id
  • cluster_security_mode
  • allowed_cidr_dynamic_range_run_obj
  • ...
  • http_basic_auth_vault_obj

Please check Param. Description of these params for help.

References information

  • https://microk8s.io/docs/configure-host-interfaces