From 9c1f0b975ab24cdffeef28679fe15cf950b925f8 Mon Sep 17 00:00:00 2001 From: xguefer Date: Wed, 20 Aug 2025 01:31:47 +0200 Subject: [PATCH] =?UTF-8?q?a=C3=B1adido=20vscode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vscode/deployments/vscode.yaml | 30 ++++++ vscode/ingress/ingress.yaml | 25 +++++ vscode/kustomization.yaml | 6 ++ vscode/namespace.yaml | 4 + vscode/pvc/vscode-pvc.yaml | 12 +++ vscode/readme.md | 174 +++++++++++++++++++++++++++++++++ vscode/services/vscode.yaml | 12 +++ 7 files changed, 263 insertions(+) create mode 100644 vscode/deployments/vscode.yaml create mode 100644 vscode/ingress/ingress.yaml create mode 100644 vscode/kustomization.yaml create mode 100644 vscode/namespace.yaml create mode 100644 vscode/pvc/vscode-pvc.yaml create mode 100644 vscode/readme.md create mode 100644 vscode/services/vscode.yaml diff --git a/vscode/deployments/vscode.yaml b/vscode/deployments/vscode.yaml new file mode 100644 index 0000000..a300d36 --- /dev/null +++ b/vscode/deployments/vscode.yaml @@ -0,0 +1,30 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: vscode + namespace: vscode +spec: + replicas: 1 + selector: + matchLabels: + app: vscode + template: + metadata: + labels: + app: vscode + spec: + containers: + - name: vscode + image: xavor/vscode-custom:latest + ports: + - containerPort: 8443 + env: + - name: PASSWORD + value: "Pozuelo12345" + volumeMounts: + - mountPath: /home/coder/project + name: vscode-data + volumes: + - name: vscode-data + persistentVolumeClaim: + claimName: vscode-data diff --git a/vscode/ingress/ingress.yaml b/vscode/ingress/ingress.yaml new file mode 100644 index 0000000..45e6c05 --- /dev/null +++ b/vscode/ingress/ingress.yaml @@ -0,0 +1,25 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: vscode + namespace: vscode + annotations: + cert-manager.io/cluster-issuer: "letsencrypt-prod" + nginx.ingress.kubernetes.io/backend-protocol: "HTTP" +spec: + ingressClassName: nginx + tls: + - hosts: + - vscode.c2et.net + secretName: vscode-tls + rules: + - host: vscode.c2et.net + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: vscode + port: + number: 8080 diff --git a/vscode/kustomization.yaml b/vscode/kustomization.yaml new file mode 100644 index 0000000..119d95b --- /dev/null +++ b/vscode/kustomization.yaml @@ -0,0 +1,6 @@ +resources: + - namespace.yaml + - pvc/vscode-pvc.yaml + - deployments/vscode.yaml + - services/vscode.yaml + - ingress/ingress.yaml diff --git a/vscode/namespace.yaml b/vscode/namespace.yaml new file mode 100644 index 0000000..390a1aa --- /dev/null +++ b/vscode/namespace.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: vscode diff --git a/vscode/pvc/vscode-pvc.yaml b/vscode/pvc/vscode-pvc.yaml new file mode 100644 index 0000000..81bfe42 --- /dev/null +++ b/vscode/pvc/vscode-pvc.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: vscode-data + namespace: vscode +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 5Gi + storageClassName: ceph-rbd diff --git a/vscode/readme.md b/vscode/readme.md new file mode 100644 index 0000000..cd802a5 --- /dev/null +++ b/vscode/readme.md @@ -0,0 +1,174 @@ +# VS Code Server en Kubernetes + +## 1) Resumen ejecutivo + +Hemos desplegado un **servidor de Visual Studio Code (VS Code) dentro del clúster Kubernetes**. Esto permite a cualquier miembro autorizado del equipo **desarrollar desde el navegador**, sin instalar IDEs localmente, con el código y las herramientas **co‑localizadas junto a los servicios** del propio clúster. + +**Beneficios clave** + +* Acceso vía web segura (HTTPS) desde cualquier lugar. +* Misma experiencia que VS Code de escritorio (extensiones, terminal, Git, depuración). +* Entorno homogéneo para todo el equipo (misma versión, mismas herramientas, mismas extensiones). +* Menos fricción en equipos con políticas corporativas estrictas o dispositivos bloqueados. +* Cercanía al clúster → menos latencia en depuración y herramientas CLI. + +--- + +## 2) ¿Para qué sirve? + +* **Edición de código** de repositorios alojados en nuestro Git (pull/push desde el propio IDE). +* **Terminal integrada** para ejecutar `kubectl`, `helm`, `make`, `npm`, etc. +* **Depuración remota** de servicios corriendo en el clúster. +* **Formación y soporte**: un entorno único para demos, pair programming y sesiones prácticas. + +--- + +## 3) ¿Cómo se usa (alto nivel)? + +1. Navegar a: `https://code.` (tenemos Ingress + cert-manager con TLS). +2. **Autenticarse** (usuario/contraseña o SSO si lo integramos con el proveedor corporativo). +3. Abrir carpeta/proyecto: `File → Open Folder…` (o clonar con Git desde la terminal). +4. Instalar extensiones necesarias (Kubernetes, YAML, Docker, Go, Java, Python, etc.). +5. Usar la **terminal** integrada para comandos habituales (`kubectl`, `git`, etc.). + +> Nota: La experiencia es equivalente a VS Code de escritorio, pero **sin instalar nada** en el equipo del usuario. + +--- + +## 4) Arquitectura (resumen) + +* **Deployment** (uno o varios pods) con la imagen de VS Code Server. +* **Service** (ClusterIP / NodePort de respaldo) + **Ingress** público `code.` con TLS (Let’s Encrypt / `ClusterIssuer`). +* **PVC** para **persistir** extensiones, configuración del usuario y cachés. +* **ConfigMap/Secret** para parámetros (password/SSO, ajustes, etc.). + +Diagrama lógico (simplificado): + +``` +User (navegador HTTPS) + │ + Ingress (nginx/haproxy) ──► Service ──► Pod VS Code Server + │ + └── PVC (datos usuario / extensiones) +``` + +--- + +## 5) Despliegue + +Repositorio con manifiestos **Kustomize**. Para (re)desplegar: + +```bash +kubectl apply -k . +``` + +Estructura típica: + +``` +./ +├─ namespace/ +├─ deployment/ +├─ service/ +├─ ingress/ +├─ pvc/ +└─ kustomization.yaml +``` + +Variables comunes (ejemplos): + +* Host: `code.` +* Clase de Ingress: `nginx` +* Certificados: `letsencrypt-prod` + +--- + +## 6) Seguridad + +* **TLS** extremo a extremo (HTTPS) gestionado por cert-manager. +* **Autenticación**: contraseña fuerte por `Secret` o **SSO** (OIDC con el IdP corporativo / Keycloak / FreeIPA, etc.). +* **NetworkPolicies** (opcional) para limitar tráfico en el namespace. +* **RBAC**: acceso al namespace controlado; el pod no necesita privilegios del clúster. +* **Backups** del PVC (ver §9). + +Buenas prácticas mínimas: + +* Rotar credenciales/secrets. +* Activar **HSTS** en Ingress. +* Limitar tamaño de subida y tiempo de sesión si es necesario. + +--- + +## 7) Experiencia y “maravillas” de trabajar en VS Code (en web) + +* **Extensiones**: Marketplace completo (Kubernetes, ESLint, Prettier, GitLens, Python, Java, Go, etc.). +* **DevContainers (opcional)**: reproducibilidad total del entorno. +* **Live Share**: colaboración en tiempo real. +* **Remote Tunnels / SSH**: conectar a otros entornos si se requiere. +* **Terminal** multi‑shell con historial y tareas automatizadas. +* **Editor web**: todo en el navegador, sin instalaciones locales. + +--- + +## 8) Operación diaria (rápida) + +* **Login**: `https://code.`. +* **Abrir proyecto**: clonar o abrir carpeta local del contenedor. +* **Sincronizar**: `git pull / git push` desde Source Control o terminal. +* **Kubernetes**: extensiones + contexto `kubectl` ya disponible en el pod. +* **Extensiones**: instalar/actualizar según proyecto. + +--- + +## 9) Mantenimiento y backups + +* **Logs**: `kubectl logs -l app=vscode -f`. +* **Reinicio**: `kubectl rollout restart deployment/vscode`. +* **Actualización de imagen**: cambiar tag en el `Deployment` y `kubectl apply -k .`. +* **Backup del PVC**: incluir el claim en la política de copias (snapshot CSI o rsync/velero según plataforma). + +--- + +## 10) Coste y recursos + +* **CPU/RAM**: dimensionar requests/limits (p. ej. 500m–2 vCPU / 1–4 GB RAM por usuario). +* **Almacenamiento**: PVC 5–20 GB por usuario (extensiones y cachés). +* **Escalado**: múltiples réplicas (por usuario/grupo) o varios deployments por equipos. + +--- + +## 11) Preguntas frecuentes + +**¿Puedo usarlo sin instalar nada?** Sí, solo hace falta un navegador moderno. + +**¿Y si mi portátil está “capado” o es poco potente?** No hay problema: el trabajo pesado ocurre en el clúster. + +**¿Se integra con nuestro Git?** Sí. Puedes autenticarte con tokens/SSH y trabajar con ramas, PRs, etc. + +**¿Es seguro exponerlo a Internet?** Con TLS, autenticación robusta y buenas prácticas, sí. Recomendado usar SSO corporativo y aplicar WAF/límites si es público. + +**¿Qué pasa si el pod reinicia?** La configuración y extensiones persisten en el **PVC**. + +--- + +## 12) Anexo — Comandos útiles + +```bash +# Desplegar/actualizar +kubectl apply -k . + +# Ver recursos +kubectl get all -n + +# Logs en tiempo real +kubectl logs -l app=vscode -n -f + +# Reiniciar deployment +kubectl rollout restart deployment/vscode -n + +# Describir ingress +kubectl describe ingress vscode -n +``` + +--- + +> **Estado actual**: Servicio desplegado y accesible por Ingress con TLS. Pendiente/En curso: integración SSO (si aplica) y política de backups del PVC. diff --git a/vscode/services/vscode.yaml b/vscode/services/vscode.yaml new file mode 100644 index 0000000..dffb694 --- /dev/null +++ b/vscode/services/vscode.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: vscode + namespace: vscode +spec: + type: ClusterIP + selector: + app: vscode + ports: + - port: 8080 + targetPort: 8080