--- title: 创建 Windows HostProcess Pod content_type: task weight: 20 min-kubernetes-server-version: 1.23 --- {{< feature-state for_k8s_version="v1.23" state="beta" >}} Windows HostProcess 容器让你能够在 Windows 主机上运行容器化负载。 这类容器以普通的进程形式运行,但能够在具有合适用户特权的情况下, 访问主机网络名字空间、存储和设备。HostProcess 容器可用来在 Windows 节点上部署网络插件、存储配置、设备插件、kube-proxy 以及其他组件, 同时不需要配置专用的代理或者直接安装主机服务。 类似于安装安全补丁、事件日志收集等这类管理性质的任务可以在不需要集群操作员登录到每个 Windows 节点的前提下执行。HostProcess 容器可以以主机上存在的任何用户账户来运行, 也可以以主机所在域中的用户账户运行,这样管理员可以通过用户许可权限来限制资源访问。 尽管文件系统和进程隔离都不支持,在启动容器时会在主机上创建一个新的卷, 为其提供一个干净的、整合的工作空间。HostProcess 容器也可以基于现有的 Windows 基础镜像来制作,并且不再有 Windows 服务器容器所带有的那些 [兼容性需求](https://docs.microsoft.com/virtualization/windowscontainers/deploy-containers/version-compatibility), 这意味着基础镜像的版本不必与主机操作系统的版本匹配。 不过,仍然建议你像使用 Windows 服务器容器负载那样,使用相同的基础镜像版本, 这样你就不会有一些未使用的镜像占用节点上的存储空间。HostProcess 容器也支持 在容器卷内执行[卷挂载](./create-hostprocess-pod#volume-mounts)。 ### 我何时该使用 Windows HostProcess 容器? - 当你准备执行需要访问主机上网络名字空间的任务时,HostProcess 容器能够访问主机上的网络接口和 IP 地址。 - 当你需要访问主机上的资源,如文件系统、事件日志等等。 - 需要安装特定的设备驱动或者 Windows 服务时。 - 需要对管理任务和安全策略进行整合时。使用 HostProcess 容器能够缩小 Windows 节点上所需要的特权范围。 ## {{% heading "prerequisites" %}} 本任务指南是特定于 Kubernetes v{{< skew currentVersion >}} 的。 如果你运行的不是 Kubernetes v{{< skew currentVersion >}},请移步访问正确 版本的 Kubernetes 文档。 在 Kubernetes v{{< skew currentVersion >}} 中,HostProcess 容器功能特性默认是启用的。 kubelet 会直接与 containerd 通信,通过 CRI 将主机进程标志传递过去。 你可以使用 containerd 的最新版本(v1.6+)来运行 HostProcess 容器。 参阅[如何安装 containerd](/zh/docs/setup/production-environment/container-runtimes/#containerd)。 要 *禁用* HostProcess 容器特性,你需要为 **kubelet** 和 **kube-apiserver** 设置下面的特性门控标志: ```powershell --feature-gates=WindowsHostProcessContainers=false ``` 进一步的细节可参阅[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/#overview)文档。 ## 限制 {#limitations} 以下限制是与 Kubernetes v{{< skew currentVersion >}} 相关的: - HostProcess 容器需要 containerd 1.6 或更高版本的 {{< glossary_tooltip text="容器运行时" term_id="container-runtime" >}}。 - HostProcess Pods 只能包含 HostProcess 容器。这是在 Windows 操作系统上的约束; 非特权的 Windows 容器不能与主机 IP 名字空间共享虚拟网卡(vNIC)。 - HostProcess 在主机上以一个进程的形式运行,除了通过 HostProcess 用户账号所实施的资源约束外,不提供任何形式的隔离。HostProcess 容器不支持文件系统或 Hyper-V 隔离。 - 卷挂载是被支持的,并且要花在到容器卷下。参见[卷挂载](#volume-mounts)。 - 默认情况下有一组主机用户账户可供 HostProcess 容器使用。 参见[选择用户账号](#choosing-a-user-account)。 - 对资源约束(磁盘、内存、CPU 个数)的支持与主机上进程相同。 - **不支持**命名管道或者 UNIX 域套接字形式的挂载,需要使用主机上的路径名来访问 (例如,\\\\.\\pipe\\\*)。 ## HostProcess Pod 配置需求 {#hostprocess-pod-configuration-requirements} 启用 Windows HostProcess Pod 需要在 Pod 安全配置中设置合适的选项。 在 [Pod 安全标准](/zh/docs/concepts/security/pod-security-standards)中所定义的策略中, HostProcess Pod 默认是不被 basline 和 restricted 策略支持的。因此建议 HostProcess 运行在与 privileged 模式相看齐的策略下。 当运行在 privileged 策略下时,下面是要启用 HostProcess Pod 创建所需要设置的选项:
控制 | 策略 |
---|---|
securityContext.windowsOptions.hostProcess |
Windows Pods 提供运行 HostProcess 容器的能力,这类容器能够具有对 Windows 节点的特权访问权限。 可选值
|
hostNetwork |
初始时将默认位于主机网络中。在未来可能会希望将网络设置到不同的隔离环境中。 可选值
|
securityContext.windowsOptions.runAsUsername |
关于 HostProcess 容器所要使用的用户的规约,需要设置在 Pod 的规约中。 可选值
|
runAsNonRoot |
因为 HostProcess 容器有访问主机的特权,runAsNonRoot 字段不可以设置为 true。 可选值
|