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.
Table of Contents
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.