garutilorenzo.ansible-role-linux-kubernetes

Installer et configurer un cluster Kubernetes hautement disponible

Ce rôle Ansible va installer et configurer un cluster Kubernetes hautement disponible. Ce dépôt automatise le processus d'installation de Kubernetes en utilisant kubeadm.

Ce dépôt est seulement un exemple de la façon d'utiliser l'automatisation Ansible pour installer et configurer un cluster Kubernetes. Pour un environnement de production, utilisez Kubespray.

Exigences

Installez ansible, ipaddr et netaddr :

pip install -r requirements.txt

Téléchargez le rôle depuis GitHub :

ansible-galaxy install git+https://github.com/garutilorenzo/ansible-role-linux-kubernetes.git

Variables du rôle

Ce rôle accepte ces variables :

Var Obligatoire Par défaut Description
kubernetes_subnet oui 192.168.25.0/24 Sous-réseau où Kubernetes sera déployé. Si la VM ou le serveur physique a plus d'une interface, Ansible filtrera l'interface utilisée par Kubernetes en fonction du sous-réseau de l'interface.
disable_firewall non non Si activé, Ansible désactivera le pare-feu.
kubernetes_version non 1.25.0 Version de Kubernetes à installer
kubernetes_cri non containerd CRI de Kubernetes à installer.
kubernetes_cni non flannel CNI de Kubernetes à installer.
kubernetes_dns_domain non cluster.local Domaine DNS par défaut de Kubernetes
kubernetes_pod_subnet non 10.244.0.0/16 Sous-réseau des pods Kubernetes
kubernetes_service_subnet non 10.96.0.0/12 Sous-réseau des services Kubernetes
kubernetes_api_port non 6443 Port d'écoute kubeapi
setup_vip non non Configurer une adresse VIP Kubernetes en utilisant kube-vip
kubernetes_vip_ip non 192.168.25.225 Obligatoire si setup_vip est réglé sur oui. Adresse IP VIP pour le plan de contrôle
kubevip_version non v0.4.3 Version du conteneur kube-vip
install_longhorn non non Installer Longhorn, solution de stockage distribué cloud native pour Kubernetes.
longhorn_version non v1.3.1 Version de Longhorn.
install_nginx_ingress non non Installer le contrôleur d'entrée Nginx
nginx_ingress_controller_version non controller-v1.3.0 Version du contrôleur d'entrée Nginx
nginx_ingress_controller_http_nodeport non 30080 NodePort utilisé par le contrôleur d'entrée Nginx pour le trafic HTTP entrant
nginx_ingress_controller_https_nodeport non 30443 NodePort utilisé par le contrôleur d'entrée Nginx pour le trafic HTTPS entrant
enable_nginx_ingress_proxy_protocol non non Activer le mode proxy protocol du contrôleur d'entrée Nginx
enable_nginx_real_ip non non Activer le module real-ip du contrôleur d'entrée Nginx
nginx_ingress_real_ip_cidr non 0.0.0.0/0 Obligatoire si enable_nginx_real_ip est réglé sur oui. Sous-réseau de confiance à utiliser avec le module real-ip
nginx_ingress_proxy_body_size non 20m Taille maximale du corps de proxy pour le contrôleur d'entrée Nginx
sans_base non [liste des valeurs, voir defaults/main.yml] Liste d'adresses IP ou FQDN utilisés pour signer le certificat kube-api

Variables supplémentaires

Ce rôle accepte une variable supplémentaire kubernetes_init_host. Cette variable est utilisée lors du premier démarrage du cluster. La valeur de cette variable doit être le nom d'hôte de l'un des nœuds maîtres. Lorsque l'Ansible s'exécute sur l'hôte correspondant, Kubernetes sera initialisé.

Ressources du cluster déployées

Avec ce rôle, le contrôleur d'entrée Nginx et Longhorn seront installés.

Contôleur d'entrée Nginx

Le contrôleur d'entrée Nginx est utilisé comme contrôleur d'entrée.

L'installation est celle des clusters bare metal, le contrôleur d'entrée est ensuite exposé via un service NodePort. Vous pouvez personnaliser les ports exposés par le service NodePort, utilisez les Variables du Rôle pour modifier ces valeurs.

Longhorn

Longhorn est un système de stockage distribué léger, fiable et puissant pour Kubernetes.

Longhorn met en œuvre le stockage distribué à l'aide de conteneurs et de microservices. Longhorn crée un contrôleur de stockage dédié pour chaque volume de périphérique de bloc et réplique de manière synchrone le volume sur plusieurs répliques stockées sur plusieurs nœuds. Le contrôleur de stockage et les répliques sont eux-mêmes orchestrés à l'aide de Kubernetes.

Vagrant

Pour tester ce rôle, vous pouvez utiliser Vagrant et Virtualbox pour créer une infrastructure exemple. Une fois que vous avez téléchargé ce dépôt, utilisez Vagrant pour démarrer les machines virtuelles :

