garutilorenzo.ansible-role-linux-kubernetes

Instalar y configurar un clúster de Kubernetes altamente disponible

Este rol de Ansible instalará y configurará un clúster de Kubernetes altamente disponible. Este repositorio automatiza el proceso de instalación de Kubernetes usando kubeadm.

Este repositorio es solo un ejemplo de cómo usar la automatización de Ansible para instalar y configurar un clúster de Kubernetes. Para un entorno de producción, utiliza Kubespray.

Requisitos

Instalar ansible, ipaddr y netaddr:

pip install -r requirements.txt

Descargar el rol desde GitHub:

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

Variables del rol

Este rol acepta estas variables:

Var Requerido Default Descripción
kubernetes_subnet 192.168.25.0/24 Subred donde se desplegará Kubernetes. Si la VM o el servidor físico tiene más de una interfaz, Ansible filtrará la interfaz utilizada por Kubernetes según la subred de la interfaz.
disable_firewall no no Si se establece en sí, Ansible desactivará el firewall.
kubernetes_version no 1.25.0 Versión de Kubernetes a instalar
kubernetes_cri no containerd CRI de Kubernetes a instalar.
kubernetes_cni no flannel CNI de Kubernetes a instalar.
kubernetes_dns_domain no cluster.local Dominio DNS predeterminado de Kubernetes
kubernetes_pod_subnet no 10.244.0.0/16 Subred de pods de Kubernetes
kubernetes_service_subnet no 10.96.0.0/12 Subred de servicios de Kubernetes
kubernetes_api_port no 6443 Puerto de escucha de kubeapi
setup_vip no no Configurar la dirección VIP de Kubernetes usando kube-vip
kubernetes_vip_ip no 192.168.25.225 Requerido si setup_vip se establece en . Dirección IP vip para el plano de control
kubevip_version no v0.4.3 Versión del contenedor kube-vip
install_longhorn no no Instalar Longhorn, almacenamiento en bloque distribuido nativo de la nube para Kubernetes.
longhorn_version no v1.3.1 Versión de Longhorn.
install_nginx_ingress no no Instalar controlador de ingreso nginx
nginx_ingress_controller_version no controller-v1.3.0 Versión del controlador de ingreso nginx
nginx_ingress_controller_http_nodeport no 30080 NodePort usado por el controlador de ingreso nginx para el tráfico http entrante
nginx_ingress_controller_https_nodeport no 30443 NodePort usado por el controlador de ingreso nginx para el tráfico https entrante
enable_nginx_ingress_proxy_protocol no no Habilitar el modo de protocolo proxy del controlador de ingreso nginx
enable_nginx_real_ip no no Habilitar el módulo real-ip del controlador de ingreso nginx
nginx_ingress_real_ip_cidr no 0.0.0.0/0 Requerido si enable_nginx_real_ip se establece en Subred confiable para usar con el módulo real-ip
nginx_ingress_proxy_body_size no 20m Tamaño máximo del cuerpo del proxy del controlador de ingreso nginx
sans_base no [lista de valores, ver defaults/main.yml] lista de direcciones IP o FQDN utilizadas para firmar el certificado kube-api

Variables extras

Este rol acepta una variable extra kubernetes_init_host. Esta variable se utiliza cuando el clúster se inicializa por primera vez. El valor de esta variable debe ser el nombre de host de uno de los nodos maestros. Cuando Ansible se ejecute en el host coincidente, Kubernetes se inicializará.

Recursos del clúster desplegados

Con este rol se instalarán Nginx ingress controller y Longhorn.

Nginx ingress controller

Nginx ingress controller se utiliza como controlador de ingreso.

La instalación es para bare metal, el controlador de ingreso se expone a través de un servicio NodePort. Puedes personalizar los puertos expuestos por el servicio NodePort, usa Variables del Rol para cambiar estos valores.

Longhorn

Longhorn es un sistema de almacenamiento en bloque distribuido ligero, confiable y potente para Kubernetes.

Longhorn implementa almacenamiento en bloque distribuido utilizando contenedores y microservicios. Longhorn crea un controlador de almacenamiento dedicado para cada volumen de dispositivo de bloque y replica el volumen de forma sincronizada a través de múltiples réplicas almacenadas en múltiples nodos. El controlador de almacenamiento y las réplicas son orquestadas usando Kubernetes.

Vagrant

Para probar este rol puedes usar Vagrant y Virtualbox para levantar una infraestructura de ejemplo. Una vez que hayas descargado este repositorio, usa Vagrant para iniciar las máquinas virtuales:

vagrant up

En el archivo Vagrantfile puedes inyectar tu clave SSH pública directamente en authorized_keys del usuario vagrant. Debes cambiar el marcador CHANGE_ME en el archivo Vagrantfile. También puedes ajustar el número de máquinas virtuales desplegadas cambiando la variable NNODES (Predeterminado: 6).

