Kubernetes 創(chuàng)建Windows HostProcess Pod

2022-06-09 11:26 更新

創(chuàng)建 Windows HostProcess Pod

FEATURE STATE: Kubernetes v1.23 [beta]

Windows HostProcess 容器讓你能夠在 Windows 主機(jī)上運(yùn)行容器化負(fù)載。 這類(lèi)容器以普通的進(jìn)程形式運(yùn)行,但能夠在具有合適用戶(hù)特權(quán)的情況下, 訪問(wèn)主機(jī)網(wǎng)絡(luò)名字空間、存儲(chǔ)和設(shè)備。HostProcess 容器可用來(lái)在 Windows 節(jié)點(diǎn)上部署網(wǎng)絡(luò)插件、存儲(chǔ)配置、設(shè)備插件、kube-proxy 以及其他組件, 同時(shí)不需要配置專(zhuān)用的代理或者直接安裝主機(jī)服務(wù)。

類(lèi)似于安裝安全補(bǔ)丁、事件日志收集等這類(lèi)管理性質(zhì)的任務(wù)可以在不需要集群操作員登錄到每個(gè) Windows 節(jié)點(diǎn)的前提下執(zhí)行。HostProcess 容器可以以主機(jī)上存在的任何用戶(hù)賬戶(hù)來(lái)運(yùn)行, 也可以以主機(jī)所在域中的用戶(hù)賬戶(hù)運(yùn)行,這樣管理員可以通過(guò)用戶(hù)許可權(quán)限來(lái)限制資源訪問(wèn)。 盡管文件系統(tǒng)和進(jìn)程隔離都不支持,在啟動(dòng)容器時(shí)會(huì)在主機(jī)上創(chuàng)建一個(gè)新的卷, 為其提供一個(gè)干凈的、整合的工作空間。HostProcess 容器也可以基于現(xiàn)有的 Windows 基礎(chǔ)鏡像來(lái)制作,并且不再有 Windows 服務(wù)器容器所帶有的那些  兼容性需求, 這意味著基礎(chǔ)鏡像的版本不必與主機(jī)操作系統(tǒng)的版本匹配。 不過(guò),仍然建議你像使用 Windows 服務(wù)器容器負(fù)載那樣,使用相同的基礎(chǔ)鏡像版本, 這樣你就不會(huì)有一些未使用的鏡像占用節(jié)點(diǎn)上的存儲(chǔ)空間。HostProcess 容器也支持 在容器卷內(nèi)執(zhí)行卷掛載。

我何時(shí)該使用 Windows HostProcess 容器?

  • 當(dāng)你準(zhǔn)備執(zhí)行需要訪問(wèn)主機(jī)上網(wǎng)絡(luò)名字空間的任務(wù)時(shí),HostProcess 容器能夠訪問(wèn)主機(jī)上的網(wǎng)絡(luò)接口和 IP 地址。
  • 當(dāng)你需要訪問(wèn)主機(jī)上的資源,如文件系統(tǒng)、事件日志等等。
  • 需要安裝特定的設(shè)備驅(qū)動(dòng)或者 Windows 服務(wù)時(shí)。
  • 需要對(duì)管理任務(wù)和安全策略進(jìn)行整合時(shí)。使用 HostProcess 容器能夠縮小 Windows 節(jié)點(diǎn)上所需要的特權(quán)范圍。

在開(kāi)始之前

本任務(wù)指南是特定于 Kubernetes v1.24 的。

在 Kubernetes v1.24 中,HostProcess 容器功能特性默認(rèn)是啟用的。 kubelet 會(huì)直接與 containerd 通信,通過(guò) CRI 將主機(jī)進(jìn)程標(biāo)志傳遞過(guò)去。 你可以使用 containerd 的最新版本(v1.6+)來(lái)運(yùn)行 HostProcess 容器。

要 禁用 HostProcess 容器特性,你需要為 kubelet 和 kube-apiserver 設(shè)置下面的特性門(mén)控標(biāo)志:

--feature-gates=WindowsHostProcessContainers=false

限制 

以下限制是與 Kubernetes v1.24 相關(guān)的:

  • HostProcess 容器需要 containerd 1.6 或更高版本的 容器運(yùn)行時(shí)。
  • HostProcess Pods 只能包含 HostProcess 容器。這是在 Windows 操作系統(tǒng)上的約束; 非特權(quán)的 Windows 容器不能與主機(jī) IP 名字空間共享虛擬網(wǎng)卡(vNIC)。
  • HostProcess 在主機(jī)上以一個(gè)進(jìn)程的形式運(yùn)行,除了通過(guò) HostProcess 用戶(hù)賬號(hào)所實(shí)施的資源約束外,不提供任何形式的隔離。HostProcess 容器不支持文件系統(tǒng)或 Hyper-V 隔離。
  • 卷掛載是被支持的,并且要花在到容器卷下。
  • 默認(rèn)情況下有一組主機(jī)用戶(hù)賬戶(hù)可供 HostProcess 容器使用。
  • 對(duì)資源約束(磁盤(pán)、內(nèi)存、CPU 個(gè)數(shù))的支持與主機(jī)上進(jìn)程相同。
  • 不支持命名管道或者 UNIX 域套接字形式的掛載,需要使用主機(jī)上的路徑名來(lái)訪問(wèn) (例如,\\.\pipe\*)。

