# Guide Utilisateur kubectl - Cluster RBER

## Introduction

Ce guide explique comment configurer et utiliser `kubectl` pour accéder aux applications hébergées sur le cluster Kubernetes RBER.

Avec cet accès, tu peux :
- Voir l'état des applications (pods, services)
- Consulter les logs
- Redémarrer des applications (selon ton rôle)
- Accéder aux bases de données via port-forward

---

## 1. Prérequis

### 1.1 Fichiers reçus

Tu as reçu un fichier d'accès :
- `ton-nom.kubeconfig.gpg` (chiffré) — nécessite le mot de passe fourni séparément
- ou `ton-nom.kubeconfig` (non chiffré)

### 1.2 Logiciels nécessaires

| Logiciel | Obligatoire | Description |
|----------|-------------|-------------|
| kubectl  | Oui | Client Kubernetes |
| gpg      | Si fichier .gpg | Pour déchiffrer le fichier |

---

## 2. Installation de kubectl

### Ubuntu / Debian

```bash
# Télécharger
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

# Rendre exécutable
chmod +x kubectl

# Déplacer dans le PATH
sudo mv kubectl /usr/local/bin/

# Vérifier
kubectl version --client
```

### macOS

```bash
# Avec Homebrew
brew install kubectl

# Vérifier
kubectl version --client
```

### Windows

```powershell
# Avec Chocolatey (PowerShell administrateur)
choco install kubernetes-cli

# Vérifier
kubectl version --client
```

---

## 3. Configuration de l'accès

### 3.1 Déchiffrer le fichier (si .gpg)

```bash
# Installer GPG si nécessaire
# Ubuntu: sudo apt install gnupg
# macOS: brew install gnupg

# Déchiffrer (saisir le mot de passe fourni)
gpg --decrypt ton-nom.kubeconfig.gpg > ton-nom.kubeconfig
```

### 3.2 Installer le fichier kubeconfig

```bash
# Créer le dossier .kube
mkdir -p ~/.kube

# Copier le fichier
cp ton-nom.kubeconfig ~/.kube/config-rber

# Sécuriser les permissions
chmod 600 ~/.kube/config-rber
```

### 3.3 Configurer la variable d'environnement

```bash
# Définir la variable
export KUBECONFIG=~/.kube/config-rber

# Rendre permanent (ajouter au .bashrc ou .zshrc)
echo 'export KUBECONFIG=~/.kube/config-rber' >> ~/.bashrc
source ~/.bashrc
```

### 3.4 Vérifier la connexion

```bash
# Tester
kubectl get pods

# Voir tes droits
kubectl auth can-i --list

# Contexte actuel
kubectl config current-context
```

---

## 4. Commandes de base

### 4.1 Voir les ressources

```bash
# Lister les pods (applications)
kubectl get pods

# Lister les services
kubectl get svc

# Lister les deployments
kubectl get deployments

# Lister les ingress (URLs)
kubectl get ingress

# Voir toutes les ressources
kubectl get all
```

### 4.2 Détails d'une ressource

```bash
# Détails d'un pod
kubectl describe pod nom-du-pod

# Détails d'un service
kubectl describe svc nom-du-service

# Détails d'un deployment
kubectl describe deployment nom-du-deployment
```

### 4.3 Logs

```bash
# Logs d'un pod
kubectl logs nom-du-pod

# Logs en temps réel (suivre)
kubectl logs -f nom-du-pod

# Dernières 100 lignes
kubectl logs nom-du-pod --tail=100

# Logs du pod précédent (après crash)
kubectl logs nom-du-pod --previous

# Logs de tous les pods d'une application
kubectl logs -l app=moodle --all-containers
```

### 4.4 Accéder à un pod

```bash
# Ouvrir un shell dans le pod
kubectl exec -it nom-du-pod -- bash

# Si bash n'existe pas, essayer sh
kubectl exec -it nom-du-pod -- sh

# Exécuter une commande unique
kubectl exec nom-du-pod -- ls /var/www
```

### 4.5 Port-forward (accès local)

```bash
# Accéder à un service localement
kubectl port-forward svc/moodle 8080:80

# Puis ouvrir http://localhost:8080 dans ton navigateur

# Accéder à PostgreSQL
kubectl port-forward svc/uac-pg-cluster-rw 5432:5432

# Puis se connecter avec psql ou pgAdmin sur localhost:5432
```

---

## 5. Travailler avec plusieurs namespaces

Si tu as accès à plusieurs namespaces, tu peux naviguer entre eux.

### 5.1 Voir les contextes disponibles

```bash
kubectl config get-contexts

# Exemple de sortie :
# CURRENT   NAME                              CLUSTER     NAMESPACE
# *         jean.dupont-moodle-uac@rber-fidj  rber-fidj   moodle-uac
#           jean.dupont-moodle-una@rber-fidj  rber-fidj   moodle-una
```

### 5.2 Changer de contexte

```bash
# Basculer vers moodle-una
kubectl config use-context jean.dupont-moodle-una@rber-fidj

# Vérifier
kubectl config current-context
```

### 5.3 Spécifier le namespace directement

```bash
# Sans changer de contexte, utiliser -n
kubectl get pods -n moodle-uac
kubectl get pods -n moodle-una
kubectl logs -n moodle-una nom-du-pod
```

---

## 6. Cas d'usage courants

### 6.1 Vérifier si une application fonctionne