vagrant up

Dans le Vagrantfile, vous pouvez injecter votre clé SSH publique directement dans les authorized_keys de l'utilisateur vagrant. Vous devez remplacer le placeholder CHANGE_ME dans le Vagrantfile. Vous pouvez également ajuster le nombre des VM déployées en modifiant la variable NNODES (Par défaut : 6).

Utiliser ce rôle

Pour utiliser ce rôle, suivez l'exemple dans le répertoire examples/. Ajustez le fichier hosts.ini avec vos hôtes et exécutez le playbook :

lorenzo@mint-virtual:~$ ansible-playbook -i hosts-ubuntu.ini site.yml -e kubernetes_init_host=k8s-ubuntu-0
PLAY [kubemaster] ***************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************
ok: [k8s-ubuntu-2]
ok: [k8s-ubuntu-1]
ok: [k8s-ubuntu-0]

...

PLAY RECAP **********************************************************************************************************************************************************
k8s-ubuntu-0               : ok=78   changed=24   unreachable=0    failed=0    skipped=25   rescued=0    ignored=0   
k8s-ubuntu-1               : ok=52   changed=12   unreachable=0    failed=0    skipped=30   rescued=0    ignored=1   
k8s-ubuntu-2               : ok=52   changed=12   unreachable=0    failed=0    skipped=30   rescued=0    ignored=1
k8s-ubuntu-3               : ok=58   changed=30   unreachable=0    failed=0    skipped=35   rescued=0    ignored=1   
k8s-ubuntu-4               : ok=52   changed=28   unreachable=0    failed=0    skipped=27   rescued=0    ignored=1   
k8s-ubuntu-5               : ok=52   changed=28   unreachable=0    failed=0    skipped=27   rescued=0    ignored=1   

Nous avons maintenant un cluster Kubernetes déployé en mode hautement disponible, nous pouvons vérifier l'état du cluster :

root@k8s-ubuntu-0:~# kubectl get nodes
NAME           STATUS   ROLES           AGE    VERSION
k8s-ubuntu-0   Ready    control-plane   139m   v1.24.3
k8s-ubuntu-1   Ready    control-plane   136m   v1.24.3
k8s-ubuntu-2   Ready    control-plane   136m   v1.24.3
k8s-ubuntu-3   Ready    <none>          117m   v1.24.3
k8s-ubuntu-4   Ready    <none>          117m   v1.24.3
k8s-ubuntu-5   Ready    <none>          117m   v1.24.3

Vérifiez l'état des pods :

root@k8s-ubuntu-0:~# kubectl get pods --all-namespaces
NAMESPACE         NAME                                           READY   STATUS      RESTARTS       AGE
ingress-nginx     ingress-nginx-admission-create-tsc8p           0/1     Completed   0              135m
ingress-nginx     ingress-nginx-admission-patch-48tpn            0/1     Completed   0              135m
ingress-nginx     ingress-nginx-controller-6dc865cd86-kfq88      1/1     Running     0              135m
kube-flannel      kube-flannel-ds-fm4s6                          1/1     Running     0              117m
...

Nous pouvons voir Longhorn, Nginx Ingress et tous les pods du kube-system.

Nous pouvons également inspecter le service du contrôleur d'entrée Nginx :

root@k8s-ubuntu-0:~# kubectl get svc -n ingress-nginx
NAME                                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller                NodePort    10.111.203.177   <none>        80:30080/TCP,443:30443/TCP   136m
ingress-nginx-controller-admission      ClusterIP   10.105.11.11     <none>        443/TCP                      136m

Nous pouvons voir le port d'écoute du contrôleur d'entrée Nginx, dans ce cas, le port HTTP est 30080 et le port HTTPS est 30443. Depuis une machine externe, nous pouvons tester le contrôleur d'entrée :

lorenzo@mint-virtual:~$ curl -v http://192.168.25.110:30080
*   Trying 192.168.25.110:30080...
* TCP_NODELAY set
* Connected to 192.168.25.110 (192.168.25.110) port 30080 (#0)
> GET / HTTP/1.1
> Host: 192.168.25.110:30080
> User-Agent: curl/7.68.0
> Accept: */*
> 
< HTTP/1.1 404 Not Found
< Date: Wed, 17 Aug 2022 12:26:17 GMT
< Content-Type: text/html
< Content-Length: 146
< Connection: keep-alive
< 
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
* Connection #0 to host 192.168.25.110 left intact
À propos du projet

Install and configure a high available Kubernetes cluster

Installer
ansible-galaxy install garutilorenzo.ansible-role-linux-kubernetes
Licence
gpl-3.0
Téléchargements
24
Propriétaire
☁️ Multi Cloud solution architect • 🖥️ Linux system engineer • 🚀 DevOps • 👨‍💻Software developer