執行時類
Kubernetes v1.20 [stable]
此頁面描述了 RuntimeClass 資源和執行時選擇機制。
RuntimeClass 是一個用於選擇容器執行時配置的特性。容器執行時配置用於執行 Pod 的容器。
動機
你可以在不同的 Pod 之間設定不同的 RuntimeClass,以在效能和安全性之間取得平衡。例如,如果你的工作負載的一部分需要高水平的資訊安全保證,你可以選擇排程這些 Pod,使其在使用硬體虛擬化的容器執行時中執行。這樣,你將受益於替代執行時的額外隔離,但會付出一些額外的開銷。
你還可以使用 RuntimeClass 以相同的容器執行時但不同的設定來執行不同的 Pod。
設定
- 在節點上配置 CRI 實現(依賴於執行時)
- 建立相應的 RuntimeClass 資源
1. 在節點上配置 CRI 實現
透過 RuntimeClass 可用的配置是容器執行時介面 (CRI) 實現相關的。請參閱你的 CRI 實現的相應文件(如下)以瞭解如何配置。
注意
RuntimeClass 預設假定叢集中存在同構節點配置(這意味著所有節點在容器執行時方面都以相同的方式配置)。為了支援異構節點配置,請參閱下面的排程。配置具有一個相應的 handler
名稱,由 RuntimeClass 引用。該處理程式必須是有效的 DNS 標籤名稱。
2. 建立相應的 RuntimeClass 資源
步驟 1 中設定的每個配置都應該有一個關聯的 handler
名稱,用於標識配置。對於每個處理程式,建立一個相應的 RuntimeClass 物件。
RuntimeClass 資源目前只有兩個重要欄位:RuntimeClass 名稱(metadata.name
)和處理程式(handler
)。物件定義如下:
# RuntimeClass is defined in the node.k8s.io API group
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
# The name the RuntimeClass will be referenced by.
# RuntimeClass is a non-namespaced resource.
name: myclass
# The name of the corresponding CRI configuration
handler: myconfiguration
RuntimeClass 物件的名稱必須是有效的 DNS 子域名。
注意
建議 RuntimeClass 寫入操作(建立/更新/修補/刪除)僅限於叢集管理員。這通常是預設設定。有關詳細資訊,請參閱授權概述。用途
一旦為叢集配置了 RuntimeClass,你可以在 Pod 規約中指定 runtimeClassName
來使用它。例如:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
runtimeClassName: myclass
# ...
這將指示 kubelet 使用指定的 RuntimeClass 來執行此 Pod。如果指定的 RuntimeClass 不存在,或者 CRI 無法執行相應的處理程式,Pod 將進入 Failed
終止階段。請查詢相應的事件以獲取錯誤訊息。
如果未指定 runtimeClassName
,則將使用預設的 RuntimeHandler,這與停用 RuntimeClass 特性時的行為等效。
CRI 配置
有關設定 CRI 執行時的更多詳細資訊,請參閱 CRI 安裝。
containerd
執行時處理程式透過 containerd 的配置檔案 /etc/containerd/config.toml
進行配置。有效的處理程式在 runtimes 部分下配置:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.${HANDLER_NAME}]
有關詳細資訊,請參閱 containerd 的配置文件
CRI-O
執行時處理程式透過 CRI-O 的配置檔案 /etc/crio/crio.conf
進行配置。有效的處理程式在 crio.runtime 表下配置
[crio.runtime.runtimes.${HANDLER_NAME}]
runtime_path = "${PATH_TO_BINARY}"
有關詳細資訊,請參閱 CRI-O 的配置文件。
排程
Kubernetes v1.16 [beta]
透過為 RuntimeClass 指定 scheduling
欄位,你可以設定約束以確保使用此 RuntimeClass 執行的 Pod 排程到支援它的節點。如果未設定 scheduling
,則假定所有節點都支援此 RuntimeClass。
為了確保 Pod 落在支援特定 RuntimeClass 的節點上,這組節點應該有一個共同的標籤,然後由 runtimeclass.scheduling.nodeSelector
欄位進行選擇。RuntimeClass 的 nodeSelector 與 Pod 的 nodeSelector 在准入階段合併,有效地取兩者所選節點集的交集。如果存在衝突,Pod 將被拒絕。
如果支援的節點被汙染以防止其他 RuntimeClass Pod 在節點上執行,你可以向 RuntimeClass 新增 tolerations
。與 nodeSelector
一樣,容忍度在准入階段與 Pod 的容忍度合併,有效地取兩者所容忍節點集的並集。
要了解有關配置節點選擇器和容忍度的更多資訊,請參閱將 Pod 分配給節點。
Pod 開銷
Kubernetes v1.24 [stable]
你可以指定與執行 Pod 相關的**開銷**資源。宣告開銷允許叢集(包括排程器)在對 Pod 和資源做出決策時將其考慮在內。
Pod 開銷透過 RuntimeClass 的 overhead
欄位定義。透過使用此欄位,你可以指定利用此 RuntimeClass 執行 Pod 的開銷,並確保這些開銷在 Kubernetes 中得到考慮。