HostProcess Pod 配置需求 

啟用 Windows HostProcess Pod 需要在 Pod 安全配置中設(shè)置合適的選項(xiàng)。 在 Pod 安全標(biāo)準(zhǔn)中所定義的策略中, HostProcess Pod 默認(rèn)是不被 basline 和 restricted 策略支持的。因此建議 HostProcess 運(yùn)行在與 privileged 模式相看齊的策略下。

當(dāng)運(yùn)行在 privileged 策略下時(shí),下面是要啟用 HostProcess Pod 創(chuàng)建所需要設(shè)置的選項(xiàng):

控制 策略
securityContext.windowsOptions.hostProcess

Windows Pods 提供運(yùn)行 HostProcess 容器的能力,這類(lèi)容器能夠具有對(duì) Windows 節(jié)點(diǎn)的特權(quán)訪問(wèn)權(quán)限。

可選值

  • true
hostNetwork

初始時(shí)將默認(rèn)位于主機(jī)網(wǎng)絡(luò)中。在未來(lái)可能會(huì)希望將網(wǎng)絡(luò)設(shè)置到不同的隔離環(huán)境中。

可選值

  • true
securityContext.windowsOptions.runAsUsername

關(guān)于 HostProcess 容器所要使用的用戶(hù)的規(guī)約,需要設(shè)置在 Pod 的規(guī)約中。

可選值

  • NT AUTHORITY\SYSTEM
  • NT AUTHORITY\Local service
  • NT AUTHORITY\NetworkService
runAsNonRoot

因?yàn)?HostProcess 容器有訪問(wèn)主機(jī)的特權(quán),runAsNonRoot 字段不可以設(shè)置為 true。

可選值

  • 未定義/Nil
  • false

配置清單示例(片段) 

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 容器支持在容器卷空間中掛載卷的能力。 在容器內(nèi)運(yùn)行的應(yīng)用能夠通過(guò)相對(duì)或者絕對(duì)路徑直接訪問(wèn)卷掛載。 環(huán)境變量 ?$CONTAINER_SANDBOX_MOUNT_POINT? 在容器創(chuàng)建時(shí)被設(shè)置為指向容器卷的絕對(duì)主機(jī)路徑。 相對(duì)路徑是基于 ?.spec.containers.volumeMounts.mountPath? 配置來(lái)推導(dǎo)的。

示例 

容器內(nèi)支持通過(guò)下面的路徑結(jié)構(gòu)來(lái)訪問(wèn)服務(wù)賬好令牌:

?.\var\run\secrets\kubernetes.io\serviceaccount\ ?

?$CONTAINER_SANDBOX_MOUNT_POINT\var\run\secrets\kubernetes.io\serviceaccount\?

資源約束 

資源約束(磁盤(pán)、內(nèi)存、CPU 個(gè)數(shù))作用到任務(wù)之上,并在整個(gè)任務(wù)上起作用。 例如,如果內(nèi)存限制設(shè)置為 10MB,任何 HostProcess 任務(wù)對(duì)象所分配的內(nèi)存不會(huì)超過(guò) 10MB。 這一行為與其他 Windows 容器類(lèi)型相同。資源限制的設(shè)置方式與編排系統(tǒng)或容器運(yùn)行時(shí)無(wú)關(guān)。 唯一的區(qū)別是用來(lái)跟蹤資源所進(jìn)行的磁盤(pán)資源用量的計(jì)算,出現(xiàn)差異的原因是因?yàn)?nbsp;HostProcess 容器啟動(dòng)引導(dǎo)的方式造成的。

選擇用戶(hù)賬號(hào) 

HostProcess 容器支持以三種被支持的 Windows 服務(wù)賬號(hào)之一來(lái)運(yùn)行:

你應(yīng)該為每個(gè) HostProcess 容器選擇一個(gè)合適的 Windows 服務(wù)賬號(hào),嘗試限制特權(quán)范圍, 避免給主機(jī)代理意外的(甚至是惡意的)傷害。LocalSystem 服務(wù)賬號(hào)的特權(quán)級(jí) 在三者之中最高,只有在絕對(duì)需要的時(shí)候才應(yīng)該使用。只要可能,應(yīng)該使用 LocalService 服務(wù)賬號(hào),因?yàn)樵撡~號(hào)在三者中特權(quán)最低。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)