 OCI 運(yùn)行時規(guī)范)
云原生操作系統(tǒng)容器編排【免費(fèi)下載鏈接】talosTalos Linux is a modern Linux distribution built for Kubernetes.項(xiàng)目地址https://gitcode.com/gh_mirrors/ta/talos點(diǎn)擊查看免費(fèi)下載導(dǎo)讀CRIBaseRuntimeSpecConfig是 Talos Linux 提供的配置文檔Configuration Document用于以聲明式方式覆寫 CRIContainerd為容器生成的基礎(chǔ) OCI 運(yùn)行時規(guī)范Runtime Spec。本文以官方參考文檔為核心結(jié)合倉庫源碼講解該文檔的 YAML 結(jié)構(gòu)、字段語義、與舊字段.machine.baseRuntimeSpecOverrides的關(guān)系以及它在 Talos 內(nèi)部從配置文檔到/etc/cri/conf.d/base-spec.json落地文件的完整鏈路。讀完本文你將能夠?yàn)?Talos 節(jié)點(diǎn)上的全部 CRI 容器統(tǒng)一設(shè)置資源限制rlimit、Sysctl、Capabilities 等底層參數(shù)并理解其生效機(jī)制與驗(yàn)證手段。一、什么是 CRIBaseRuntimeSpecConfig在 Kubernetes 集群中Pod 內(nèi)容器的進(jìn)程屬性如文件描述符上限、Sysctl、Capabilities、掛載參數(shù)等由容器運(yùn)行時根據(jù) OCI 運(yùn)行時規(guī)范生成。Talos Linux 基于 Containerd CRI 運(yùn)行工作負(fù)載其容器進(jìn)程的默認(rèn)規(guī)范由oci.GenerateSpecWithPlatform生成見 runtime_spec_config.go。CRIBaseRuntimeSpecConfig文檔的作用就是為這份基礎(chǔ) OCI 運(yùn)行時規(guī)范提供統(tǒng)一、可版本化的覆寫入口使運(yùn)維人員無需登錄節(jié)點(diǎn)、也無需侵入 Containerd 配置即可對節(jié)點(diǎn)上所有 CRI 容器的基礎(chǔ)運(yùn)行時屬性做全局調(diào)整。在源碼中該文檔的類型定義位于 base_runtime_spec.go其 Kind 常量為const CRIBaseRuntimeSpecConfigKind CRIBaseRuntimeSpecConfig并通過registry.Register注冊為v1alpha1版本可識別的配置文檔類型base_runtime_spec.go。這意味著它與其他配置文檔一樣可以作為一個獨(dú)立 YAML 文檔追加到機(jī)器配置Machine Config中參與配置合并、校驗(yàn)與下發(fā)流程。二、配置示例與字段說明2.1 官方示例官方參考文檔給出的最小可用示例與倉庫內(nèi)測試數(shù)據(jù) cribaseruntimespecconfig.yaml 一致如下apiVersion: v1alpha1 kind: CRIBaseRuntimeSpecConfig # Overrides for the default OCI runtime specification used by CRI containers. overrides: process: rlimits: - hard: 1024 soft: 1024 type: RLIMIT_NOFILE該示例的作用是將節(jié)點(diǎn)上所有 CRI 容器進(jìn)程的RLIMIT_NOFILE可打開文件描述符數(shù)量軟、硬限制統(tǒng)一設(shè)置為1024。2.2 字段參考表FieldTypeDescriptionValue(s)overridesUnstructured用于覆寫 CRI 容器默認(rèn) OCI 運(yùn)行時規(guī)范的對象。該文檔與已廢棄的.machine.baseRuntimeSpecOverrides字段互斥。Strategic merge patches 會將此 overrides 對象整體替換因此重復(fù)應(yīng)用同一文檔是冪等的。應(yīng)用、更新或移除這些覆寫會自動重啟 CRI無需重啟機(jī)器。符合 OCI 運(yùn)行時規(guī)范的結(jié)構(gòu)化對象2.3 字段實(shí)現(xiàn)細(xì)節(jié)在 Go 類型中overrides字段被定義為meta.Unstructured類型并帶有merge:replace標(biāo)簽OverridesConfig meta.Unstructured yaml:overrides,omitempty merge:replace見 base_runtime_spec.go。這里有兩個值得注意的實(shí)現(xiàn)語義Unstructured非結(jié)構(gòu)化overrides的內(nèi)容不經(jīng)過 Talos 的強(qiáng)類型定義而是直接透傳任意符合 OCI 運(yùn)行時規(guī)范opencontainers/runtime-spec 的specs.Spec結(jié)構(gòu)的 YAML/JSON 數(shù)據(jù)。這意味著你可以覆寫process、linux、mounts、hooks等規(guī)范中的任何一級字段具備極高的靈活性。merge:replace合并例如通過talosctl patch進(jìn)行 Strategic Merge Patch時整個overrides對象作為整體被替換而不是做深層次逐字段合并。這正是文檔中重復(fù)應(yīng)用同一文檔是冪等的這一特性的代碼基礎(chǔ)——相關(guān)冪等性測試見 base_runtime_spec_test.go。三、關(guān)鍵行為與注意事項(xiàng)官方文檔明確了overrides字段的幾條核心語義這些行為在源碼與測試中均有對應(yīng)實(shí)現(xiàn)3.1 與.machine.baseRuntimeSpecOverrides互斥CRIBaseRuntimeSpecConfig文檔與 v1alpha1 配置中已廢棄的.machine.baseRuntimeSpecOverrides字段互斥不能同時使用。這種互斥由V1Alpha1ConflictValidate方法強(qiáng)制執(zhí)行base_runtime_spec.gofunc (cfg *CRIBaseRuntimeSpecConfigV1Alpha1) V1Alpha1ConflictValidate(v1alpha1Cfg *v1alpha1.Config) error { if v1alpha1Cfg ! nil v1alpha1Cfg.MachineConfig ! nil v1alpha1Cfg.MachineConfig.MachineBaseRuntimeSpecOverrides.Object ! nil { return errors.New(base runtime spec overrides are already set in v1alpha1 config) } return nil }對應(yīng)的測試用例覆蓋了合法未設(shè)置舊字段與沖突已設(shè)置舊字段兩種場景base_runtime_spec_test.go。3.2 應(yīng)用、更新、移除都會自動重啟 CRI無需重啟機(jī)器文檔明確說明應(yīng)用、更新或移除這些覆寫會自動重啟 CRI機(jī)器重啟不是必需的。這意味著該配置適用于需要熱變更容器運(yùn)行時基礎(chǔ)屬性的場景。從源碼鏈路看配置最終會被轉(zhuǎn)換為/etc/cri/conf.d/base-spec.json文件路徑常量見 constants.go為cri/conf.d/base-spec.json掛在/etc下而 Containerd CRI 插件通過base_runtime_spec /etc/cri/conf.d/base-spec.json引用該文件見 hack/cri-plugin.part。文件內(nèi)容變化觸發(fā) CRI 服務(wù)重啟從而讓新的運(yùn)行時規(guī)范生效。3.3 Strategic Merge 的整體替換與冪等性由于overrides的合并策略是整體替換merge:replace對同一文檔重復(fù)應(yīng)用補(bǔ)丁不會產(chǎn)生累積效果天然冪等。測試TestCRIBaseRuntimeSpecConfigMergeIsIdempotent驗(yàn)證了連續(xù)應(yīng)用兩次補(bǔ)丁配置內(nèi)容不變這一特性base_runtime_spec_test.go。四、底層原理配置文檔到運(yùn)行時文件的完整鏈路理解這條鏈路有助于排障與定制。從源碼結(jié)構(gòu)看該功能由兩級 COSI 控制器協(xié)作完成4.1 第一級RuntimeSpecConfigController投影覆寫控制器位于 internal/app/machined/pkg/controllers/cri/runtime_spec_config.go名稱為cri.RuntimeSpecConfigController。它監(jiān)聽活躍的機(jī)器配置config.ActiveID執(zhí)行兩個動作生成默認(rèn)規(guī)范調(diào)用oci.GenerateSpecWithPlatform生成默認(rèn) OCI 運(yùn)行時規(guī)范并以資源 IDdefault寫入BaseRuntimeSpecConfigs.cri.talos.dev資源runtime_spec_config.go。投影用戶覆寫若配置中攜帶CRIBaseRuntimeSpecConfig文檔且Overrides()非空則以資源 IDoverrides寫入同一類型資源runtime_spec_config.go。這里有一個對 CRI 兼容性很重要的細(xì)節(jié)生成默認(rèn)規(guī)范后控制器會主動清空默認(rèn)的 rlimits// compatibility with CRI defaults: // * remove default rlimits (See https://github.com/containerd/cri/issues/515) defaultSpec.Process.Rlimits nil見 runtime_spec_config.go。這一行為在測試中也有對應(yīng)斷言默認(rèn)規(guī)范中的process不包含rlimits鍵runtime_spec_config_test.go。資源類型與兩個固定 IDdefault/overrides定義在 base_runtime_spec_config.goconst ( // BaseRuntimeSpecDefaultID is the generated default OCI runtime spec resource ID. BaseRuntimeSpecDefaultID resource.ID default // BaseRuntimeSpecOverridesID is the CRIBaseRuntimeSpecConfig document overrides resource ID. BaseRuntimeSpecOverridesID resource.ID overrides )4.2 第二級CRIBaseRuntimeSpecController合并并落盤控制器位于 internal/app/machined/pkg/controllers/files/cri_base_runtime_spec.go名稱為files.CRIBaseRuntimeSpecController。它執(zhí)行以下操作讀取BaseRuntimeSpecConfigs.cri.talos.dev命名空間下全部規(guī)范源并按資源 ID 排序default在前overrides在后。按順序?qū)⒏鱾€源逐層合并merge.Merge為一個最終的oci.Speccri_base_runtime_spec.go。由于overrides資源排在default之后用戶覆寫會覆蓋默認(rèn)值。將合并結(jié)果以 JSON 序列化寫入EtcFileSpec資源最終落盤為/etc/cri/conf.d/base-spec.json文件權(quán)限0o600并設(shè)置 SELinux 標(biāo)簽cri_base_runtime_spec.go。CRIBaseRuntimeSpecConfig 文檔Machine Config │ ▼ RuntimeSpecConfigControllercri 控制器 ├─ 生成 default 規(guī)范去除默認(rèn) rlimits └─ 投影 overrides 規(guī)范 │ ▼ BaseRuntimeSpecConfigs.cri.talos.devdefault overrides │ ▼ CRIBaseRuntimeSpecControllerfiles 控制器 ├─ 按 ID 排序后 merge.Merge 合并 └─ 寫入 /etc/cri/conf.d/base-spec.json0600SELinux 標(biāo)記 │ ▼ Containerd CRI 插件引用 base_runtime_spec → CRI 重啟生效這一合并鏈路恰好印證了overrides 是覆寫默認(rèn)規(guī)范、整體替換的文檔語義你寫入overrides的任何字段最終都會覆蓋在 CRI 默認(rèn)生成的規(guī)范之上。五、配置校驗(yàn)與舊字段遷移5.1 校驗(yàn)邏輯CRIBaseRuntimeSpecConfigV1Alpha1實(shí)現(xiàn)了config.Validator接口base_runtime_spec.go。校驗(yàn)方式是把overrides對象 JSON 序列化后反序列化到 OCI 的specs.Spec結(jié)構(gòu)func (cfg *CRIBaseRuntimeSpecConfigV1Alpha1) Validate(validation.RuntimeMode, ...validation.Option) ([]string, error) { jsonSpec, err : json.Marshal(cfg.Overrides()) if err ! nil { return nil, fmt.Errorf(failed to marshal base runtime spec overrides: %w, err) } var ociSpec specs.Spec if err json.Unmarshal(jsonSpec, ociSpec); err ! nil { return nil, fmt.Errorf(failed to unmarshal base runtime spec overrides: %w, err) } return nil, nil }即只要overrides內(nèi)容在結(jié)構(gòu)上合法能被解析為 OCI 運(yùn)行時規(guī)范例如process.rlimits必須是數(shù)組而不能是字符串配置即可通過校驗(yàn)。非法結(jié)構(gòu)的測試用例process.rlimits: invalid會在校驗(yàn)時報(bào)錯failed to unmarshal base runtime spec overridesbase_runtime_spec_test.go。5.2 從舊字段遷移.machine.baseRuntimeSpecOverrides字段已廢棄。從源碼看Talos 保留了兼容層criBaseRuntimeSpecConfigShim會把舊字段的值包裝成與文檔相同的Overrides()接口v1alpha1_cri_bridge.go因此使用舊字段的存量配置依然可以工作。但使用舊字段會在配置校驗(yàn)階段產(chǎn)生棄用警告.machine.baseRuntimeSpecOverrides is deprecated; use a CRIBaseRuntimeSpecConfig document instead見 v1alpha1_validation.go 及對應(yīng)測試 v1alpha1_validation_test.go。遷移方式很簡單將舊字段的內(nèi)容原樣搬入CRIBaseRuntimeSpecConfig文檔的overrides鍵下同時從.machine段落中刪除舊字段二者互斥不能共存。六、實(shí)戰(zhàn)如何應(yīng)用與驗(yàn)證6.1 寫入機(jī)器配置CRIBaseRuntimeSpecConfig是獨(dú)立配置文檔可直接寫入 Talos 機(jī)器配置Machine Config中與apiVersion: v1alpha1 / kind: MachineConfig文檔并列。也可以通過talosctl以補(bǔ)丁方式應(yīng)用talosctl apply-config --patch base-runtime-spec.yaml --nodes node其中base-runtime-spec.yaml內(nèi)容即為第二節(jié)的示例或你的自定義 overrides。應(yīng)用后無需重啟機(jī)器CRI 會自動重啟并加載新的運(yùn)行時規(guī)范。6.2 常見覆寫場景由于overrides直接透傳 OCI 運(yùn)行時規(guī)范結(jié)構(gòu)常見用法包括進(jìn)程資源限制rlimits如官方示例的RLIMIT_NOFILE。Sysctl 內(nèi)核參數(shù)在linux.sysctl下設(shè)置例如net.core.somaxconn。Capabilities 調(diào)整修改process.capabilities如bounding、permitted、effective。只讀根文件系統(tǒng)設(shè)置process的readonlyPaths、maskedPaths或noNewPrivileges等安全屬性。掛載選項(xiàng)在mounts中追加掛載條目。所有字段遵循 opencontainers/runtime-spec 中specs.Spec的 JSON 結(jié)構(gòu)你可以參照 OCI 運(yùn)行時規(guī)范文檔編寫對應(yīng)層級。6.3 驗(yàn)證方式校驗(yàn)配置應(yīng)用前可先用talosctl validate --mode cloud --config file之類的校驗(yàn)命令確認(rèn)配置合法若 overrides 結(jié)構(gòu)非法校驗(yàn)階段會直接報(bào)錯。確認(rèn)落地文件配置生效后節(jié)點(diǎn)上/etc/cri/conf.d/base-spec.json即為最終合并結(jié)果可用talosctl read /etc/cri/conf.d/base-spec.json查看其內(nèi)容確認(rèn)overrides已覆蓋默認(rèn)值。容器內(nèi)驗(yàn)證進(jìn)入任意 Pod 容器執(zhí)行cat /proc/self/limits核對Max open files等指標(biāo)是否與配置一致。七、小結(jié)CRIBaseRuntimeSpecConfig為 Talos Linux 提供了一條聲明式、可校驗(yàn)、可熱更新的路徑用于定制節(jié)點(diǎn)上所有 CRI 容器的底層 OCI 運(yùn)行時屬性。其核心要點(diǎn)可歸納為結(jié)構(gòu)apiVersion: v1alpha1、kind: CRIBaseRuntimeSpecConfig、單個overrides非結(jié)構(gòu)化對象遵循 OCI 運(yùn)行時規(guī)范結(jié)構(gòu)語義與廢棄字段.machine.baseRuntimeSpecOverrides互斥Strategic Merge 整體替換、應(yīng)用冪等變更自動重啟 CRI、無需重啟機(jī)器鏈路配置文檔 →RuntimeSpecConfigController投影default/overrides 兩個資源→CRIBaseRuntimeSpecController合并落盤 →/etc/cri/conf.d/base-spec.json→ Containerd CRI 加載遷移舊字段仍受兼容支持但會產(chǎn)生棄用警告建議遷移到新文檔。對于需要統(tǒng)一調(diào)整節(jié)點(diǎn)容器進(jìn)程資源限制、內(nèi)核參數(shù)或安全屬性的運(yùn)維場景該文檔是 Talos 官方推薦的基礎(chǔ)運(yùn)行時定制入口。贊分享云原生操作系統(tǒng)容器編排【免費(fèi)下載鏈接】talosTalos Linux is a modern Linux distribution built for Kubernetes.項(xiàng)目地址https://gitcode.com/gh_mirrors/ta/talos點(diǎn)擊查看免費(fèi)下載相關(guān)推薦runc基于 OCI 規(guī)范的 Linux 容器運(yùn)行時——從源碼構(gòu)建到容器生命周期管理完全指南runc基于 OCI 規(guī)范的 Linux 容器運(yùn)行時——從源碼構(gòu)建到容器生命周期管理完全指南 runc 是 Open Container Initiative容器運(yùn)行時云原生iztro 性能優(yōu)化與最佳實(shí)踐打造高效排盤應(yīng)用iztro 性能優(yōu)化與最佳實(shí)踐打造高效排盤應(yīng)用 iztro 作為一款輕量級的紫微斗數(shù)排盤 JavaScript 開源庫在處理復(fù)雜的星盤計(jì)算時性能優(yōu)化至關(guān)重科學(xué)計(jì)算OpenContainers鏡像規(guī)范OCI運(yùn)行時配置轉(zhuǎn)換詳解OpenContainers鏡像規(guī)范OCI運(yùn)行時配置轉(zhuǎn)換詳解 前言 在容器技術(shù)領(lǐng)域OpenContainers項(xiàng)目制定的鏡像規(guī)范 image spec 是構(gòu)云原生存儲創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考