Windows HostProcess-containers gebruiken

HostProcess/Privileged-containers breiden het Windows-containermodel uit om een breder scala aan Kubernetes-clusterbeheerscenario's mogelijk te maken. HostProcess-containers worden rechtstreeks op de host uitgevoerd en behouden gedrag en toegang die vergelijkbaar zijn met dat van een normaal proces. Met HostProcess-containers kunnen gebruikers beheerbewerkingen en -functies verpakken en distribueren waarvoor hosttoegang is vereist, terwijl versiebeheer en implementatiemethoden van containers behouden blijven.

Een bevoegde DaemonSet kan wijzigingen uitvoeren of een Linux-host bewaken op Kubernetes, maar niet op Windows-hosts. HostProcess-containers zijn het Windows-equivalent van hostverhoging.

Beperkingen

  • Voor HostProcess-containers is Kubernetes 1.23 of hoger vereist.
  • HostProcess-containers vereisen containerd containerruntime 1.6 of hoger.
  • HostProcess-pods kunnen alleen HostProcess-containers bevatten. Dit is een huidige beperking van het Windows-besturingssysteem. Niet-bevoegde Windows-containers kunnen geen vNIC delen met de IP-naamruimte van de host.
  • HostProcess-containers worden uitgevoerd als een proces op de host. De enige isolatie die deze containers van de host hebben, zijn de resourcebeperkingen die zijn opgelegd aan het HostProcess-gebruikersaccount.
  • Bestandssysteemisolatie en Hyper-V-isolatie worden niet ondersteund voor HostProcess-containers.
  • Volumekoppelingen worden ondersteund en worden onder het containervolume gekoppeld. Zie Volumekoppelingen.
  • Er is standaard een beperkte set hostgebruikersaccounts beschikbaar voor hostprocescontainers. Zie Een gebruikersaccount kiezen.
  • Resourcelimieten zoals schijf, geheugen en CPU-aantal werken op dezelfde manier als processen op de host.
  • Benoemde pipe-koppelingen en Unix-domeinsockets worden niet rechtstreeks ondersteund, maar kunnen worden geopend op hun hostpad, bijvoorbeeld \\.\pipe\*.

Een HostProcess-workload uitvoeren

Als u HostProcess-functies wilt gebruiken met uw implementatie, stelt u privilaged in: true, hostProcess: true en hostNetwork: true:

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

Als u een voorbeeldworkload wilt uitvoeren die gebruikmaakt van HostProcess-functies op een bestaand AKS-cluster met Windows-knooppunten, maakt hostprocess.yaml u met het volgende:

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
      containers:
        - name: powershell
          image: mcr.microsoft.com/powershell:lts-nanoserver-1809
          securityContext:
            privileged: true
            windowsOptions:
              hostProcess: true
              runAsUserName: "NT AUTHORITY\\SYSTEM"
          command:
            - powershell.exe
            - -command
            - |
              $AdminRights = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator")
              Write-Host "Process has admin rights: $AdminRights"
              while ($true) { Start-Sleep -Seconds 2147483 }
      hostNetwork: true
      terminationGracePeriodSeconds: 0

Gebruik kubectl om de voorbeeldworkload uit te voeren:

kubectl apply -f hostprocess.yaml

U moet de volgende uitvoer zien:

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

U kunt controleren of uw workload gebruikmaakt van de functies van HostProcess door de logboeken van de pod weer te geven.

Gebruik kubectl om de naam van de pod in de kube-system naamruimte te zoeken.

$ kubectl get pods --namespace kube-system

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

Gebruik kubectl log om de logboeken van de pod weer te geven en te controleren of de pod beheerdersrechten heeft:

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

Volgende stappen

Zie Alpha in v1.22: Windows HostProcess Containers voor meer informatie over HostProcess-containers en de bijdrage van Microsoft aan Kubernetes upstream.