你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Windows HostProcess 容器

HostProcess/特权容器扩展了 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 功能用于部署,请设置: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.microsoft.com/powershell:lts-nanoserver-1809 # or lts-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 容器的功能。

使用 kubectlkube-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 容器和 Microsoft 对 Kubernetes 上游的贡献的更多详细信息,请参阅 v1.22 中的 Alpha:Windows HostProcess 容器