```bash
# Voir l'état des pods
kubectl get pods

# États possibles :
# - Running     : OK, l'application tourne
# - Pending     : En attente de ressources
# - Error       : Erreur
# - CrashLoop   : L'application redémarre en boucle

# Si problème, voir les détails
kubectl describe pod nom-du-pod

# Voir les logs
kubectl logs nom-du-pod
```

### 6.2 Redémarrer une application

```bash
# Redémarrer tous les pods d'un deployment
kubectl rollout restart deployment/moodle

# Suivre le redémarrage
kubectl rollout status deployment/moodle

# Vérifier que les nouveaux pods sont Running
kubectl get pods
```

### 6.3 Voir pourquoi un pod ne démarre pas

```bash
# Étape 1 : Voir l'état
kubectl get pods

# Étape 2 : Voir les events
kubectl describe pod nom-du-pod

# Regarder la section "Events" en bas

# Étape 3 : Si le pod a déjà démarré puis crashé
kubectl logs nom-du-pod --previous
```

### 6.4 Se connecter à la base de données

```bash
# Ouvrir un tunnel vers PostgreSQL
kubectl port-forward svc/uac-pg-cluster-rw 5432:5432

# Dans un autre terminal, se connecter
psql -h localhost -U moodleuser -d moodle

# Ou utiliser un outil graphique (pgAdmin, DBeaver) sur localhost:5432
```

### 6.5 Copier un fichier depuis/vers un pod

```bash
# Copier un fichier depuis le pod vers local
kubectl cp nom-du-pod:/chemin/fichier.log ./fichier.log

# Copier un fichier local vers le pod
kubectl cp ./mon-fichier.txt nom-du-pod:/tmp/mon-fichier.txt
```

---

## 7. Alias recommandés

Ajoute ces raccourcis à ton `~/.bashrc` ou `~/.zshrc` :

```bash
# Raccourcis kubectl
alias k='kubectl'
alias kgp='kubectl get pods'
alias kgs='kubectl get svc'
alias kgd='kubectl get deployments'
alias kgi='kubectl get ingress'
alias kga='kubectl get all'
alias kl='kubectl logs'
alias klf='kubectl logs -f'
alias ke='kubectl exec -it'
alias kd='kubectl describe'
alias kpf='kubectl port-forward'

# Autocomplétion (très utile !)
source <(kubectl completion bash)  # Pour bash
# source <(kubectl completion zsh)  # Pour zsh
```

Après modification :
```bash
source ~/.bashrc
```

Utilisation :
```bash
kgp              # = kubectl get pods
klf mon-pod      # = kubectl logs -f mon-pod
ke mon-pod bash  # = kubectl exec -it mon-pod bash
```

---

## 8. Résolution de problèmes

### Connexion refusée

```
Unable to connect to the server: dial tcp: lookup api.rber.bj: no such host
```

**Solutions :**
1. Vérifier ta connexion internet
2. Vérifier que le DNS résout : `nslookup api.rber.bj`
3. Tester la connectivité : `curl -k https://api.rber.bj:6443/healthz`

### Erreur de certificat

```
certificate signed by unknown authority
```

**Solutions :**
1. Le fichier kubeconfig est peut-être corrompu
2. Redemander un nouveau fichier à l'administrateur

### Permission denied

```
Error from server (Forbidden): pods is forbidden
```

**Solutions :**
1. Vérifier ton namespace : `kubectl config current-context`
2. Vérifier tes droits : `kubectl auth can-i --list`
3. Tu n'as peut-être pas accès à cette ressource - contacter l'administrateur

### Namespace incorrect

```
No resources found in default namespace
```

**Solutions :**
1. Tu es probablement dans le mauvais namespace
2. Vérifier : `kubectl config current-context`
3. Lister tes contextes : `kubectl config get-contexts`
4. Changer de contexte ou utiliser `-n namespace`

### Token expiré

```
error: You must be logged in to the server (Unauthorized)
```

**Solutions :**
1. Ton token a peut-être expiré
2. Contacter l'administrateur pour obtenir un nouveau fichier kubeconfig

---

## 9. Référence rapide

### Commandes essentielles

| Action | Commande |
|--------|----------|
| Lister les pods | `kubectl get pods` |
| Logs d'un pod | `kubectl logs <pod>` |
| Logs en temps réel | `kubectl logs -f <pod>` |
| Entrer dans un pod | `kubectl exec -it <pod> -- bash` |
| Détails d'un pod | `kubectl describe pod <pod>` |
| Redémarrer | `kubectl rollout restart deployment/<nom>` |
| Port-forward | `kubectl port-forward svc/<svc> 8080:80` |
| Changer namespace | `kubectl config use-context <contexte>` |

### États des pods

| État | Signification |
|------|---------------|
| Running | OK, fonctionne |
| Pending | En attente (ressources, stockage) |
| ContainerCreating | Téléchargement de l'image |
| Error | Erreur au démarrage |
| CrashLoopBackOff | Crash répété |
| Terminating | En cours d'arrêt |

---

## 10. Contact et support

En cas de problème :

- **Email** : devops@rber.bj
- **Documentation** : https://docs.rber.bj

Informations à fournir :
1. Ton nom d'utilisateur
2. Le namespace concerné
3. La commande exécutée
4. Le message d'erreur complet

---

*Guide utilisateur kubectl RBER - Version 1.0 - Janvier 2026*