Añadidas redes y harbor

This commit is contained in:
2025-04-27 21:55:49 +00:00
parent 90c629007b
commit 43c6c9813b
26 changed files with 467 additions and 72 deletions

59
docs/chuletario.md Normal file
View File

@ -0,0 +1,59 @@
# 🚀 Referencia rápida de `kubectl` - Valhalla Cluster
## 📦 Gestión de Pods
```bash
kubectl get pods -A # Ver todos los pods en todos los namespaces
kubectl get pods -n <namespace> # Ver los pods de un namespace
kubectl describe pod <nombre> -n <namespace> # Detallar un pod
kubectl delete pod <nombre> -n <namespace> # Borrar un pod manualmente
```
## 📜 Gestión de Deployments
```bash
kubectl get deployments -A
kubectl describe deployment <nombre> -n <namespace>
kubectl rollout restart deployment <nombre> -n <namespace> # Reiniciar un deployment
```
## 📋 Gestión de Servicios (Services)
```bash
kubectl get svc -A
kubectl describe svc <nombre> -n <namespace>
```
## 📌 Gestión de Ingress
```bash
kubectl get ingress -A
kubectl describe ingress <nombre> -n <namespace>
```
## 🔥 Diagnóstico Rápido
```bash
kubectl get events -A --sort-by='.metadata.creationTimestamp' # Ver eventos recientes
kubectl logs <nombre_pod> -n <namespace> # Ver logs de un pod
kubectl exec -it <nombre_pod> -n <namespace> -- /bin/sh # Acceder dentro de un pod
```
## 🎯 Gestión de Nodos
```bash
kubectl get nodes
kubectl describe node <nombre_nodo>
kubectl drain <nombre_nodo> --ignore-daemonsets --delete-emptydir-data # Sacar un nodo para mantenimiento
kubectl delete node <nombre_nodo> # Borrar un nodo manualmente del cluster
```
## 🏗️ Aplicar y Borrar Manifiestos
```bash
kubectl apply -f <archivo>.yaml
kubectl delete -f <archivo>.yaml
```

View File

