本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
Kubernetes 1.26:Windows HostProcess 容器已正式可用
期待已久的日子终于到来了:HostProcess 容器,即与 Linux 特权容器等效的 Windows 容器,终于在 **Kubernetes 1.26** 中正式发布(GA)!
什么是 HostProcess 容器?它们为什么有用?
集群操作员经常需要在节点配置时进行操作,例如安装 Windows 服务、配置注册表项、管理 TLS 证书、进行网络配置更改,甚至部署像 Prometheus 的 node-exporter 这样的监控工具。以前,在 Windows 节点上执行这些操作通常是通过 SSH 或 WinRM 会话运行 PowerShell 脚本和/或使用云提供商的虚拟机管理工具来完成的。现在,HostProcess 容器使你能够通过 Kubernetes 原生 API 以最小的代价完成所有这些以及更多的工作。
通过 HostProcess 容器,你现在可以将任何负载打包到容器镜像中,在运行时将卷映射到容器中,并像管理任何其他 Kubernetes 工作负载一样管理它们。你既能获得容器化打包和部署方法的所有好处,又能降低管理和开发成本。集群操作员需要手动登录到 Windows 节点来执行管理职责的日子一去不复返了。
HostProcess 容器与常规的 Windows Server 容器有很大的不同。它们直接作为主机上的进程运行,并使用你指定用户的访问策略。HostProcess 容器可以作为内置的 Windows 系统帐户运行,也可以在你定义的用户组内的临时用户身份运行。HostProcess 容器还共享主机的网络命名空间,并能访问/配置主机可见的存储挂载。另一方面,Windows Server 容器是高度隔离的,存在于一个独立的执行命名空间中。默认情况下,从 Windows Server 容器直接访问主机是被明确禁止的。
它是如何工作的?
Windows HostProcess 容器是通过 Windows 作业对象(Job Objects) 实现的,这与之前使用服务器 사일로(Server Silo)的容器模型有所不同。作业对象是 Windows 操作系统的组件,能够将一组进程作为一个组(也称为一个**作业**)来管理,并为整个组分配资源限制。作业对象是 Windows 操作系统特有的,与 Kubernetes 的 Job API 无关。它们没有进程或文件系统隔离,使得特权负载能够以所需的权限查看和编辑主机文件系统以及其他主机资源。初始化进程及其启动的任何进程(包括用户明确启动的进程)都被分配给该容器的作业对象。当初始化进程退出或被信号通知退出时,作业中的所有进程都将被信号通知退出,作业句柄将被关闭,存储将被卸载。
HostProcess 容器和 Linux 特权容器启用了相似的场景,但在实现上有很大差异(因此名称也不同)。HostProcess 容器有自己的 PodSecurityContext 字段。用于配置 Linux 特权容器的字段**不适用**于此。在 Windows 主机上启用特权访问与 Linux 的过程根本不同,因此它们的配置和能力也大相径庭。下图详细说明了 Windows HostProcess 容器的整体架构。
在进入稳定版之前,添加了两个主要功能:以本地用户帐户运行的能力,以及一种简化的访问卷挂载的方法。要了解更多信息,请阅读创建 Windows HostProcess Pod。
HostProcess 容器的实际应用
Kubernetes SIG Windows 一直在积极使用 HostProcess 容器——甚至在正式发布之前!他们非常兴奋地将 HostProcess 容器用于许多过去难以执行的重要活动。
以下是一些使用案例及其部署示例
我该如何使用它?
HostProcess 容器可以使用你选择的任何基础镜像来构建,但是,为了方便起见,我们创建了一个 HostProcess 容器基础镜像。这个镜像只有几 KB 大小,并且不继承任何与常规 Windows Server 容器相同的兼容性要求,这使得它可以在任何 Windows Server 版本上运行。
要使用 Microsoft 的这个镜像,请将以下内容放入你的 `Dockerfile` 中
FROM mcr.microsoft.com/oss/kubernetes/windows-host-process-containers-base-image:v1.0.0
你可以在 HostProcess Pod 中运行 HostProcess 容器。
要开始运行 Windows 容器,请参阅部署 Windows 节点的通用指南。如果你有一个兼容的节点(例如:操作系统为 Windows,容器运行时为 containerd v1.7 或更高版本),你就可以部署一个带有一个或多个 HostProcess 容器的 Pod。更多信息请参阅创建 Windows HostProcess Pod - 前提条件。
请注意,在一个 Pod 中,你不能将 HostProcess 容器与普通的 Windows 容器混合使用。
我如何了解更多信息?
阅读增强提案Windows 特权容器和主机网络模式(KEP-1981)
观看 KubeCon NA 2022 的演讲Windows HostProcess 用于配置及更多
我如何参与?
参与 SIG Windows 做出贡献!