使用 Windows HostProcess 容器

HostProcess/Privileged 容器扩展 Windows 容器模型,以实现更广泛的 Kubernetes 群集管理方案。 HostProcess 容器直接在主机上运行,并维护与常规进程类似的行为和访问权限。 HostProcess 容器允许用户打包和分发需要主机访问权限的管理作和功能,同时保留容器提供的版本控制和部署方法。

特权 DaemonSet 可以在 Kubernetes 上执行更改或监视 Linux 主机,但不能监视 Windows 主机。 HostProcess 容器是主机提升的 Windows 等效项。

局限性

  • HostProcess 容器需要 Kubernetes 1.23 或更高版本。
  • HostProcess 容器需要 containerd 1.6 或更高版本的容器运行时。
  • 由于 Windows作系统存在限制,HostProcess Pod 只能包含 HostProcess 容器。 非特权 Windows 容器无法与主机 IP 命名空间共享 vNIC。
  • HostProcess 容器作为进程在主机上运行。 这些容器与主机的唯一隔离是对 HostProcess 用户帐户施加的资源约束。
  • HostProcess 容器不支持文件系统隔离和 Hyper-V 隔离。
  • 支持的卷挂载会被装载在容器卷下方。 请参阅卷装载。
  • 默认情况下,主机进程容器可以使用一组有限的主机用户帐户。 请参阅选择用户帐户。
  • 资源限制(如磁盘、内存和 CPU 计数)的工作方式与主机上的进程的工作方式相同。
  • 命名管道挂载和 Unix 域套接字不直接受支持,但可以通过其主机路径访问,例如 \\.\pipe\*

运行主机进程工作负载

若要将 HostProcess 功能用于部署,请设置 hostProcess:truehostNetwork:true:

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

若要在具有 Windows 节点的现有 AKS 群集上运行使用 HostProcess 功能的示例工作负荷,请使用以下内容创建 hostprocess.yaml

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.azk8s.cn/windows/nanoserver:ltsc2019 # or nanoserver:ltsc2022
          command:
            - powershell.exe
            - -Command
            - Start-Sleep -Seconds 2147483
      terminationGracePeriodSeconds: 0

使用 kubectl 运行示例工作负荷。

kubectl apply -f hostprocess.yaml

应会看到以下输出:

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

通过查看 Pod 的日志,验证工作负荷是否使用 HostProcess 容器的功能。

使用 kubectl 查找 kube-system 命名空间中的 Pod 名称。

$ kubectl get pods --namespace kube-system

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

用于 kubectl log 查看 Pod 的日志并验证 Pod 是否具有管理员权限:

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

后续步骤

有关 HostProcess 容器和 Azure 对 Kubernetes 上游的贡献的详细信息,请参阅 v1.22 中的 Alpha:Windows HostProcess 容器