Digital Ocean Kubernetes Services

Documentation Déploiement Kubernetes sur DigitalOcean

Ce document détaille les étapes pour configurer un cluster Kubernetes sur DigitalOcean avec doctl, déployer une application web pour l'entreprise fictive ALPHA sur tk.skyfik.net, configurer un Service Kubernetes, un Ingress, et des certificats TLS avec cert-manager tout en utilisant le registre de conteneurs de Digital Ocean

Prérequis

  • Un compte DigitalOcean avec un cluster Kubernetes (k8s-imad) et un registre de conteneurs (imad-cr).

  • doctl installé via snap.

  • kubectl et helm installés.

  • Outils supplémentaires : vim, k9s (facultatif, pour l'interface de gestion Kubernetes).

  • Un domaine (tk.skyfik.net) configuré dans le DNS pour pointer vers l'adresse IP du service NGINX Ingress.

Étapes de configuration

1. Installation et configuration de doctl

Docs officiellle

Initialiser l'authentification :

doctl auth init

Fournir le token d'accès DigitalOcean.

Vérifier les comptes configurés :

doctl auth list

Obtenir les informations du compte :

doctl account get

Connexion au registre de conteneurs DigitalOcean ( si vous utiliser le registry digital ocean ) :

doctl registry login

Connecter doctl à Docker :

sudo snap connect doctl:dot-docker

Vérifier les secrets du registre dans Kubernetes :

kubectl get secret -n default | grep registry

Vérifie la présence du secret registry-imad-cr.

2. Configuration du cluster Kubernetes

Créer un répertoire de travail :

mkdir DOKS && cd DOKS

Sauvegarder la configuration kubeconfig du cluster :

doctl kubernetes cluster kubeconfig save k8s-imad

Enregistre la configuration du cluster k8s-imad dans ~/.kube/config.

Vérifier les nœuds du cluster :

kubectl get nodes

Lister les namespaces :

kubectl get namespaces

Utiliser k9s pour gérer le cluster si installé(facultatif) :

k9s

Ouvre l'interface k9s pour gérer le cluster.

3. Création et déploiement de l'application web

Créer la structure de répertoires pour l'application :

mkdir -p alpha-web/html
cd alpha-web/

Créer le fichier html/index.html :

vim html/index.html

Contenu du fichier :

html/index.html
<!DOCTYPE html>
<html lang="fr">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Pagé via DOKS</title>
  <script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-100 flex flex-col items-center justify-center min-h-screen">
  <div class="bg-white p-8 rounded-lg shadow-lg text-center max-w-2xl">
    <img src="https://via.placeholder.com/150" alt="ALPHA Logo" class="mx-auto mb-6">
    <h1 class="text-4xl font-bold text-blue-800 mb-4">Bienvenue sur cette page</h1>
    <p class="text-lg text-gray-600 mb-8">Page de Test de déploiement</p>
    <div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
      <a href="https://cloud.skyfik.net" class="bg-blue-600 text-white px-6 py-3 rounded-lg hover:bg-blue-700 transition">Cloud</a>
      <a href="https://webmail.skyfik.net" class="bg-blue-600 text-white px-6 py-3 rounded-lg hover:bg-blue-700 transition">Webmail pour employés</a>
      <a href="https://sentinel.skyfik.net" class="bg-blue-600 text-white px-6 py-3 rounded-lg hover:bg-blue-700 transition">Centre de contrôle</a>
      <a href="https://supervision.skyfik.net" class="bg-blue-600 text-white px-6 py-3 rounded-lg hover:bg-blue-700 transition">Supervision</a>
    </div>
  </div>
</body>
</html>

Créer un fichier Dockerfile :

vim Dockerfile

Contenu du fichier :

FROM nginx:latest
COPY html /usr/share/nginx/html
EXPOSE 80

Construire l'image Docker :

docker build -t pa-alpha-site:latest .

Tagger l'image pour le registre DigitalOcean :

docker tag pa-alpha-site:latest registry.digitalocean.com/imad-cr/pa-alpha-site:latest

Pousser l'image vers le registre :

docker push registry.digitalocean.com/imad-cr/pa-alpha-site:latest

4. Déploiement de l'application sur Kubernetes

Créer un fichier deployment.yaml :

vim deployment.yaml

Contenu du fichier :

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: alpha-web
spec:
  replicas: 2
  selector:
    matchLabels:
      app: alpha-web
  template:
    metadata:
      labels:
        app: alpha-web
    spec:
      imagePullSecrets:
      - name: registry-imad-cr
      containers:
      - name: alpha-web
        image: registry.digitalocean.com/imad-cr/pa-alpha-site:latest
        ports:
        - containerPort: 80

Créer un fichier service.yaml :

vim service.yaml

Contenu du fichier :

service.yaml
apiVersion: v1
kind: Service
metadata:
  name: alpha-web-service
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: alpha-web

Appliquer les configurations :

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

Vérifier le déploiement et le service :

kubectl get deployment
kubectl get services

5. Configuration de l'Ingress avec TLS

Installer le contrôleur NGINX Ingress :

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install nginx-ingress ingress-nginx/ingress-nginx --set controller.publishService.enabled=true

Vérifier le service NGINX Ingress :

kubectl --namespace default get services -o wide -w nginx-ingress-ingress-nginx-controller

Créer un fichier certificat.yaml pour cert-manager :

vim certificat.yaml

Contenu du fichier :

certificat.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    email: [email protected]
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-prod-private-key
    solvers:
    - http01:
        ingress:
          class: nginx

Installer cert-manager :

kubectl create namespace cert-manager
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager --namespace cert-manager --version v1.10.1 --set installCRDs=true

Appliquer le ClusterIssuer :

kubectl apply -f certificat.yaml

Créer un fichier ingress.yaml :

vim ingress.yaml

Contenu du fichier :

ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alpha-web-ingress
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - tk.skyfik.net
    secretName: alpha-web-tls
  rules:
  - host: tk.skyfik.net
    http:
      paths:
      - path: "/"
        pathType: Prefix
        backend:
          service:
            name: alpha-web-service
            port:
              number: 80

Appliquer l'Ingress :

kubectl apply -f ingress.yaml

Vérifier l'état des ressources :

kubectl get pods
kubectl get svc
kubectl get ingress
kubectl describe certificate alpha-web-tls

6. Configuration DNS

  • Configurez le domaine tk.skyfik.net dans votre fournisseur DNS pour pointer vers l'adresse IP publique du service nginx-ingress-ingress-nginx-controller.

  • Obtenez l'IP du Load Balancer avec :

    kubectl get svc nginx-ingress-ingress-nginx-controller -o wide

7. Dépannage

  • Vérifier les logs d'un pod :

    kubectl logs -l app=alpha-web
  • Détailler l'Ingress :

    kubectl describe ingress alpha-web-ingress
  • Vérifier les événements du certificat :

    kubectl describe certificate alpha-web-tls
  • Problèmes de registre : Assurez-vous que le secret registry-imad-cr existe :

    kubectl get secret | grep registry-imad-cr

Structure des fichiers

Dans le répertoire DOKS/alpha-web/ :

imad@terraform:~/DOKS/alpha-web# sudo ls -1
Dockerfile
certificat.yaml
deployment.yaml
html
ingress.yaml
service.yaml

Architecture

[Pods (alpha-web)] --> [Service (alpha-web-service)] --> [Ingress (alpha-web-ingress)] --> [Cert-Manager (TLS)]

Conclusion

Cette configuration déploie une application web sur un cluster Kubernetes DigitalOcean, accessible via tk.skyfik.net avec un certificat TLS fourni par Let's Encrypt. Utilisez k9s ou kubectl pour surveiller et gérer vos ressources.

Last updated

Was this helpful?