Utilizar contentores do Windows HostProcess

Os contentores HostProcess/Privileged expandem o modelo de contentor do Windows para permitir uma maior variedade de cenários de gestão de clusters do Kubernetes. Os contentores HostProcess são executados diretamente no anfitrião e mantêm o comportamento e o acesso semelhantes aos de um processo normal. Os contentores HostProcess permitem que os utilizadores empacotem e distribuam operações e funcionalidades de gestão que requerem acesso de anfitrião, ao mesmo tempo que mantêm o controlo de versões e os métodos de implementação fornecidos pelos contentores.

Um DaemonSet com privilégios pode realizar alterações ou monitorizar um anfitrião Linux no Kubernetes, mas não nos anfitriões do Windows. Os contentores HostProcess são o equivalente do Windows à elevação de anfitriões.

Limitações

  • Os contentores hostProcess requerem o Kubernetes 1.23 ou superior.
  • Os contentores HostProcess requerem containerd um runtime de contentor 1.6 ou superior.
  • Os pods HostProcess só podem conter contentores HostProcess devido a uma limitação no sistema operativo Windows. Os contentores do Windows não privilegiados não podem partilhar uma vNIC com o espaço de nomes de IP do anfitrião.
  • Os contentores HostProcess são executados como um processo no anfitrião. O único isolamento que esses contentores têm do anfitrião são as restrições de recursos impostas na conta de utilizador HostProcess.
  • O isolamento do sistema de ficheiros e o isolamento do Hyper-V não são suportados para contentores HostProcess.
  • As montagens de volumes são suportadas e são montadas sob o volume de contentor. Veja Montagens de Volumes.
  • Por predefinição, está disponível um conjunto limitado de contas de utilizador anfitrião para contentores do Processo de Anfitrião. Veja Escolher uma Conta de Utilizador.
  • Os limites de recursos, como o disco, a memória e a contagem de cpus, funcionam da mesma forma que os processos no anfitrião.
  • As montagens de pipe nomeadas e os sockets de domínio Unix não são diretamente suportados, mas podem ser acedidos no caminho do anfitrião, por exemplo \\.\pipe\*.

Executar uma carga de trabalho HostProcess

Para utilizar as funcionalidades HostProcess com a sua implementação, defina hostProcess: true e hostNetwork: true:

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

Para executar uma carga de trabalho de exemplo que utiliza funcionalidades hostProcess num cluster do AKS existente com nós do Windows, crie hostprocess.yaml com os seguintes conteúdos:

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

Utilize kubectl para executar a carga de trabalho de exemplo:

kubectl apply -f hostprocess.yaml

Deverá ver o seguinte resultado:

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

Verifique se a carga de trabalho utiliza as funcionalidades dos contentores HostProcess ao ver os registos do pod.

Utilize kubectl para localizar o nome do pod no kube-system espaço de nomes.

$ kubectl get pods --namespace kube-system

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

Utilize kubectl log para ver os registos do pod e verificar se o pod tem direitos de administrador:

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

Passos seguintes

Para obter mais informações sobre os contentores HostProcess e a contribuição da Microsoft para o Kubernetes a montante, veja Alpha in v1.22: Windows HostProcess Containers (Alfa em v1.22: Windows HostProcess Containers).