创建 Windows HostProcess Pod
Kubernetes v1.26 [stable]
Windows HostProcess 容器允许你在 Windows 主机上运行容器化负载。这些容器作为普通进程运行,但在被授予适当的用户权限时,可以访问主机的网络命名空间、存储和设备。HostProcess 容器可用于将网络插件、存储配置、设备插件、kube-proxy 和其他组件部署到 Windows 节点,而无需专用的代理或直接安装主机服务。
无需集群操作员登录到每个 Windows 节点,即可执行管理任务,例如安装安全补丁、收集事件日志等。HostProcess 容器可以作为主机上或主机域中的任何可用用户运行,从而允许管理员通过用户权限限制资源访问。虽然不支持文件系统或进程隔离,但在容器启动时会在主机上创建一个新卷,为其提供一个干净且集中的工作空间。HostProcess 容器还可以基于现有的 Windows 基础镜像构建,并且不像 Windows Server 容器那样继承相同的兼容性要求,这意味着基础镜像的版本无需与主机匹配。但是,建议你使用与 Windows Server 容器负载相同的基础镜像版本,以确保节点上没有未使用的镜像占用空间。HostProcess 容器还支持在容器卷内进行卷挂载。
我应该何时使用 Windows HostProcess 容器?
- 当你需要执行需要主机网络命名空间的任务时。HostProcess 容器可以访问主机的网络接口和 IP 地址。
- 你需要访问主机上的资源,例如文件系统、事件日志等。
- 安装特定的设备驱动程序或 Windows 服务。
- 整合管理任务和安全策略。这降低了 Windows 节点所需的权限级别。
开始之前
本任务指南特定于 Kubernetes v1.33。如果你运行的不是 Kubernetes v1.33,请查阅该版本 Kubernetes 的文档。
在 Kubernetes 1.33 中,HostProcess 容器特性默认启用。kubelet 将通过 CRI 直接与 containerd 通信,并传递 hostprocess 标志。你可以使用最新版本的 containerd (v1.6+) 运行 HostProcess 容器。如何安装 containerd。
限制
这些限制适用于 Kubernetes v1.33
- HostProcess 容器需要 containerd 1.6 或更高版本的容器运行时,推荐使用 containerd 1.7。
- HostProcess Pod 只能包含 HostProcess 容器。这是 Windows 操作系统的当前限制;非特权 Windows 容器无法与主机 IP 命名空间共享 vNIC。
- HostProcess 容器作为主机上的进程运行,除了施加在 HostProcess 用户账户上的资源限制外,没有任何隔离程度。HostProcess 容器不支持文件系统或 Hyper-V 隔离。
- 支持卷挂载,并且挂载在容器卷下。参见卷挂载。
- 默认情况下,HostProcess 容器可用的主机用户账户集是有限的。参见选择用户账户。
- 资源限制(磁盘、内存、CPU 数量)的支持方式与主机上的进程相同。
- 命名管道挂载和 Unix 域套接字都不受支持,应改为通过它们在主机上的路径访问(例如 \\.\pipe\*)。
HostProcess Pod 配置要求
启用 Windows HostProcess Pod 需要在 Pod 安全配置中设置正确的配置。在Pod 安全标准中定义的策略中,HostProcess Pod 不被 baseline 和 restricted 策略允许。因此,建议 HostProcess Pod 与 privileged 配置文件对齐运行。
在 privileged 策略下运行时,以下是启用创建 HostProcess Pod 需要设置的配置:
控制 | 策略 |
---|---|
securityContext.windowsOptions.hostProcess | Windows Pod 提供了运行HostProcess 容器的能力,从而可以特权访问 Windows 节点。 允许的值
|
hostNetwork | 包含 HostProcess 容器的 Pod 必须使用主机的网络命名空间。 允许的值
|
securityContext.windowsOptions.runAsUserName | 在 Pod 规范中必须指定 HostProcess 容器应以哪个用户身份运行。 允许的值
|
runAsNonRoot | 由于 HostProcess 容器对主机具有特权访问权限,因此runAsNonRoot字段不能设置为 true。 允许的值
|
示例清单(节选)
spec:
securityContext:
windowsOptions:
hostProcess: true
runAsUserName: "NT AUTHORITY\\Local service"
hostNetwork: true
containers:
- name: test
image: image1:latest
command:
- ping
- -t
- 127.0.0.1
nodeSelector:
"kubernetes.io/os": windows
卷挂载
HostProcess 容器支持在容器卷空间内挂载卷。卷挂载行为因节点上使用的 containerd 运行时版本而异。
Containerd v1.6
容器内运行的应用程序可以通过相对或绝对路径直接访问卷挂载。容器创建时会设置一个环境变量 $CONTAINER_SANDBOX_MOUNT_POINT
,它提供了容器卷的绝对主机路径。相对路径基于 .spec.containers.volumeMounts.mountPath
配置。
要访问服务账户令牌(例如),容器内支持以下路径结构:
.\var\run\secrets\kubernetes.io\serviceaccount\
$CONTAINER_SANDBOX_MOUNT_POINT\var\run\secrets\kubernetes.io\serviceaccount\
Containerd v1.7 (及更高版本)
容器内运行的应用程序可以直接通过 volumeMount 指定的 mountPath
访问卷挂载(就像 Linux 和非 HostProcess Windows 容器一样)。
为了向后兼容,卷也可以使用 containerd v1.6 配置的相同相对路径进行访问。
例如,要在容器内访问服务账户令牌,可以使用以下路径之一:
c:\var\run\secrets\kubernetes.io\serviceaccount
/var/run/secrets/kubernetes.io/serviceaccount/
$CONTAINER_SANDBOX_MOUNT_POINT\var\run\secrets\kubernetes.io\serviceaccount\
资源限制
资源限制(磁盘、内存、CPU 数量)应用于作业,并且是整个作业范围的。例如,设置 10MB 的限制,任何 HostProcess 作业对象分配的内存都将限制在 10MB。这与其他 Windows 容器类型的行为相同。这些限制将以当前用于任何编排器或运行时的方式指定。唯一的区别在于用于资源跟踪的磁盘资源使用计算,这是由于 HostProcess 容器的引导方式不同造成的。
选择用户账户
系统账户
默认情况下,HostProcess 容器支持作为三个受支持的 Windows 服务账户之一运行:
你应该为每个 HostProcess 容器选择适当的 Windows 服务账户,旨在限制权限级别,以避免对主机造成意外(甚至恶意)损坏。LocalSystem 服务账户在这三个账户中具有最高的权限级别,应仅在绝对必要时使用。尽可能使用 LocalService 服务账户,因为它是三个选项中权限最低的。
本地账户
如果配置了,HostProcess 容器也可以作为本地用户账户运行,这允许节点操作员对负载进行细粒度访问。
要以本地用户身份运行 HostProcess 容器;首先必须在节点上创建一个本地用户组,并且该本地用户组的名称必须在部署中的 runAsUserName
字段中指定。在初始化 HostProcess 容器之前,将创建一个新的临时的本地用户账户并加入指定的用户组,容器将从此账户运行。这提供了许多好处,包括无需管理本地用户账户的密码。运行为服务账户的初始 HostProcess 容器可用于为后续的 HostProcess 容器准备用户组。
注意
以本地用户账户身份运行 HostProcess 容器需要 containerd v1.7+示例
在节点上创建一个本地用户组(这可以在另一个 HostProcess 容器中完成)。
net localgroup hpc-localgroup /add
将节点上所需资源的访问权限授予本地用户组。这可以使用 icacls 等工具完成。
将 Pod 或单个容器的
runAsUserName
设置为本地用户组的名称。securityContext: windowsOptions: hostProcess: true runAsUserName: hpc-localgroup
调度 Pod!
HostProcess 容器的基础镜像
HostProcess 容器可以基于任何现有的 Windows 容器基础镜像构建。
此外,还创建了一个专用于 HostProcess 容器的新基础镜像!更多信息请查阅 windows-host-process-containers-base-image GitHub 项目。
HostProcess 容器故障排除
HostProcess 容器启动失败并显示
failed to create user process token: failed to logon user: Access is denied.: unknown
确保 containerd 作为
LocalSystem
或LocalService
服务账户运行。用户账户(即使是管理员账户)也没有权限为任何受支持的用户账户创建登录令牌。