本文介绍如何使用部署安全措施在 Azure Kubernetes 服务 (AKS) 群集上强制实施最佳做法。
概述
注意
默认情况下,在 AKS 自动中启用部署安全措施。
在整个开发生命周期中,如果 Kubernetes 资源的初始部署包括配置错误,出现 bug、问题和其他问题很常见。 为了减轻 Kubernetes 开发的负担,Azure Kubernetes 服务 (AKS) 提供部署保障。 部署安全措施通过 Azure Policy 控制在 AKS 群集中强制实施 Kubernetes 最佳做法。
部署保障提供两个级别的配置:
-
Warn
:在代码终端中显示警告消息,提醒你有不合规的群集配置,但仍允许请求通过。 -
Enforce
:如果部署不遵循最佳做法,则通过拒绝和变更部署来强制实施合规配置。
为“警告”或“强制”配置部署安全措施后,部署安全措施会在创建或更新时以编程方式评估 Kubernetes 资源,以满足合规性要求。 部署保障还通过 Azure 门户 或 CLI 或终端中的 Azure Policy 合规性仪表板在每个资源级别显示跨工作负荷的聚合符合性信息。 运行不合规的工作负荷表示群集未遵循最佳做法,并且群集上的工作负荷面临群集配置导致的问题的风险。
先决条件
注意
群集管理员不需要 Azure Policy 权限来启用或禁用部署保护。 但是,需要安装 Azure Policy 加载项。
- 你需要为 AKS 启用 Azure Policy 加载项。 有关详细信息,请参阅启用 AKS 群集上的 Azure Policy。
部署保障策略
下表列出了启用部署保护时,哪些策略会生效,以及它们所针对的 Kubernetes 资源。 可以在 Azure 门户中将 当前可用的部署安全措施 作为 Azure Policy 定义或在 Azure Kubernetes 服务的 Azure Policy 内置定义中查看。 此集合背后的意图是创建适用于大多数用户和用例的常见和通用最佳做法列表。
部署安全措施策略 | 变更后的结果(如果有) |
---|---|
无法编辑单个节点 | 空值 |
Kubernetes 群集容器 CPU 和内存资源限制不得超过指定的限制 | 如果未设置 CPU 资源限制,则将其设置为 500m;如果不存在路径,则将内存限制设置为 500Mi |
必须具有反关联规则或 topologySpreadConstraintsSet | 空值 |
无特定于 AKS 的标签 | 空值 |
Kubernetes 群集容器应只使用允许的映像 | 空值 |
保留的系统池标记 | 如果未设置,则从用户节点池中删除 CriticalAddonsOnly 污点。 AKS 使用 CriticalAddonsOnly 污点让客户 Pod 远离系统池。 此配置可确保 AKS 组件与客户 Pod 之间的明确分离,并防止驱逐不能容忍 CriticalAddonsOnly 污点的客户 Pod。 |
确保群集容器已配置就绪情况或运行情况探测 | 空值 |
Kubernetes 群集应使用容器存储接口 (CSI) 驱动程序 StorageClass | 空值 |
Kubernetes 群集服务应使用唯一选择器 | 空值 |
Kubernetes 群集容器映像不应包含最新的映像标记 | 空值 |
如果要提交有关部署保障的想法或请求,请在 AKS GitHub 存储库 中打开一个问题,并在标题的开头添加 [Deployment Safeguards request]
。
启用部署安全措施
注意
使用部署保障 Enforce
级别意味着你选择加入被阻止和改变的部署。 在启用 Enforce
之前,请考虑这些策略如何与 AKS 群集配合使用。
在现有群集上启用部署安全措施
在启用了 Azure Policy 插件的现有集群上,使用带有 --level
标志的 az aks safeguard create
命令启用部署保护措施。 如果要接收不合规的警告,请将 --level
设置为 Warn
。 如果要拒绝或变更所有不合规的部署,请将其设置为 Enforce
。
az aks safeguards create --resource-group <resource-group-name> --name <cluster-name> --level Enforce
还可以使用 --cluster
标志和指定群集资源 ID 来启用部署安全措施。
az aks safeguards create --cluster <ID> --level Enforce
如果要更新现有群集的部署保障级别,请使用新值 --level
运行以下命令。
az aks safeguards update --resource-group <resource-group-name> --name <cluster-name> --level Warn
排除命名空间
还可以从部署安全措施中排除某些命名空间。 排除命名空间时,该命名空间中的活动不受 Deployment Safeguards 警告或强制措施影响。
例如,若要排除命名空间 ns1
和 ns2
,可以使用带 --excluded-ns
标志的命名空间列表,列表中的命名空间用空格分隔,如以下示例所示:
az aks safeguards update --resource-group <resource-group-name> --name <cluster-name> --level Warn --excluded-ns ns1 ns2
更新部署安全措施版本
部署安全措施遵循 AKS 加载项版本控制方案。 部署保护的每个新版本都将作为 AKS 中的新次要版本发布。 这些更新将通过 AKS GitHub 发行说明 传达,并反映在文档中的“部署保障策略”表中。
若要了解有关 AKS 版本控制和加载项的详细信息,请参阅以下文档: aks-component-versions 和 aks-versioning-for-addons。
验证群集之间的合规性
部署 Kubernetes 清单后,如果群集不符合部署保障措施,CLI 或终端中会显示警告或潜在拒绝消息,如以下示例所示:
警告
$ kubectl apply -f deployment.yaml
Warning: [azurepolicy-k8sazurev1antiaffinityrules-ceffa082711831ebffd1] Deployment with 2 replicas should have either podAntiAffinity or topologySpreadConstraints set to avoid disruptions due to nodes crashing
deployment.apps/simple-web created
强制执行
通过部署安全措施变更,Enforce
级别在适用时会变更 Kubernetes 资源。 但是,Kubernetes 资源仍需要通过所有安全措施才能成功部署。 如果任何安全措施策略失败,资源将被拒绝,不会进行部署。
$ kubectl apply -f deployment.yaml
Error from server (Forbidden): error when creating "deployment.yaml": admission webhook "validation.gatekeeper.sh" denied the request: [azurepolicy-k8sazurev1antiaffinityrules-ceffa082711831ebffd1] Deployment with 2 replicas should have either podAntiAffinity or topologySpreadConstraints set to avoid disruptions due to nodes crashing
如果 Kubernetes 资源符合适用的变更安全措施并满足所有其他安全措施要求,则会成功部署,如以下示例所示:
$ kubectl apply -f deployment.yaml
deployment.apps/simple-web created
使用 Azure Policy 仪表板验证群集之间的合规性
若要验证是否已应用部署安全措施并检查群集的符合性,请导航到群集的 Azure 门户页,然后选择“ 策略”,然后选择 “Azure Policy”。
从策略和计划列表中,选择与部署安全措施关联的计划。 你会看到一个仪表板,其中显示了 AKS 群集中的合规性状态。
注意
若要正确评估 AKS 群集的合规性,Azure Policy 计划的范围必须限定为群集的资源组。
禁用部署安全措施
若要在群集上禁用部署安全措施,请使用 delete
命令。
az aks safeguards delete --resource-group <resource-group-name> --name <cluster-name>
FAQ
我可以创建自己的变更吗?
否。 如果你有安全措施方面的想法,请在 AKS GitHub 存储库中提出问题,并将 [Deployment Safeguards request]
添加到标题开头。
启用“强制”后,我可以选择想要进行的变更吗?
否。 部署安全措施要么全有,要么全无。 启用警告或强制实施后,所有安全措施都将处于活动状态。
为什么即使部署资源未遵循最佳做法,还是得到接纳?
部署安全措施通过 Azure Policy 控件强制实施最佳做法标准,并具有针对 Kubernetes 资源进行验证的策略。 为了评估和强制实施群集组件,Azure Policy 扩展 Gatekeeper。 Gatekeeper 强制目前也在 fail-open
模型中运行。 由于无法保证 Gatekeeper 将响应我们的网络调用,因此请确保在这种情况下,跳过验证,以免拒绝阻止部署。
若要了解详细信息,请参阅 Gatekeeper 中的工作负荷验证。
后续步骤
- 详细了解运行 AKS 群集的最佳做法。