diff --git a/cephrook.pdf b/cephrook.pdf new file mode 100644 index 0000000..df63dd3 Binary files /dev/null and b/cephrook.pdf differ diff --git a/readme-suse.md b/cluster_init.md similarity index 72% rename from readme-suse.md rename to cluster_init.md index 2322d83..fac4477 100644 --- a/readme-suse.md +++ b/cluster_init.md @@ -475,222 +475,3 @@ Con esto podrás unir cualquier nodo extra como nuevo control-plane, incluso cua * Reinstala CNI plugins * Aplica Flannel * Reinicia kubelet - - -# 8. Instala Multus (opcional, para múltiples redes) - -Multus permite que un pod tenga más de una interfaz de red (multi-homed), útil para appliances, firewalls, balanceadores, gateways, etc. Instálalo si necesitas conectar pods a varias redes físicas o VLANs (por ejemplo, mediante bridges y NADs). - -**Instalación:** - -```bash -kubectl apply -f https://raw.githubusercontent.com/k8snetworkplumbingwg/multus-cni/master/deployments/multus-daemonset.yml -``` - -**Verifica:** - -```bash -kubectl get pods -n kube-system | grep multus -``` - ---- - -# 9. (Opcional) Quita el taint del nodo master para poder programar pods en él - -Por defecto, Kubernetes no programa pods de usuario en el nodo principal (control-plane). Elimina este bloqueo para poder desplegar aplicaciones ahí. - -```bash -kubectl taint nodes --all node-role.kubernetes.io/control-plane- -kubectl taint nodes --all node-role.kubernetes.io/master- -``` -## Nota: Uso de taints en nodos control-plane (alta disponibilidad y ejecución de cargas) - -### ¿Qué es un taint? - -* Un **taint** en Kubernetes es una marca especial que se pone a un nodo para **evitar que los pods se programen ahí**, salvo que declaren una “toleration” explícita. -* Se usa para reservar nodos solo para tareas especiales (por ejemplo, el control-plane). -* Por defecto, los nodos control-plane llevan un taint: - - * `node-role.kubernetes.io/control-plane:NoSchedule` - -### ¿Por qué quitar el taint? - -* Si quieres que **los nodos control-plane puedan ejecutar pods de usuario** (además del plano de control), necesitas **quitar el taint**. -* Esto es común en clústeres pequeños o medianos, donde **todos los nodos cumplen doble función** (alta disponibilidad y ejecución de cargas). - ---- - -### **Comandos para quitar el taint de todos los nodos control-plane:** - -```bash -kubectl taint nodes --all node-role.kubernetes.io/control-plane- -kubectl taint nodes --all node-role.kubernetes.io/master- -``` - -* El `-` final indica “quitar”. -* Ejecuta ambos para máxima compatibilidad entre versiones. - -### **Comando para añadir el taint (dejar el nodo solo como control-plane):** - -```bash -kubectl taint nodes NOMBRE_DEL_NODO node-role.kubernetes.io/control-plane=:NoSchedule -``` - -* Así, ese nodo **solo ejecuta el plano de control** (salvo pods con toleration específica). - ---- - -# 10. Test rápido de Multus (NAD + pod con 2 interfaces) - -Puedes comprobar que Multus funciona creando una red secundaria y un pod de prueba con dos interfaces (una por defecto, una secundaria). - -En la carpeta `multus/` de tu repositorio, debes tener: - -* `multus/nad-br-servicios.yaml` (NetworkAttachmentDefinition) -* `multus/test-multus-pod.yaml` (pod Alpine multi-homed) - -**Despliega la NAD:** - -```bash -kubectl apply -f multus/nad-br-servicios.yaml -``` - -**Despliega el pod de test:** - -```bash -kubectl apply -f multus/test-multus-pod.yaml -``` - -**Comprueba las interfaces:** - -```bash -kubectl exec -it multus-test -- sh -ip a -``` - -* El pod debe mostrar una interfaz extra (además de la de Flannel), conectada a tu red secundaria (`br-servicios`, etc.). - -**Para limpiar:** - -```bash -kubectl delete pod multus-test -``` - ---- - -> **Nota:** Puedes crear tantas NADs (NetworkAttachmentDefinition) como bridges/VLANs quieras conectar a pods específicos (con Multus), ideal para appliances de red, gateways, SDN, pruebas de seguridad, etc. - ---- - -# 11. Instalación y configuración de MetalLB (LoadBalancer local) - -MetalLB permite asignar IPs flotantes de tu red LAN a servicios `LoadBalancer`, igual que hacen los clústeres en la nube. Es fundamental si quieres exponer servicios como ingress, dashboards, etc., accesibles desde tu red local. - ---- - -## a) Instala MetalLB - -```bash -kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.5/config/manifests/metallb-native.yaml -``` - -Esto crea el namespace `metallb-system` y los pods necesarios. - ---- - -## b) Declara múltiples pools de IP - -Puedes crear varios pools (por ejemplo, uno para producción y otro para test, o para diferentes VLANs/segmentos). Los pools se definen en el objeto `IPAddressPool`. - -**Ejemplo: `metallb/ipaddresspool.yaml`** - -```yaml -apiVersion: metallb.io/v1beta1 -kind: IPAddressPool -metadata: - name: pool-produccion - namespace: metallb-system -spec: - addresses: - - 192.168.1.100-192.168.1.110 ---- -apiVersion: metallb.io/v1beta1 -kind: IPAddressPool -metadata: - name: pool-lab - namespace: metallb-system -spec: - addresses: - - 192.168.2.100-192.168.2.110 -``` - -**Ejemplo: `metallb/l2advertisement.yaml`** - -```yaml -apiVersion: metallb.io/v1beta1 -kind: L2Advertisement -metadata: - name: advert-all - namespace: metallb-system -spec: {} -``` - -**Kustomization:** - -```yaml -resources: - - ipaddresspool.yaml - - l2advertisement.yaml -``` - -Para aplicar: - -```bash -kubectl apply -k metallb/ -``` - ---- - -## c) Asigna un pool concreto a un Service (anotaciones) - -Por defecto, los Services `LoadBalancer` usan cualquier pool disponible. Para forzar el uso de un pool específico, **añade esta anotación al Service**: - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: ejemplo-prod - annotations: - metallb.universe.tf/address-pool: pool-produccion -spec: - selector: - app: ejemplo - ports: - - port: 80 - targetPort: 80 - type: LoadBalancer -``` - -* Cambia `pool-produccion` por el nombre de pool que quieras usar. - -Al crear el Service, MetalLB le asignará una IP **solo de ese pool**. - ---- - -## d) Comprobar el resultado - -```bash -kubectl get svc -``` - -Verás la IP asignada en la columna `EXTERNAL-IP`. - ---- - -> **Notas:** -> -> * Puedes definir tantos pools como necesites, uno por segmento/VLAN/uso. -> * Puedes versionar los manifiestos de MetalLB en una carpeta específica del repositorio (`metallb/`). - ---- - diff --git a/cluster_init.pdf b/cluster_init.pdf new file mode 100644 index 0000000..b129b23 Binary files /dev/null and b/cluster_init.pdf differ diff --git a/comprobaciones.md b/comprobaciones.md index 63fa3d9..236a7f5 100644 --- a/comprobaciones.md +++ b/comprobaciones.md @@ -1,12 +1,19 @@ # **Comprobaciones y diagnóstico habitual** -### Estado de pods y despliegues + + +### Estado de nodos, pods y despliegues ```bash +kubectl get nodes -o wide # Estado y detalles de los nodos +kubectl describe node # Info detallada, condiciones, taints, eventos + kubectl get pods -A # Todos los pods de todos los namespaces kubectl get pods -n traefik # Sólo los pods de Traefik kubectl get pods -n cert-manager # Sólo cert-manager kubectl get deployments -A # Todos los deployments + +kubectl get events -A | tail -20 # Últimos eventos del clúster (errores recientes) ``` *Todos los pods deben estar en estado `Running` o `Completed`. Si alguno está en `CrashLoopBackOff` o `Error`, inspecciona con:* @@ -14,6 +21,13 @@ kubectl get deployments -A # Todos los deployments ```bash kubectl describe pod -n kubectl logs -n +kubectl logs -f -n # Logs en streaming (útil en troubleshooting) +``` +### Estado de los control-plane y componentes críticos + +```bash +kubectl get pods -n kube-system -o wide # Componentes internos: etcd, coredns, apiserver, controller, etc. +kubectl logs -n kube-system # Logs de cualquier pod de kube-system ``` ### Servicios, IPs y estado MetalLB @@ -21,6 +35,7 @@ kubectl logs -n ```bash kubectl get svc -A # Todos los servicios, revisa columna EXTERNAL-IP kubectl get svc -n traefik # Servicio LoadBalancer de Traefik debe tener IP de MetalLB +kubectl describe svc -n # Ver detalles de servicio, endpoints, ports, etc. ``` ### Certificados, secrets y recursos cert-manager @@ -28,9 +43,12 @@ kubectl get svc -n traefik # Servicio LoadBalancer de Traefik ```bash kubectl get secrets -n traefik # Verifica el Secret TLS (ej: wildcard-cert) kubectl describe secret wildcard-cert -n traefik + kubectl get certificate -A # (cert-manager) lista los recursos Certificate gestionados kubectl describe certificate -n # Ver detalle y posibles errores + kubectl get clusterissuer,issuer -A # Ver emisores de cert-manager (staging, prod, etc.) +kubectl describe clusterissuer # Detalles y eventos del issuer global ``` ### Ingress, dominios y rutas diff --git a/comprobaciones.pdf b/comprobaciones.pdf new file mode 100644 index 0000000..385c1d0 Binary files /dev/null and b/comprobaciones.pdf differ diff --git a/kubevirt.pdf b/kubevirt.pdf new file mode 100644 index 0000000..df17211 Binary files /dev/null and b/kubevirt.pdf differ diff --git a/readme.md b/readme.md index 036952f..8a2cc22 100644 --- a/readme.md +++ b/readme.md @@ -1,8 +1,7 @@ -# Guía Oficial de Instalación de Kubernetes en SUSE +# Guía de Instalación de Kubernetes en SUSE -Este repositorio contiene los **manifiestos, scripts y documentación oficial** para desplegar y gestionar un clúster Kubernetes basado en SUSE Linux. +Este repositorio contiene los **manifiestos, scripts y documentación** para desplegar y gestionar un clúster Kubernetes basado en SUSE Linux. -> **NOTA:** Todo el proceso está documentado paso a paso, con comprobaciones, consideraciones y mejores prácticas. --- @@ -10,25 +9,24 @@ Este repositorio contiene los **manifiestos, scripts y documentación oficial** | Documento | Descripción | Referencia | | ------------------- | ------------------------------------------ | ------------------------ | -| `readme.md` | Índice y presentación general | (Este documento) | -| `comprobaciones.md` | Checklist y pruebas tras cada paso crítico | [Ver](comprobaciones.md) | -| `cephrook.md` | Instalación e integración de Ceph/Rook | [Ver](cephrook.md) | -| `Clusterkey.txt` | Clave actual del clúster y certificate-key | [Ver](Clusterkey.txt) | -| `kubevirt.md` | Despliegue de KubeVirt y gestión de VMs | [Ver](kubevirt.md) | -| `readme-suse.md` | Proceso de instalación detallado en SUSE | [Ver](readme-suse.md) | +| `cluster_init.md` | Proceso de inicializacion del cluster detallado en SUSE | [Ver](cluster_init.md) | +| `redes_internet.md` | MetalLB, Multus y demas | [Ver](redes_internet.md.md) | +| `cephrook.md` | Instalación e integración de Ceph/Rook | [Ver](./cephrook.md) | +| `kubevirt.md` | Despliegue de KubeVirt y gestión de VMs | [Ver](./kubevirt.md) | +| `comprobaciones.md` | Checklist y pruebas tras cada paso crítico | [Ver](./comprobaciones.md) | --- -## Estado actual de los documentos +## Estado actual de la instalación | Documento | Estado | Comentario | | ------------------- | -------------- | ------------------------------------- | -| `readme.md` | ✅ Completado | Actualizado | -| `comprobaciones.md` | ⚠️ En revisión | Añadir más pruebas específicas | +| `cluster_init.md` | ✅ Completado | Instalación básica validada | +| `redes_internet.md` | ⚠️ En revisión | Integración Ceph pendiente de validar | | `cephrook.md` | ⚠️ En revisión | Integración Ceph pendiente de validar | -| `Clusterkey.txt` | ✅ Completado | Clave generada y aplicada | | `kubevirt.md` | ⚠️ En revisión | Revisar últimas pruebas de VMs | -| `readme-suse.md` | ✅ Completado | Instalación básica validada | +| `comprobaciones.md` | ✅ Completado | Comandistica util para debugear, lista para usar | + --- @@ -38,6 +36,4 @@ Este repositorio contiene los **manifiestos, scripts y documentación oficial** 2. Comprueba cada paso con `comprobaciones.md`. 3. Consulta el resto de documentos según el despliegue requerido (Ceph, KubeVirt, etc). ---- -¿Dudas, mejoras o sugerencias? Haz un pull request o abre un issue. diff --git a/redes_internet.md b/redes_internet.md new file mode 100644 index 0000000..d06a633 --- /dev/null +++ b/redes_internet.md @@ -0,0 +1,217 @@ +# 1. Instala Multus (opcional, para múltiples redes) + +Multus permite que un pod tenga más de una interfaz de red (multi-homed), útil para appliances, firewalls, balanceadores, gateways, etc. Instálalo si necesitas conectar pods a varias redes físicas o VLANs (por ejemplo, mediante bridges y NADs). + +**Instalación:** + +```bash +kubectl apply -f https://raw.githubusercontent.com/k8snetworkplumbingwg/multus-cni/master/deployments/multus-daemonset.yml +``` + +**Verifica:** + +```bash +kubectl get pods -n kube-system | grep multus +``` + +--- + +# 2. (Opcional) Quita el taint del nodo master para poder programar pods en él + +Por defecto, Kubernetes no programa pods de usuario en el nodo principal (control-plane). Elimina este bloqueo para poder desplegar aplicaciones ahí. + +```bash +kubectl taint nodes --all node-role.kubernetes.io/control-plane- +kubectl taint nodes --all node-role.kubernetes.io/master- +``` +## Nota: Uso de taints en nodos control-plane (alta disponibilidad y ejecución de cargas) + +### ¿Qué es un taint? + +* Un **taint** en Kubernetes es una marca especial que se pone a un nodo para **evitar que los pods se programen ahí**, salvo que declaren una “toleration” explícita. +* Se usa para reservar nodos solo para tareas especiales (por ejemplo, el control-plane). +* Por defecto, los nodos control-plane llevan un taint: + + * `node-role.kubernetes.io/control-plane:NoSchedule` + +### ¿Por qué quitar el taint? + +* Si quieres que **los nodos control-plane puedan ejecutar pods de usuario** (además del plano de control), necesitas **quitar el taint**. +* Esto es común en clústeres pequeños o medianos, donde **todos los nodos cumplen doble función** (alta disponibilidad y ejecución de cargas). + +--- + +### **Comandos para quitar el taint de todos los nodos control-plane:** + +```bash +kubectl taint nodes --all node-role.kubernetes.io/control-plane- +kubectl taint nodes --all node-role.kubernetes.io/master- +``` + +* El `-` final indica “quitar”. +* Ejecuta ambos para máxima compatibilidad entre versiones. + +### **Comando para añadir el taint (dejar el nodo solo como control-plane):** + +```bash +kubectl taint nodes NOMBRE_DEL_NODO node-role.kubernetes.io/control-plane=:NoSchedule +``` + +* Así, ese nodo **solo ejecuta el plano de control** (salvo pods con toleration específica). + +--- + +# 3. Test rápido de Multus (NAD + pod con 2 interfaces) + +Puedes comprobar que Multus funciona creando una red secundaria y un pod de prueba con dos interfaces (una por defecto, una secundaria). + +En la carpeta `multus/` de tu repositorio, debes tener: + +* `multus/nad-br-servicios.yaml` (NetworkAttachmentDefinition) +* `multus/test-multus-pod.yaml` (pod Alpine multi-homed) + +**Despliega la NAD:** + +```bash +kubectl apply -f multus/nad-br-servicios.yaml +``` + +**Despliega el pod de test:** + +```bash +kubectl apply -f multus/test-multus-pod.yaml +``` + +**Comprueba las interfaces:** + +```bash +kubectl exec -it multus-test -- sh +ip a +``` + +* El pod debe mostrar una interfaz extra (además de la de Flannel), conectada a tu red secundaria (`br-servicios`, etc.). + +**Para limpiar:** + +```bash +kubectl delete pod multus-test +``` + +--- + +> **Nota:** Puedes crear tantas NADs (NetworkAttachmentDefinition) como bridges/VLANs quieras conectar a pods específicos (con Multus), ideal para appliances de red, gateways, SDN, pruebas de seguridad, etc. + +--- + +# 4. Instalación y configuración de MetalLB (LoadBalancer local) + +MetalLB permite asignar IPs flotantes de tu red LAN a servicios `LoadBalancer`, igual que hacen los clústeres en la nube. Es fundamental si quieres exponer servicios como ingress, dashboards, etc., accesibles desde tu red local. + +--- + +## a) Instala MetalLB + +```bash +kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.5/config/manifests/metallb-native.yaml +``` + +Esto crea el namespace `metallb-system` y los pods necesarios. + +--- + +## b) Declara múltiples pools de IP + +Puedes crear varios pools (por ejemplo, uno para producción y otro para test, o para diferentes VLANs/segmentos). Los pools se definen en el objeto `IPAddressPool`. + +**Ejemplo: `metallb/ipaddresspool.yaml`** + +```yaml +apiVersion: metallb.io/v1beta1 +kind: IPAddressPool +metadata: + name: pool-produccion + namespace: metallb-system +spec: + addresses: + - 192.168.1.100-192.168.1.110 +--- +apiVersion: metallb.io/v1beta1 +kind: IPAddressPool +metadata: + name: pool-lab + namespace: metallb-system +spec: + addresses: + - 192.168.2.100-192.168.2.110 +``` + +**Ejemplo: `metallb/l2advertisement.yaml`** + +```yaml +apiVersion: metallb.io/v1beta1 +kind: L2Advertisement +metadata: + name: advert-all + namespace: metallb-system +spec: {} +``` + +**Kustomization:** + +```yaml +resources: + - ipaddresspool.yaml + - l2advertisement.yaml +``` + +Para aplicar: + +```bash +kubectl apply -k metallb/ +``` + +--- + +## c) Asigna un pool concreto a un Service (anotaciones) + +Por defecto, los Services `LoadBalancer` usan cualquier pool disponible. Para forzar el uso de un pool específico, **añade esta anotación al Service**: + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: ejemplo-prod + annotations: + metallb.universe.tf/address-pool: pool-produccion +spec: + selector: + app: ejemplo + ports: + - port: 80 + targetPort: 80 + type: LoadBalancer +``` + +* Cambia `pool-produccion` por el nombre de pool que quieras usar. + +Al crear el Service, MetalLB le asignará una IP **solo de ese pool**. + +--- + +## d) Comprobar el resultado + +```bash +kubectl get svc +``` + +Verás la IP asignada en la columna `EXTERNAL-IP`. + +--- + +> **Notas:** +> +> * Puedes definir tantos pools como necesites, uno por segmento/VLAN/uso. +> * Puedes versionar los manifiestos de MetalLB en una carpeta específica del repositorio (`metallb/`). + +--- + diff --git a/redes_internet.pdf b/redes_internet.pdf new file mode 100644 index 0000000..3c7b891 Binary files /dev/null and b/redes_internet.pdf differ