@ -361,7 +361,56 @@ Comprobar:
>Con acceso ya a gitea, seria el momento de crear todos los repositorios remotos. Es una buena idea apoyarnos en [git-publish](herramienta%20git-publish.md).
>Si tambien te has hartado de teclear git-publish, tambien tenemos un script para ti: [publicar-todos](herramienta%20publicar-todos.md)
## 8. Instalar ArgoCD
## 8. Instalar Harbor
### 8.1 Instalar `helm`
```bash
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
```
Verifica que `helm` está instalado:
```bash
helm version
```
---
### 8.2 Añadir el repositorio de charts de Harbor
```bash
helm repo add harbor https://helm.goharbor.io
helm repo update
```
---
### 8.3 Instalar Harbor
```bash
helm install harbor harbor/harbor --namespace harbor --create-namespace -f values.yaml
```
---
> Si todo es correcto, podrás acceder a **https://harbor.manabo.org** con usuario `admin` y contraseña `Harbor12345`.
---
>Puedes loguearte desde tu equipo con:
```bash
docker login harbor.manabo.org
```
Y usar Harbor igual que Docker Hub.
---
> **En esta fase:** dejamos desplegado nuestro servidor de imágenes privado (`harbor.manabo.org`) para reemplazar Docker Hub en nuestros proyectos.
## 9. Instalar ArgoCD
### En Tartaro (o donde tengamos los manifiestos locales clonados de Gitea)
@ -390,7 +439,7 @@ En la interfaz web:
7. Sync policy: automática
8. Marca las casillas: `AUTO-CREATE NAMESPACE` `PRUNE` `SELF HEAL` `DIRECTORY RECURSE`
## 9. Instalar KubeVirt
## 10. Instalar KubeVirt
export KUBEVIRT_VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases/latest | grep tag_name | cut -d '"' -f 4)
kubectl create namespace kubevirt
@ -414,23 +463,23 @@ En la interfaz web:
chmod +x virtctl
sudo mv virtctl /usr/local/bin/
### 9.1 Configurar Multus y las redes virtuales
### 10.1 Configurar Multus y las redes virtuales
En cada nodo:
sudo rm -f /etc/cni/net.d/*
sudo find /etc/cni/net.d/ -type f -exec rm {} \;
sudo cp /var/lib/rancher/k3s/agent/etc/cni/net.d/10-flannel.conflist /etc/cni/net.d/
echo 'KERNEL=="kvm", MODE="0666"' | sudo tee /etc/udev/rules.d/99-kvm.rules
sudo udevadm control --reload-rules && sudo udevadm trigger
y en tartaro (o cualquier nodo)
kubectl -n kube-system delete pod -l app=multus
## 10. Desplegar servidor HTTP para ISOs (KubeVirt ISO Server)
## 11. Desplegar servidor HTTP para ISOs (KubeVirt ISO Server)
cd ~/k3s/k8s-kubevirt-isoserver/
kubectl apply -k .
## 11. Desplegar Apache Guacamole
## 12. Desplegar Apache Guacamole
cd ~/k3s/k8s-guacamole/
kubectl apply -k .

View File

@ -3,21 +3,7 @@
Git-childremove es una herramienta para eliminar los git de las carpetas hijas
## 1. Crea el script
Copia este contenido en ~/bin/git-publish (crea la carpeta ~/bin si no existe):
#!/bin/bash
set -e
ENV_FILE="${HOME}/.gitpublish.env"
if [ ! -f "$ENV_FILE" ]; then
echo "Falta archivo .env en $ENV_FILE"
exit 1# 🛠Creacion de herramienta git-publish
Git-publish es una herramienta para automatizar la creacion y publicacion de repositorios
## 1. Crea el script
Copia este contenido en ~/bin/git-publish (crea la carpeta ~/bin si no existe):
Copia este contenido en ~/bin/git-childremove (crea la carpeta ~/bin si no existe):
#!/bin/bash

View File

@ -0,0 +1,42 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: espocrm
namespace: espocrm
spec:
replicas: 1
selector:
matchLabels:
app: espocrm
template:
metadata:
labels:
app: espocrm
spec:
containers:
- name: espocrm
image: espocrm/espocrm
ports:
- containerPort: 80
env:
- name: ESPOCRM_DATABASE_PLATFORM
value: Mysql
- name: ESPOCRM_DATABASE_HOST
value: mysql
- name: ESPOCRM_DATABASE_USER
value: espocrm
- name: ESPOCRM_DATABASE_PASSWORD
value: database_password
- name: ESPOCRM_ADMIN_USERNAME
value: admin
- name: ESPOCRM_ADMIN_PASSWORD
value: password
- name: ESPOCRM_SITE_URL
value: "https://espocrm.avgx.org"
volumeMounts:
- name: espocrm-data
mountPath: /var/www/html
volumes:
- name: espocrm-data
persistentVolumeClaim:
claimName: espocrm-pvc

View File

@ -0,0 +1,34 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: espocrm
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8
env:
- name: MYSQL_ROOT_PASSWORD
value: root_password
- name: MYSQL_DATABASE
value: espocrm
- name: MYSQL_USER
value: espocrm
- name: MYSQL_PASSWORD
value: database_password
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-pvc

View File

@ -0,0 +1,27 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: espocrm-ingress
namespace: espocrm
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
# nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
nginx.ingress.kubernetes.io/enable-websockets: "true"
spec:
ingressClassName: nginx
tls:
- hosts:
- espocrm.avgc.org
secretName: espocrm-tls
rules:
- host: espocrm.avgx.org
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: espocrm
port:
number: 80

View File

@ -0,0 +1,14 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: espocrm
resources:
- namespace.yaml
- deployments/espocrm.yaml
- deployments/mysql.yaml
- services/espocrm.yaml
- services/mysql.yaml
- pvc/espocrm-pvc.yaml
- pvc/mysql-pvc.yaml
- ingress/ingress.yaml

View File

@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: espocrm

View File

@ -0,0 +1,12 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: espocrm-pvc
namespace: espocrm
spec:
accessModes:
- ReadWriteOnce
storageClassName: nfs-manabo
resources:
requests:
storage: 1Gi

View File

@ -0,0 +1,12 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
namespace: espocrm
spec:
accessModes:
- ReadWriteOnce
storageClassName: nfs-manabo
resources:
requests:
storage: 1Gi

View File

@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: espocrm
namespace: espocrm
spec:
selector:
app: espocrm
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP

View File

@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: espocrm
spec:
selector:
app: mysql
ports:
- protocol: TCP
port: 3306
targetPort: 3306
clusterIP: None

50
k8s-harbor/values.yaml Normal file
View File

@ -0,0 +1,50 @@
expose:
type: ingress
tls:
enabled: true
certSource: auto
ingress:
ingressClassName: nginx
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
hosts:
core: harbor.manabo.org
notary: notary.harbor.manabo.org
externalURL: https://harbor.manabo.org
persistence:
enabled: true
resourcePolicy: "keep"
persistentVolumeClaim:
registry:
storageClass: "nfs-manabo"
chartmuseum:
storageClass: "nfs-manabo"
jobservice:
storageClass: "nfs-manabo"
database:
storageClass: "nfs-manabo"
redis:
storageClass: "nfs-manabo"
trivy:
storageClass: "nfs-manabo"
harborAdminPassword: Harbor12345
portal:
replicaCount: 1
core:
replicaCount: 1
registry:
replicaCount: 1
database:
type: internal
internal:
password: "root123"
redis:
type: internal

View File

@ -1,20 +1,20 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: gitea
namespace: argocd
spec:
project: default
source:
repoURL: 'http://192.168.1.9:30300/xavor/k8s-gitea.git'
targetRevision: HEAD
path: .
destination:
server: 'https://kubernetes.default.svc'
namespace: gitea
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: gitea
namespace: argocd
spec:
project: default
source:
repoURL: 'http://192.168.1.10:30300/xavor/k8s-gitea.git'
targetRevision: HEAD
path: .
destination:
server: 'https://kubernetes.default.svc'
namespace: gitea
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true

View File

@ -6,7 +6,7 @@ metadata:
spec:
project: default
source:
repoURL: 'http://192.168.1.9:30300/xavor/k8s-guacamole.git'
repoURL: 'http://192.168.1.10:30300/xavor/k8s-guacamole.git'
targetRevision: HEAD
path: .
destination:

View File

@ -6,7 +6,7 @@ metadata:
spec:
project: default
source:
repoURL: 'http://192.168.1.9:30300/xavor/k8s-ingress-controller.git'
repoURL: 'http://192.168.1.10:30300/xavor/k8s-ingress-controller.git'
targetRevision: HEAD
path: .
destination:

View File

@ -6,7 +6,7 @@ metadata:
spec:
project: default
source:
repoURL: 'http://192.168.1.9:30300/xavor/k8s-kubevirt-isoserver.git'
repoURL: 'http://192.168.1.10:30300/xavor/k8s-kubevirt-isoserver.git'
targetRevision: HEAD
path: .
destination:

View File

@ -0,0 +1,20 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: kubevirt-manager
namespace: argocd
spec:
project: default
source:
repoURL: 'http://192.168.1.10:30300/xavor/k8s-kubevirt-manager.git'
targetRevision: HEAD
path: .
destination:
server: 'https://kubernetes.default.svc'
namespace: kubevirt
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true

View File

@ -6,7 +6,7 @@ metadata:
spec:
project: default
source:
repoURL: 'http://192.168.1.9:30300/xavor/k8s-storage.git'
repoURL: 'http://192.168.1.10:30300/xavor/k8s-storage.git'
targetRevision: HEAD
path: .
destination:

View File

@ -0,0 +1,20 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: k8s-vm-windows-demo
namespace: argocd
spec:
project: default
source:
repoURL: 'http://192.168.1.10:30300/xavor/k8s-vm-windows-demo.git'
targetRevision: HEAD
path: .
destination:
server: 'https://kubernetes.default.svc'
namespace: k8s-vm-windows-demo
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true

View File

@ -6,7 +6,7 @@ metadata:
spec:
project: default
source:
repoURL: 'http://192.168.1.9:30300/xavor/k8s-vscode.git'
repoURL: 'http://192.168.1.10:30300/xavor/k8s-vscode.git'
targetRevision: HEAD
path: .
destination:

View File

@ -1,16 +1,29 @@
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
name: windows-disk
name: windows-iso
namespace: k8s-vm-windows-demo
spec:
source:
http:
url: "https://isoserver.manabo.org/Windows.iso"
url: "http://192.168.1.10:30088/Windows.iso"
pvc:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 60Gi
storage: 6Gi
storageClassName: nfs-manabo
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: winhd
namespace: k8s-vm-windows-demo
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 60Gi
storageClassName: nfs-manabo

View File

@ -4,3 +4,4 @@ resources:
- namespace.yaml
- virtual-machine.yaml
- data-volume.yaml
- nad-administracion.yaml

View File

@ -0,0 +1,15 @@
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
name: administracion-net
namespace: k8s-vm-windows-demo
spec:
config: '{
"cniVersion": "0.3.1",
"type": "macvlan",
"master": "br0",
"mode": "bridge",
"ipam": {
"type": "dhcp"
}
}'

View File

@ -4,7 +4,7 @@ metadata:
name: windows-demo
namespace: k8s-vm-windows-demo
spec:
running: true
runStrategy: Always
template:
metadata:
labels:
@ -13,38 +13,41 @@ spec:
domain:
cpu:
cores: 2
resources:
requests:
memory: 4Gi
devices:
disks:
- name: cdromiso
cdrom:
bus: sata
readonly: true
bootOrder: 1
- name: virtiocontainerdisk
cdrom:
bus: sata
readonly: true
- name: harddrive
disk:
bus: virtio
- disk:
bus: virtio
name: cloudinitdisk
bootOrder: 2
interfaces:
- name: default
masquerade: {}
- name: administracion
bridge: {}
model: virtio
machine:
type: q35
resources:
requests:
memory: 4Gi
networks:
- name: administracion
multus:
networkName: k8s-vm-windows-demo/administracion-net
volumes:
- name: cdromiso
containerDisk:
image: kubevirt/cirros-container-disk-demo # se reemplazará en DataVolume
- name: harddrive
dataVolume:
name: windows-disk
- name: cloudinitdisk
cloudInitNoCloud:
userData: |
#cloud-config
password: "Windows1234"
chpasswd: { expire: False }
networks:
- name: default
pod: {}
name: windows-iso
- name: harddrive
persistentVolumeClaim:
claimName: winhd
- name: virtiocontainerdisk
containerDisk:
image: kubevirt/virtio-container-disk

View File

@ -12,13 +12,16 @@ Este repositorio está orientado tanto a **homelabs avanzados** como a entornos
|--------|-------------|
| [📘 Guía de instalación](docs/guia-instalacion.md) | Paso a paso para desplegar el clúster completo. |
| [🏗️ Arquitectura del clúster](docs/arquitectura.md) | Estructura lógica, roles de nodos y servicios desplegados. |
| [🌐 Direccionamiento y Redes](docs/direccionamiento.md) | Asignación de IPs, segmentación de redes y VLANs. |
| [🛠️ Herramientas auxiliares](docs/herramientas-auxiliares.md) | Scripts para automatizar tareas como publicar, clonar o subir repos. |
| [📚 Procedimientos adicionales](docs/procedimientos-adicionales.md) | Tareas puntuales como eliminar namespaces atascados o cargas manuales. |
| [📋 Comandos Kubernetes básicos](docs/chuletario.md) | Referencia rápida de comandos `kubectl` y `virtctl` más usados. |
---
## ⚙️ Componentes clave del clúster
- **Separación de redes**: tráfico de gestión, almacenamiento e internodo aislados por VLANs.
- **Alta disponibilidad** con IP flotante (`keepalived`) y bonding de red (`bond0`)
- **K3s cluster** en `tartaro`, `styx` y `niflheim` (dedicado a almacenamiento)
- **ZFS + NFS** como backend de almacenamiento
@ -28,6 +31,7 @@ Este repositorio está orientado tanto a **homelabs avanzados** como a entornos
- **KubeVirt** para gestionar VMs dentro de Kubernetes
- **Apache Guacamole** para acceso remoto a escritorios vía navegador
- **VS Code Server** desplegado como pod accesible por Ingress
- **Harbor** como registro de contenedores privado desplegado en Kubernetes
---
@ -36,6 +40,8 @@ Este repositorio está orientado tanto a **homelabs avanzados** como a entornos
Estructura del repositorio:
- docs/: Carpeta de documentación con guías y herramientas auxiliares.
- guia-instalacion.md: Manual paso a paso para desplegar todo el clúster.
- direccionamiento-redes.md: Detalle de la segmentación IP y VLANes.
- comandos-kubectl.md: Comandos frecuentes de gestión Kubernetes y KubeVirt.
- herramienta git-publish.md: Explica el script para publicar repositorios individuales en Gitea.
- herramienta publicar-todos.md: Script para publicar todos los manifiestos del clúster de forma masiva.
- herramienta git-subirtodos.md: Sube todos los cambios a los repositorios remotos.
@ -45,6 +51,7 @@ Estructura del repositorio:
- k8s-cert-manager/: Manifiestos para instalar cert-manager, incluyendo ClusterIssuer de staging y producción.
- k8s-gitea/: Manifiestos para desplegar Gitea y su base de datos con almacenamiento persistente y acceso externo.
- k8s-guacamole/: Manifiestos para desplegar Apache Guacamole con autenticación MySQL y acceso vía Ingress.
- k8s-harbor/: Manifiestos para desplegar Harbor como registro de contenedores privado.
- k8s-ingress-controller/: Despliegue de ingress-nginx como DaemonSet con configuración personalizada, RBAC, y service.
- k8s-kubevirt-isoserver/: Servidor HTTP que expone imágenes ISO para KubeVirt, con su PVC y despliegue.
- k8s-kubevirt-manager/: Despliegue opcional del panel web de KubeVirt con su acceso Ingress y RBAC.
@ -94,5 +101,6 @@ Repositorio privado/documentado en [https://git.manabo.org](https://git.manabo.o
✅ Almacenamiento replicado
✅ App of Apps en Argo CD
✅ Acceso remoto vía Guacamole
✅ Registro de contenedores privado con Harbor
☑️ Próximos pasos: integración con FreeIPA, backups, y monitorización