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 |
sí |
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 sí. 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 sí 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
Install and configure a high available Kubernetes cluster
ansible-galaxy install garutilorenzo.ansible-role-linux-kubernetes