Utiliser les conteneurs HostProcess Windows

Les conteneurs HostProcess / Privileged étendent le modèle de conteneur Windows pour permettre une plus large gamme de scénarios de gestion pour les clusters Kubernetes. Les conteneurs HostProcess s’exécutent directement sur l’hôte et conservent un comportement et un accès similaires à ceux d’un processus régulier. Les conteneurs HostProcess permettent aux utilisateurs d’empaqueter et de distribuer des opérations de gestion et des fonctionnalités qui nécessitent un accès à l’hôte tout en conservant le versioning et les méthodes de déploiement fournies par les conteneurs.

Un DaemonSet privilégié peut effectuer des modifications ou surveiller un hôte Linux sur Kubernetes, mais pas sur des hôtes Windows. Les conteneurs HostProcess sont l’équivalent Windows de l’élévation d’hôte.

Limites

  • Les conteneurs HostProcess nécessitent Kubernetes 1.23 ou une version ultérieure.
  • Les conteneurs HostProcess nécessitent containerd 1.6 ou un runtime de conteneur ultérieur.
  • Les pods HostProcess peuvent uniquement contenir des conteneurs HostProcess en raison d’une limitation du système d’exploitation Windows. Les conteneurs Windows non privilégiés ne peuvent pas partager une carte réseau virtuelle avec l’espace de noms d’IP hôte.
  • Les conteneurs HostProcess s’exécutent en tant que processus sur l’hôte. La seule isolation de ces conteneurs à partir de l’hôte est les contraintes de ressources imposées sur le compte d’utilisateur HostProcess.
  • L’isolation du système de fichiers et l’isolation Hyper-V ne sont pas prises en charge pour les conteneurs HostProcess.
  • Les montages de volume sont pris en charge et sont montés sous le volume de conteneur. Consultez Montages de volume.
  • Par défaut, un ensemble limité de comptes d’utilisateur hôte est disponible pour les conteneurs de processus hôte. Consultez Choisir un compte d’utilisateur.
  • Les limites de ressources telles que le disque, la mémoire et le nombre de processeurs fonctionnent de la même façon que les processus sur l’hôte.
  • Les montages de canaux nommés et les sockets de domaine Unix ne sont pas directement pris en charge, mais sont accessibles par leur chemin d’accès d'ordinateur hôte, par exemple \\.\pipe\*.

Exécuter une charge de travail HostProcess

Pour utiliser les fonctionnalités HostProcess avec votre déploiement, définissez hostProcess: true et hostNetwork: true :

    spec:
      ...
      securityContext:
         windowsOptions:
           hostProcess: true
           ...
      hostNetwork: true
      containers:
      ...

Pour exécuter un exemple de charge de travail qui utilise des fonctionnalités HostProcess sur un cluster AKS existant avec des nœuds Windows, créez hostprocess.yaml avec les éléments suivants :

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: privileged-daemonset
  namespace: kube-system
  labels:
    app: privileged-daemonset
spec:
  selector:
    matchLabels:
      app: privileged-daemonset
  template:
    metadata:
      labels:
        app: privileged-daemonset
    spec:
      nodeSelector:
        kubernetes.io/os: windows
      securityContext:
        windowsOptions:
          hostProcess: true
          runAsUserName: "NT AUTHORITY\\SYSTEM"
      hostNetwork: true
      containers:
        - name: powershell
          image: mcr.microsoft.com/powershell:lts-nanoserver-1809 # or lts-nanoserver-ltsc2022
          command:
            - powershell.exe
            - -Command
            - Start-Sleep -Seconds 2147483
      terminationGracePeriodSeconds: 0

Utilisez kubectl pour exécuter l’exemple de charge de travail :

kubectl apply -f hostprocess.yaml

Vous devez normalement voir la sortie suivante :

$ kubectl apply -f hostprocess.yaml
daemonset.apps/privileged-daemonset created

Vérifiez que votre charge de travail utilise les fonctionnalités des conteneurs HostProcess en affichant les journaux du pod.

Utilisez kubectl pour trouver le nom du pod dans l’espace de noms kube-system.

$ kubectl get pods --namespace kube-system

NAME                                  READY   STATUS    RESTARTS   AGE
...
privileged-daemonset-12345            1/1     Running   0          2m13s

Utilisez kubectl log pour afficher les journaux du pod et vérifier que le pod dispose des droits d’administrateur :

$ kubectl logs privileged-daemonset-12345 --namespace kube-system
InvalidOperation: Unable to find type [Security.Principal.WindowsPrincipal].
Process has admin rights:

Étapes suivantes

Pour plus d’informations sur les conteneurs HostProcess et la contribution de Microsoft à Kubernetes en amont, consultez l’article Alpha version 1.22 : conteneurs HostProcess Windows.