Usando este rol

Para usar este rol sigue el ejemplo en el directorio examples/. Ajusta el archivo hosts.ini con tus hosts y ejecuta el playbook:

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

Ahora tenemos un clúster de Kubernetes desplegado en modo altamente disponible, podemos verificar el estado del clúster:

root@k8s-ubuntu-0:~# kubectl get nodes
NOMBRE           ESTADO   ROLES           EDAD    VERSIÓN
k8s-ubuntu-0   Listo    control-plane   139m   v1.24.3
k8s-ubuntu-1   Listo    control-plane   136m   v1.24.3
k8s-ubuntu-2   Listo    control-plane   136m   v1.24.3
k8s-ubuntu-3   Listo    <ninguno>          117m   v1.24.3
k8s-ubuntu-4   Listo    <ninguno>          117m   v1.24.3
k8s-ubuntu-5   Listo    <ninguno>          117m   v1.24.3

Revisa el estado de los pods:

root@k8s-ubuntu-0:~# kubectl get pods --all-namespaces
NAMESPACE         NOMBRE                                           LISTO   ESTADO      REINICIOS       EDAD
ingress-nginx     ingress-nginx-admission-create-tsc8p           0/1     Completado   0              135m
ingress-nginx     ingress-nginx-admission-patch-48tpn            0/1     Completado   0              135m
ingress-nginx     ingress-nginx-controller-6dc865cd86-kfq88      1/1     Ejecutándose     0              135m
kube-flannel      kube-flannel-ds-fm4s6                          1/1     Ejecutándose     0              117m
kube-flannel      kube-flannel-ds-hhvxx                          1/1     Ejecutándose     0              117m
kube-flannel      kube-flannel-ds-ngdtc                          1/1     Ejecutándose     0              117m
kube-flannel      kube-flannel-ds-q5ncb                          1/1     Ejecutándose     0              136m
kube-flannel      kube-flannel-ds-vq4kk                          1/1     Ejecutándose     0              139m
kube-flannel      kube-flannel-ds-zshpf                          1/1     Ejecutándose     0              137m
kube-system       coredns-6d4b75cb6d-8dh9h                       1/1     Ejecutándose     0              139m
kube-system       coredns-6d4b75cb6d-xq98k                       1/1     Ejecutándose     0              139m
kube-system       etcd-k8s-ubuntu-0                              1/1     Ejecutándose     0              139m
kube-system       etcd-k8s-ubuntu-1                              1/1     Ejecutándose     0              136m
kube-system       etcd-k8s-ubuntu-2                              1/1     Ejecutándose     0              136m
kube-system       kube-apiserver-k8s-ubuntu-0                    1/1     Ejecutándose     0              139m
kube-system       kube-apiserver-k8s-ubuntu-1                    1/1     Ejecutándose     0              135m
kube-system       kube-apiserver-k8s-ubuntu-2                    1/1     Ejecutándose     0              136m
kube-system       kube-controller-manager-k8s-ubuntu-0           1/1     Ejecutándose     0              139m
kube-system       kube-controller-manager-k8s-ubuntu-1           1/1     Ejecutándose     0              136m
kube-system       kube-controller-manager-k8s-ubuntu-2           1/1     Ejecutándose     0              135m
kube-system       kube-proxy-59jqx                               1/1     Ejecutándose     0              136m
kube-system       kube-proxy-8mjwr                               1/1     Ejecutándose     0              139m
kube-system       kube-proxy-8nhbw                               1/1     Ejecutándose     0              117m
kube-system       kube-proxy-j2rrx                               1/1     Ejecutándose     0              117m
kube-system       kube-proxy-qwd5r                               1/1     Ejecutándose     0              117m
kube-system       kube-proxy-vcs7g                               1/1     Ejecutándose     0              137m
kube-system       kube-scheduler-k8s-ubuntu-0                    1/1     Ejecutándose     0              139m
kube-system       kube-scheduler-k8s-ubuntu-1                    1/1     Ejecutándose     0              136m
kube-system       kube-scheduler-k8s-ubuntu-2                    1/1     Ejecutándose     0              135m
kube-system       kube-vip-k8s-ubuntu-0                          1/1     Ejecutándose     1 (hace 136m)   139m
kube-system       kube-vip-k8s-ubuntu-1                          1/1     Ejecutándose     0              136m
kube-system       kube-vip-k8s-ubuntu-2                          1/1     Ejecutándose     0              136m
longhorn-system   csi-attacher-dcb85d774-jrggr                   1/1     Ejecutándose     0              114m
longhorn-system   csi-attacher-dcb85d774-slhqt                   1/1     Ejecutándose     0              114m
longhorn-system   csi-attacher-dcb85d774-xcbxn                   1/1     Ejecutándose     0              114m
longhorn-system   csi-provisioner-5d8dd96b57-74x6h               1/1     Ejecutándose     0              114m
longhorn-system   csi-provisioner-5d8dd96b57-kdzdf               1/1     Ejecutándose     0              114m
longhorn-system   csi-provisioner-5d8dd96b57-xmpjf               1/1     Ejecutándose     0              114m
longhorn-system   csi-resizer-7c5bb5fd65-4262v                   1/1     Ejecutándose     0              114m
longhorn-system   csi-resizer-7c5bb5fd65-mfjgv                   1/1     Ejecutándose     0              114m
longhorn-system   csi-resizer-7c5bb5fd65-qw944                   1/1     Ejecutándose     0              114m
longhorn-system   csi-snapshotter-5586bc7c79-bs2xn               1/1     Ejecutándose     0              114m
longhorn-system   csi-snapshotter-5586bc7c79-d927b               1/1     Ejecutándose     0              114m
longhorn-system   csi-snapshotter-5586bc7c79-v99t6               1/1     Ejecutándose     0              114m
longhorn-system   engine-image-ei-766a591b-hrs6g                 1/1     Ejecutándose     0              114m
longhorn-system   engine-image-ei-766a591b-n9fsn                 1/1     Ejecutándose     0              114m
longhorn-system   engine-image-ei-766a591b-vxhbb                 1/1     Ejecutándose     0              114m
longhorn-system   instance-manager-e-3dba6914                    1/1     Ejecutándose     0              114m
longhorn-system   instance-manager-e-7bd8b1ff                    1/1     Ejecutándose     0              114m
longhorn-system   instance-manager-e-aca0fdc4                    1/1     Ejecutándose     0              114m
longhorn-system   instance-manager-r-244c040c                    1/1     Ejecutándose     0              114m
longhorn-system   instance-manager-r-39bd81b1                    1/1     Ejecutándose     0              114m
longhorn-system   instance-manager-r-3b7f12b1                    1/1     Ejecutándose     0              114m
longhorn-system   longhorn-admission-webhook-858d86b96b-j5rcv    1/1     Ejecutándose     0              135m
longhorn-system   longhorn-admission-webhook-858d86b96b-lphkq    1/1     Ejecutándose     0              135m
longhorn-system   longhorn-conversion-webhook-576b5c45c7-4p55x   1/1     Ejecutándose     0              135m
longhorn-system   longhorn-conversion-webhook-576b5c45c7-lq686   1/1     Ejecutándose     0              135m
longhorn-system   longhorn-csi-plugin-f7zmn                      2/2     Ejecutándose     0              114m
longhorn-system   longhorn-csi-plugin-hs58p                      2/2     Ejecutándose     0              114m
longhorn-system   longhorn-csi-plugin-wfpfs                      2/2     Ejecutándose     0              114m
longhorn-system   longhorn-driver-deployer-96cf98c98-7hzft       1/1     Ejecutándose     0              135m
longhorn-system   longhorn-manager-92xws                         1/1     Ejecutándose     0              116m
longhorn-system   longhorn-manager-b6knm                         1/1     Ejecutándose     0              116m
longhorn-system   longhorn-manager-tg2zc                         1/1     Ejecutándose     0              116m
longhorn-system   longhorn-ui-86b56b95c8-ctbvf                   1/1     Ejecutándose     0              135m

