Kubernetes 容器運(yùn)行時(shí)類(Runtime Class)

2022-04-29 11:11 更新

容器運(yùn)行時(shí)類(Runtime Class)

FEATURE STATE: Kubernetes v1.20 [stable]

本頁(yè)面描述了 RuntimeClass 資源和運(yùn)行時(shí)的選擇機(jī)制。

RuntimeClass 是一個(gè)用于選擇容器運(yùn)行時(shí)配置的特性,容器運(yùn)行時(shí)配置用于運(yùn)行 Pod 中的容器。

動(dòng)機(jī) 

你可以在不同的 Pod 設(shè)置不同的 RuntimeClass,以提供性能與安全性之間的平衡。 例如,如果你的部分工作負(fù)載需要高級(jí)別的信息安全保證,你可以決定在調(diào)度這些 Pod 時(shí)盡量使它們?cè)谑褂糜布摂M化的容器運(yùn)行時(shí)中運(yùn)行。 這樣,你將從這些不同運(yùn)行時(shí)所提供的額外隔離中獲益,代價(jià)是一些額外的開銷。

你還可以使用 RuntimeClass 運(yùn)行具有相同容器運(yùn)行時(shí)但具有不同設(shè)置的 Pod。

設(shè)置 

  1. 在節(jié)點(diǎn)上配置 CRI 的實(shí)現(xiàn)(取決于所選用的運(yùn)行時(shí))
  2. 創(chuàng)建相應(yīng)的 RuntimeClass 資源

1. 在節(jié)點(diǎn)上配置 CRI 實(shí)現(xiàn)

RuntimeClass 的配置依賴于 運(yùn)行時(shí)接口(CRI)的實(shí)現(xiàn)。 根據(jù)你使用的 CRI 實(shí)現(xiàn),查閱相關(guān)的文檔(下方)來(lái)了解如何配置。

RuntimeClass 假設(shè)集群中的節(jié)點(diǎn)配置是同構(gòu)的(換言之,所有的節(jié)點(diǎn)在容器運(yùn)行時(shí)方面的配置是相同的)。 如果需要支持異構(gòu)節(jié)點(diǎn),配置方法請(qǐng)參閱下面的 調(diào)度。

所有這些配置都具有相應(yīng)的 ?handler ?名,并被 RuntimeClass 引用。 handler 必須是有效的 DNS 標(biāo)簽名。

2. 創(chuàng)建相應(yīng)的 RuntimeClass 資源

在上面步驟 1 中,每個(gè)配置都需要有一個(gè)用于標(biāo)識(shí)配置的 ?handler?。 針對(duì)每個(gè) handler 需要?jiǎng)?chuàng)建一個(gè) RuntimeClass 對(duì)象。

RuntimeClass 資源當(dāng)前只有兩個(gè)重要的字段:RuntimeClass 名 (?metadata.name?) 和 handler (?handler?)。 對(duì)象定義如下所示:

apiVersion: node.k8s.io/v1  # RuntimeClass 定義于 node.k8s.io API 組
kind: RuntimeClass
metadata:
  name: myclass  # 用來(lái)引用 RuntimeClass 的名字
  # RuntimeClass 是一個(gè)集群層面的資源
handler: myconfiguration  # 對(duì)應(yīng)的 CRI 配置的名稱

建議將 RuntimeClass 寫操作(create、update、patch 和 delete)限定于集群管理員使用。 通常這是默認(rèn)配置。

使用說(shuō)明 

一旦完成集群中 RuntimeClasses 的配置,使用起來(lái)非常方便。 在 Pod spec 中指定 ?runtimeClassName ?即可。例如:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  runtimeClassName: myclass
  # ...

這一設(shè)置會(huì)告訴 kubelet 使用所指的 RuntimeClass 來(lái)運(yùn)行該 pod。 如果所指的 RuntimeClass 不存在或者 CRI 無(wú)法運(yùn)行相應(yīng)的 handler, 那么 pod 將會(huì)進(jìn)入 ?Failed ?終止階段。 你可以查看相應(yīng)的事件, 獲取執(zhí)行過(guò)程中的錯(cuò)誤信息。

如果未指定 ?runtimeClassName ?,則將使用默認(rèn)的 RuntimeHandler,相當(dāng)于禁用 RuntimeClass 功能特性。

CRI 配置

dockershim

Dockershim 自 Kubernetes v1.20 起已棄用,并將在 v1.24 中刪除。

為 dockershim 設(shè)置 RuntimeClass 時(shí),必須將運(yùn)行時(shí)處理程序設(shè)置為 ?docker?。 Dockershim 不支持自定義的可配置的運(yùn)行時(shí)處理程序。

containerd

通過(guò) containerd 的 ?/etc/containerd/config.toml? 配置文件來(lái)配置運(yùn)行時(shí) handler。 handler 需要配置在 runtimes 塊中:

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.${HANDLER_NAME}]

更詳細(xì)信息,請(qǐng)查閱 containerd CRI 插件配置指南

cri-o

通過(guò) cri-o 的 ?/etc/crio/crio.conf? 配置文件來(lái)配置運(yùn)行時(shí) handler。 handler 需要配置在 crio.runtime 表 下面:

[crio.runtime.runtimes.${HANDLER_NAME}]
  runtime_path = "${PATH_TO_BINARY}"

更詳細(xì)信息,請(qǐng)查閱 CRI-O 配置文檔。

調(diào)度 

FEATURE STATE: Kubernetes v1.16 [beta]

通過(guò)為 RuntimeClass 指定 ?scheduling ?字段, 你可以通過(guò)設(shè)置約束,確保運(yùn)行該 RuntimeClass 的 Pod 被調(diào)度到支持該 RuntimeClass 的節(jié)點(diǎn)上。 如果未設(shè)置 ?scheduling?,則假定所有節(jié)點(diǎn)均支持此 RuntimeClass 。

為了確保 pod 會(huì)被調(diào)度到支持指定運(yùn)行時(shí)的 node 上,每個(gè) node 需要設(shè)置一個(gè)通用的 label 用于被 ?runtimeclass.scheduling.nodeSelector? 挑選。在 admission 階段,RuntimeClass 的 nodeSelector 將會(huì)與 pod 的 nodeSelector 合并,取二者的交集。如果有沖突,pod 將會(huì)被拒絕。

如果 node 需要阻止某些需要特定 RuntimeClass 的 pod,可以在 ?tolerations ?中指定。 與 ?nodeSelector ?一樣,tolerations 也在 admission 階段與 pod 的 tolerations 合并,取二者的并集。

Pod 開銷 

FEATURE STATE: Kubernetes v1.18 [beta]

你可以指定與運(yùn)行 Pod 相關(guān)的 開銷 資源。聲明開銷即允許集群(包括調(diào)度器)在決策 Pod 和資源時(shí)將其考慮在內(nèi)。 若要使用 Pod 開銷特性,你必須確保 PodOverhead 特性門控 處于啟用狀態(tài)(默認(rèn)為啟用狀態(tài))。

Pod 開銷通過(guò) RuntimeClass 的 ?overhead ?字段定義。 通過(guò)使用這些字段,你可以指定使用該 RuntimeClass 運(yùn)行 Pod 時(shí)的開銷并確保 Kubernetes 將這些開銷計(jì)算在內(nèi)。


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)