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