Podemos ver Longhorn, Nginx ingress y todos los pods de kube-system.

También podemos inspeccionar el servicio del controlador de ingreso nginx:

root@k8s-ubuntu-0:~# kubectl get svc -n ingress-nginx
NOMBRE                                    TIPO        CLUSTER-IP       EXTERNAL-IP   PUERTOS                      EDAD
ingress-nginx-controller                NodePort    10.111.203.177   <ninguno>        80:30080/TCP,443:30443/TCP   136m
ingress-nginx-controller-admission      ClusterIP   10.105.11.11     <ninguno>        443/TCP                      136m

Podemos ver el puerto de escucha del controlador de ingreso nginx, en este caso el puerto http es 30080 y el puerto https es 30443. Desde una máquina externa podemos probar el controlador de ingreso:

lorenzo@mint-virtual:~$ curl -v http://192.168.25.110:30080
*   Intentando 192.168.25.110:30080...
* TCP_NODELAY establecido
* Conectado a 192.168.25.110 (192.168.25.110) puerto 30080 (#0)
> GET / HTTP/1.1
> Host: 192.168.25.110:30080
> User-Agent: curl/7.68.0
> Accept: */*
> 
* Marcando el conjunto de paquetes como no compatible con multiuso
< 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>
* Conexión #0 al host 192.168.25.110 se quedó intacta
Acerca del proyecto

Install and configure a high available Kubernetes cluster

Instalar
ansible-galaxy install garutilorenzo.ansible-role-linux-kubernetes
Licencia
gpl-3.0
Descargas
24
Propietario
☁️ Multi Cloud solution architect • 🖥️ Linux system engineer • 🚀 DevOps • 👨‍💻Software developer