Skip to content

Installation manuelle d'un Cluster Kubernetes Single Node géré avec Muppy

Ce document décrit comment configurer un Cluster K0s single node 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.

Prérequis

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

Les options suivantes sont possible:

  • IP Publique + Mesh VPN (Tailscale, Nebula, Wireguard,...)
  • IP Publique + IP Privé
  • IP Private + SSH Gateway

Dans la suite de cette documentation, nous utiliserons NODE_PRIVATE_IP pour désigner l' IP privée du host.

Provisionnez un host avec une IP Privée ou installez un mesh VPN, notez la valeur de NODE_PRIVATE_IP et enrollez le dans Muppy.

Installez microk8s

sudo snap info microk8s

# Attention modif à faire sur le Firewall avant d'installer microk8s
sudo ufw default allow routed

sudo apt install -y snapd 

# On n'applique pas encore les règle suivantes
# sudo ufw allow in on cni0 && sudo ufw allow out on cni0
# sudo ufw default allow routed

sudo snap install microk8s --classic --channel=1.28/stable \
&& sudo usermod -a -G microk8s $USER \
&& newgrp microk8s

microk8s status --wait-ready

microk8s kubectl get -A all
microk8s status
microk8s inspect

Reconfiguration des interfaces utilisées par k8s

# stopper microk8s
sudo microk8s stop

kube-proxy

The Kubernetes network proxy runs on each node. This reflects services as defined in the Kubernetes API on each node and can do simple TCP, UDP, and SCTP stream forwarding or round robin TCP, UDP, and SCTP forwarding across a set of backends.

On force k8s à publier les Nodeports sur l'interface interne.

export MPY_K8S_NODE_PRIVATE_IP=10.0.4.1
sudo grep -q '^--nodeport-addresses=' /var/snap/microk8s/current/args/kube-proxy && sudo -E sed -i "s/^--nodeport-addresses=.*/--nodeport-addresses=${MPY_K8S_NODE_PRIVATE_IP}\/32/" /var/snap/microk8s/current/args/kube-proxy || echo "--nodeport-addresses=${MPY_K8S_NODE_PRIVATE_IP}/32" | sudo tee -a /var/snap/microk8s/current/args/kube-proxy
# cat /var/snap/microk8s/current/args/kube-proxy

kubelet

The kubelet is the primary "node agent" that runs on each node. It can register the node with the apiserver using one of: the hostname; a flag to override the hostname; or specific logic for a cloud provider.

On force l'ip du node

sudo grep -q '^--node-ip=' /var/snap/microk8s/current/args/kubelet && sudo -E sed -i "s/^--node-ip=.*/--node-ip=${MPY_K8S_NODE_PRIVATE_IP}/" /var/snap/microk8s/current/args/kubelet || echo "--node-ip=${MPY_K8S_NODE_PRIVATE_IP}" | sudo tee -a /var/snap/microk8s/current/args/kubelet
# cat /var/snap/microk8s/current/args/kubelet

kube-apiserver

The Kubernetes API server validates and configures data for the api objects which include pods, services, replicationcontrollers, and others. The API Server services REST operations and provides the frontend to the cluster's shared state through which all other components interact.

On advertise les services sur l'IP privée.

sudo grep -q '^--advertise-address=' /var/snap/microk8s/current/args/kube-apiserver && sudo -E sed -i "s/^--advertise-address=.*/--advertise-address=${MPY_K8S_NODE_PRIVATE_IP}/" /var/snap/microk8s/current/args/kube-apiserver || echo "--advertise-address=${MPY_K8S_NODE_PRIVATE_IP}" | sudo tee -a /var/snap/microk8s/current/args/kube-apiserver
# cat /var/snap/microk8s/current/args/kube-apiserver
# Re-démarrer le host
sudo reboot
microk8s start
microk8s status
microk8s kubectl get -A all
microk8s kubectl get nodes -o wide  # check node Internal IP is private

# Generer un Kubeconfig
microk8s config > $HOSTNAME-kubeconfig.yaml

Activation hostpath-storage

Si vous avez besoin de PersistentVolume, vous deviez installer hostpath-storage.

Ref: https://microk8s.io/docs/addon-hostpath-storage

microk8s enable hostpath-storage

Enregistrement du cluster k8s dans Muppy

  • Utilisez Muppy / K8s / K8s Clusters pour créer un Cluster.
  • Uploadez le fichier de config via le champ Kubeconfig ou copiez/coller le contenu dans les champs "Kubeconfig" et "Kubeconfig" filename.
  • Renseignez les champs Qualifier et Provider

Cliquez sur "Update Info". Si les Namespaces sont bien récupérés, le cluster est prêt pour être utilisé avec Muppy.

Installation PostgreSQL

L'installation se fait en suivant la doc Muppy.

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

Conclusion

Kubernetes est installé, la prochaine étape est l'installation des Packages d'Infrastructure qui est documentée içi: Packages Infrastructure

Veuillez noter les spécificités suivantes des clusters Kubernetes SingleNode:

  • Cert-Manager est déployé dans le cluster
  • Traefik est configuré en Ingress et connecté à un second Traefik qui fait office de LoadBalancer.
  • Les Certificats peuvent être vérifiés en HTTP ou en DNS.

Utiliser le logging UFW

sudo ufw logging on
sudo tail -f /var/log/ufw.log
sudo ufw logging off