K8S – Création d’un Pod Kubernetes avec Accès Shell au Nœud Hôte

L’orchestration de conteneurs avec Kubernetes offre une multitude de fonctionnalités puissantes, notamment la possibilité d’exécuter des commandes directement sur le nœud hôte depuis un pod. Cet article détaille comment configurer un pod Kubernetes qui peut exécuter des commandes shell directement sur le nœud hôte, en utilisant nsenter pour accéder à différents espaces de noms du système d’exploitation sous-jacent.

Pourquoi Utiliser un Pod avec Accès au Shell du Nœud?

Il peut être nécessaire de dépanner ou de gérer le système sous-jacent directement, en particulier dans les scénarios où des conteneurs ou des pods ne se comportent pas comme prévu. Cependant, cette méthode doit être utilisée avec prudence car elle expose un niveau d’accès très élevé au nœud et peut potentiellement compromettre la sécurité.

Un cas d’utilisation très simple est celui où, suite à une erreur de configuration, vous perdez l’accès SSH sur le noeud mais vous avez encore accès à kubectl, cette méthode vous permet alors de retrouver l’accès SSH sur le noeud en question via un pod.

Configuration du Pod

Le YAML suivant définit un pod node-nsenter dans l’espace de noms kube-system, configuré pour exécuter nsenter avec un accès étendu aux ressources système du nœud sur lequel il est exécuté.

apiVersion: v1
kind: Pod
metadata:
  name: node-nsenter
  namespace: kube-system
spec:
  volumes:
    - name: kube-api-access-sk8fw
      projected:
        sources:
          - serviceAccountToken:
              expirationSeconds: 3607
              path: token
          - configMap:
              name: kube-root-ca.crt
              items:
                - key: ca.crt
                  path: ca.crt
          - downwardAPI:
              items:
                - path: namespace
                  fieldRef:
                    apiVersion: v1
                    fieldPath: metadata.namespace
        defaultMode: 420
  containers:
    - name: shell
      image: docker.io/alpine:3.13
      command:
        - nsenter
      args:
        - '-t'
        - '1'
        - '-m'
        - '-u'
        - '-i'
        - '-n'
        - sleep
        - '14000'
      volumeMounts:
        - name: kube-api-access-sk8fw
          readOnly: true
          mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      securityContext:
        privileged: true
  restartPolicy: Never
  nodeName: srv-master
  hostNetwork: true
  hostPID: true
  hostIPC: true
  tolerations:
    - operator: Exists
  priorityClassName: system-node-critical

Détails Importants de la Configuration

  • Volumes et Montages: Le pod utilise des volumes projetés pour accéder aux secrets de l’API Kubernetes, ce qui lui permet de s’authentifier et d’interagir avec l’API du cluster.
  • Commande et Arguments: nsenter est configuré pour s’attacher à tous les espaces de noms du processus init (PID 1), ce qui permet un contrôle complet sur le nœud.
  • Contexte de Sécurité: Le conteneur est exécuté avec un contexte de sécurité privilégié, nécessaire pour effectuer des opérations qui affectent le système hôte.

Précautions de Sécurité

La configuration de ce pod avec un accès étendu au système hôte présente des risques de sécurité significatifs. Il est crucial de :

  • Limiter l’accès à ce pod aux utilisateurs et processus de confiance.
  • Surveiller activement l’utilisation de ce pod pour détecter les activités suspectes.
  • Envisager des audits de sécurité réguliers pour s’assurer que le pod n’est pas exploité à des fins malveillantes.

Conclusion

La création d’un pod avec accès shell au nœud hôte peut être extrêmement utile pour le dépannage et la gestion des environnements Kubernetes. Toutefois, cette puissance doit être équilibrée avec des contrôles de sécurité appropriés pour protéger les ressources du cluster. Utilisez cette configuration avec précaution et assurez-vous que seuls les utilisateurs autorisés et sécurisés peuvent accéder à ce type de pod.