Verwenden von Windows-HostProcess-Containern

HostProcess-Container/privilegierte Container erweitern das Windows-Containermodell, um eine größere Bandbreite von Kubernetes-Clusterverwaltungsszenarien zu ermöglichen. HostProcess-Container werden direkt auf dem Host ausgeführt und verwalten das Verhalten und den Zugriff ähnlich wie bei einem regulären Prozess. Mit HostProcess-Containern können Benutzer Verwaltungsvorgänge und -funktionen packen und verteilen, die Hostzugriff erfordern, während die von Containern bereitgestellten Versionsverwaltungs- und Bereitstellungsmethoden beibehalten werden.

Ein privilegierter DaemonSet kann Änderungen durchführen oder einen Linux-Host auf Kubernetes überwachen, aber keine Windows-Hosts. HostProcess-Container sind das Windows-Äquivalent zur Rechteerweiterung bei Hosts.

Einschränkungen

  • HostProcess-Container erfordern Kubernetes 1.23 oder höher.
  • HostProcess-Container erfordern eine Containerlaufzeit von containerd 1.6 oder höher.
  • HostProcess-Pods können aufgrund einer Einschränkung des Windows-Betriebssystems nur HostProcess-Container enthalten. Nicht privilegierte Windows-Container können keine vNIC gemeinsam mit dem Host-IP-Namespace verwenden.
  • HostProcess-Container werden als Prozess auf dem Host ausgeführt. Die einzige Isolierung, die diese Container vom Host haben, sind die Ressourceneinschränkungen, die dem HostProcess-Benutzerkonto auferlegt werden.
  • Dateisystemisolierung und Hyper-V-Isolierung werden für HostProcess-Container nicht unterstützt.
  • Volumeeinbindungen werden unterstützt und unter dem Containervolume eingebunden. Siehe „Volumeeinbindungen“.
  • Standardmäßig ist eine begrenzte Gruppe von Hostbenutzerkonten für HostProcess-Container verfügbar. Siehe „Auswählen eines Benutzerkontos“.
  • Ressourcengrenzwerte wie Datenträger, Arbeitsspeicher und CPU-Anzahl funktionieren auf dieselbe Weise wie Prozesse auf dem Host.
  • Benannte Pipebereitstellungen und Unix-Domänensockets werden nicht direkt unterstützt, aber über ihren Hostpfad kann darauf zugegriffen werden, z. B. \\.\pipe\*.

Ausführen einer HostProcess-Workload

Um HostProcess-Features mit Ihrer Bereitstellung zu verwenden, legen Sie hostProcess: true und hostNetwork: true fest:

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

Um eine Beispielworkload auszuführen, die HostProcess-Features für einen vorhandenen AKS-Cluster mit Windows-Knoten verwendet, erstellen Sie hostprocess.yaml mit folgenden Inhalten:

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

Verwenden Sie kubectl, um die Beispielworkload auszuführen:

kubectl apply -f hostprocess.yaml

Die folgende Ausgabe wird angezeigt:

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

Überprüfen Sie, ob Ihre Workload die Features von HostProcess-Containern nutzt, indem Sie die Protokolle des Pods anzeigen.

Verwenden Sie kubectl, um den Namen des Pods im kube-system-Namespace zu suchen.

$ kubectl get pods --namespace kube-system

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

Verwenden Sie kubectl log, um die Protokolle des Pods anzuzeigen und zu überprüfen, ob der Pod über Administratorrechte verfügt:

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

Nächste Schritte

Weitere Informationen zu HostProcess-Containern und Microsofts Beitrag zu Kubernetes Upstream finden Sie unter Alpha in v1.22: Windows-HostProcess-Container.