共计 6118 个字符,预计需要花费 16 分钟才能阅读完成。
介 绍
最后在 Kubernetes v1.21 中被弃用的 PodSecurityPolicy API,曾经在 Kubernetes v1.25 中被齐全删除。因为 API 被移除,你无奈在 Kubernetes v1.25 集群中创立、编辑或查问 PodSecurityPolicy 资源。此外,因为其准入控制器已被移除,所以你的集群无奈再强制执行在 Kubernetes v1.24 及之前版本中创立的任何 PodSecurityPolicy 规定。因而,你必须将工作负载平安迁徙到新的 Pod Security Admission 控制器、补充策略引擎或两者的组合中。
本文将探讨如何将 Rancher 治理的上游集群降级到 Kubernetes v1.25,包含如何应用 Rancher 特定的机制来利用 Pod Security Admission 配置,以及如何从 Rancher 保护的工作负载中删除 PodSecurityPolicies。本文是一个示例教程,倡议先在非生产环境中运行这些步骤来相熟流程,而后再决定你的生产环境须要如何操作。
要 求
将集群降级到 Kubernetes v1.25 之前,请确保:
- 你正在运行 Rancher v2.7.2 或更高版本。
- 你的上游集群正在运行 Kubernetes v1.24。
- 你已实现了 Kubernetes 文档中概述的从 PodSecurityPolicies 迁徙到内置的 Pod Security Admission 控制器的步骤,将 PodSecurityPolicies 映射到 Pod Security Admission 配置或 Pod Security Standard 标签中。
- 你曾经评估过 Pod Security Admission 是否满足你的需要。在本文最初有一些对于补充策略引擎的资源,如果 Pod Security Admission 不足以满足你的应用需要,你可能须要将它增加到你的集群中。
配置 Pod Security Admission 控制器
第一步是配置新的 Pod Security Admission 控制器。在 Kubernetes v1.24 中,这个准入控制器曾经在 kube-apiserver 中默认启用。有几种办法能够配置这个准入控制器,其中一种抉择是通过 kube-apiserver 命令行参数部署集群范畴的 AdmissionConfiguration。从 2.7.2 版本开始,Rancher 提供了两个开箱即用的 AdmissionConfigurations,或者你也能够通过 Rancher UI 创立本人的 Pod Security Admission 配置。上面将更具体地介绍这些性能。
审查 Pod Security Admission 配置预设
要查看 Rancher 附带的 Pod Security Admission 配置预设,请应用管理员身份登录 Rancher 时导航至 Cluster Management → Advanced → Pod Security Admissions。你将看到两个可用的预设:rancher-privileged 和 rancher-restricted。rancher-restricted 将 enforce、warn 和 audit 值设置为 restricted 并蕴含一些命名空间豁免,用来容许 Rancher 在你的集群中失常工作。rancher-privileged 预设等同于 Kubernetes 文档中提供的示例 AdmissionConfiguration,并且不提供任何特定的平安保障。你能够在 Rancher 文档 上浏览更多对于 Pod Security Admission 和 Pod Security Standard 的信息。
(可选)创立自定义 Pod Security Admission 配置
你还能够创立本人的 Pod Security Admission 配置。为此,请导航至 Cluster Management → Advanced → Pod Security Admissions,而后单击 Create:
为你的新 Pod Security Admission 配置抉择一个名称,并抉择利用于执行、审计和正告的规定。你还能够指定是否有豁免来满足你的需要。填写表单后,单击Create。
配置集群应用 Pod Security Admission 配置
你能够利用 Rancher UI 来利用集群范畴的 Pod Security Admission 配置。在 Rancher Manager 的 Cluster Management 选项卡中,抉择要配置的集群的汉堡菜单,而后抉择 Edit Config 选项:
而后针对不同的上游集群启用 Pod Security Admission:
- RKE:导航到 Advanced Options,而后在 Pod SecurityAdmissionConfiguration Template 字段中抉择你的首选选项。
- RKE2 或 K3S:导航到 Cluster Configuration 面板。在 Basics 窗格中的 Security 局部下,在 Pod Security Admission Configuration Template 字段中抉择你的首选选项。
实现配置后,请确保保留并测试。
手动配置单个命名空间
要应用 Pod Security Standard 标签独自配置命名空间,请参考 Kubernetes 文档。请留神,当 Pod Security Admission 配置与 Pod Security Standard 标签联合应用时,准入控制器将疏忽任何利用于在 Pod Security Admission 配置中标记为豁免的资源的 Pod Security Standard 标签。
删除 PodSecurityPolicies
本节假如你曾经将 PodSecurityPolicies 映射到 Pod Security Admission 配置和 Pod Security Standard 命名空间标签,并且你的集群符合要求。如果你还没有这样做,请查看无关从 PodSecurityPolicies 迁徙到内置 PodSecurity Admission Controller 的 Kubernetes 文档。
不要手动删除 PodSecurityPolicies。通过 kubectl delete 删除由 Helm chart 增加的 PodSecurityPolicies 不会从 Helm 版本中删除它们的援用,并且可能导致无奈降级甚至删除 Helm chart 的状况。要理解无关如何防止出现这种状况的更多信息,请持续浏览本节。
降级你的 Apps & Marketplace chart 以删除 PodSecurityPolicies。之前装置 PodSecurityPolicies 的 Rancher 保护的工作负载减少了一个格局为 v102.x.y 的新版本,容许你删除这些资源。显著的变动包含:
- 创立了一个新的 PodSecurityPolicy 开关:global.cattle.psp.enabled。以前的 PodSecurityPolicy 开关已被这个新开关取代。
- 在 chart 装置前,减少了 PodSecurityPolicies 的集群能力验证。如果你尝试在关上 PodSecurityPolicy 开关的状况下将这些新 chart 装置到 Kubernetes v1.25 集群中,你将看到一条谬误音讯,要求你在持续之前禁用 PodSecurityPolicies。
为了顺利降级到 Kubernetes v1.25,你必须删除应用 Helm 部署的 PodSecurityPolicy 资源。为此,请将每个 chart 的装置降级到最新版本 v102.0.0,并确保将 PodSecurityPolicy 开关 global.cattle.psp.enabled 的值设置为 false。
验证集群中的所有工作负载都已迁徙到 Pod Security Admission
验证集群中的其余工作负载是否也已从 PodSecurityPolicies 迁徙到 Pod Security Admission 和 Standards。你能够通过运行 kubectl get podsecuritypolicies 查看集群中存在哪些 PodSecurityPolicies。请留神,集群中存在 PodSecurityPolicy 资源并不意味着有工作负载在应用它。
要查看哪些 PodSecurityPolicies 仍在应用中,你能够运行以下命令。请留神,此策略可能会脱漏以后未运行的工作负载,例如 CronJobs、以后正本数为 0 的工作负载或其余尚未推出的工作负载:
kubectl get pods --all-namespaces \
--output jsonpath="{.items[*].metadata.annotations.kubernetes\.io\/psp}" \
| tr """\n" | sort -u
要理解无关查看正在应用的 PodSecurityPolicies 的策略的更多信息,请参见 Kubernetes 的 PodSecurityPolicy 迁徙文档的确定适当的 Pod 安全级别章节。
将集群降级到 Kubernetes v1.25
在后面的步骤实现并且集群中没有残余的 PodSecurityPolicies 之后,就能够将集群降级到 Kubernetes v1.25 了。对于上游集群,你能够通过 Rancher UI 执行降级。
要降级集群,请导航至 Cluster Management。在 Clusters 页面中,单击要降级到 Kubernetes v1.25 的集群对应的汉堡菜单,而后抉择 Edit Config 选项。依据你的集群类型更改 Kubernetes 版本:
- RKE:导航到 Cluster Options → Kubernetes options。在 Kubernetes 版本字段中,抉择你要降级到的 v1.25 版本。
- RKE2 或 K3S:导航到 Cluster Configuration 面板并抉择 Basics 窗格。在 Basics 局部下,找到 Kubernetes Version 字段,抉择你要降级到的 v1.25 版本。
保留抉择的配置。你将看到集群从 Active 过渡到 Upgrading 的状态。降级可能须要一些工夫,实现后集群状态将再次变为 Active 状态。
细粒度的策略
因为 Pod Security Admission 和 Pod Security Standards 不像 PodSecurityPolicies 那样细化,并且不提供渐变性能来确保 Pod 合乎规定,你可能心愿通过在集群中装置独自的准入控制器来补充性能。在 Kubernetes 畛域,有一些准入控制器提供可变准入和更细粒度的验证性能,例如 Kubewarden、Kyverno、Neuvector 和 OPA Gatekeeper 等等。你能够在本文开端找到无关这些补充策略引擎的文档链接。
故障排查
降级到 Kubernetes v1.25 后,如果你遗记查看是否存在 PodSecurityPolicies(或其余已停用的 API),你可能会留神到某些 Helm 版本无奈降级或卸载。如果产生这种状况,你能够应用 helm-mapkubeapis 插件将你的版本复原到工作状态。此插件读取 Helm 公布数据并用新版本替换被取代的 API,或删除援用已从 Kubernetes 中齐全删除的 API 的资源。
请留神,Helm 插件是在运行命令的机器上装置的。因而,请确保在你打算运行清理步骤的同一台机器上运行装置步骤。
装置 helm-mapkubeapis
- 请确保你曾经装置了 Helm,执行 helm version 会失去相似如下的输入:
version.BuildInfo{Version:"v3.10.2", GitCommit:"50f003e5ee8704ec937a756c646870227d7c8b58", GitTreeState:"clean", GoVersion:"go1.18.8"}
- 装置 helm-mapkubeapis 插件:
helm plugin install https://github.com/helm/helm-mapkubeapis
输入应相似于:
Downloading and installing helm-mapkubeapis v0.4.1 …
https://github.com/helm/helm-mapkubeapis/releases/download/v0.4.1/helm-mapkubeapis_0.4.1_darwin_amd64.tar.gz
Installed plugin: mapkubeapis
- 查看插件是否正确装置:
helm mapkubeapis --help
输入应相似于:
Map release deprecated or removed Kubernetes APIs in-place
Usage:
mapkubeapis [flags] RELEASE
Flags:
--dry-run simulate a command
-h, --help help for mapkubeapis
--kube-context string name of the kubeconfig context to use
--kubeconfig string path to the kubeconfig file
--mapfile string path to the API mapping file
--namespace string namespace scope of the release
确保装置的 helm-mapkubeapis 版本为 v0.4.1 或更高版本,因为晚期版本不反对删除资源。
清理 PodSecurityPolicies
- 运行
kubectl cluster-info
确保能够拜访指标集群。 - 列出集群中装置的所有版本
helm list --all-namespaces
- 应用
helm mapkubeapis --dry-run <release-name> --namespace <namespace-name>
对你想清理的每一个版本进行模仿运行,输入会告知你哪些资源将被替换或移除。 - 查看更改后,执行残缺命令:
helm mapkubeapis <release-name> --namespace <namespace-name>.
将你的工作负载降级到反对 Kubernetes v1.25 的版本
清理损坏的版本后,你须要将工作负载降级到 Kubernetes v1.25 中反对的版本。不能跳过这个步骤,因为清理后的版本不能保障失常工作或具备 Kubernetes v1.25 所需的安全性。
对于 Rancher 保护的工作负载,请依照本文删除 PodSecurityPolicies 局部中介绍的步骤进行操作。对于其余工作负载,请参阅对应的供应商的文档。
下一步
- 具体理解 Pod Security Admission 控制器和 Pod Security Standard。
- 具体理解补充策略引擎:Kubewarden、Kyverno、NeuVector 和 OPAGatekeeper。
- 查看如何将 PodSecurityPolicies 迁徙到 Kubewarden 策略。
- 具体理解如何应用 helm-mapkubeapis。