使用部署安全措施在 Azure Kubernetes 服务 (AKS) 中强制实施最佳做法(预览版)

本文介绍如何使用部署安全措施在 Azure Kubernetes 服务 (AKS) 群集上强制实施最佳做法。

概述

在整个开发生命周期中,如果 Kubernetes 资源的初始部署包括配置错误,出现 bug、问题和其他问题很常见。 为了减轻 Kubernetes 开发的负担,Azure Kubernetes 服务 (AKS) 提供部署保障(预览版)。 部署安全措施通过 Azure Policy 控件在 AKS 群集中强制实施 Kubernetes 最佳做法。

部署安全措施提供两个级别的配置:

  • Warning:在代码终端中显示警告消息,提醒你有不合规的群集配置,但仍允许请求通过。
  • Enforcement:如果部署不遵循最佳做法,则通过拒绝和变更部署来强制实施合规配置。

为“警告”或“强制”配置部署安全措施后,部署安全措施会在创建或更新时以编程方式评估群集是否合规。 部署安全措施还会通过 Azure 门户或 CLI 或终端中的 Azure Policy 合规性仪表板,在每个资源级别显示跨工作负荷的聚合合规性信息。 运行不合规的工作负荷表示群集未遵循最佳做法,并且群集上的工作负荷面临群集配置导致的问题的风险。

重要

AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

先决条件

  • 你需要为 AKS 启用 Azure Policy 加载项。 有关详细信息,请参阅启用 AKS 群集上的 Azure Policy

  • 若要配置部署安全措施,必须具有版本 2.0.0b1 或更高版本的 aks-preview 扩展。 若要安装扩展,请参阅安装 aks-preview CLI 扩展。 我们还建议更新 Azure CLI,以确保已安装最新版本。

  • 若要创建和修改部署安全措施的配置,需要具有 AKS 群集以下权限的订阅:

    • Microsoft.Authorization/policyAssignments/write
    • Microsoft.Authorization/policyAssignments/read
  • 需要注册部署安全措施的功能标志。 要注册功能标志,请参阅注册部署安全措施的功能标志

安装 aks-preview CLI 扩展

  1. 使用 az extension add 命令安装 aks-preview CLI 扩展。

    az extension add --name aks-preview
    
  2. 使用 az extension update 命令更新扩展,确保已安装最新版本。

    az extension update --name aks-preview
    

注册部署安全措施的功能标志

  1. 使用 az feature register 命令注册 SafeguardsPreview 功能标志。

    az feature register --namespace Microsoft.ContainerService --name SafeguardsPreview
    

    状态显示为“已注册”需要几分钟时间

  2. 使用 az feature show 命令验证注册状态。

    az feature show --namespace Microsoft.ContainerService --name SafeguardsPreview
    
  3. 当状态反映为已注册时,使用 az provider register 命令刷新 Microsoft.ContainerService 资源提供程序的注册。

    az provider register --namespace Microsoft.ContainerService
    

部署安全措施策略

注意

ReadOnlyRootFilesystemRootfilesystemInitContainers 策略目前仅适用于 Linux。

下表列出了启用部署安全措施时处于活动状态的策略及其目标 Kubernetes 资源。 可以在 Azure 门户中查看作为 Azure Policy 定义的当前可用部署安全措施,也可以在 Azure Kubernetes 服务的 Azure Policy 内置定义中查看。 此集合背后的意图是创建适用于大多数用户和用例的常见和通用最佳做法列表。

部署安全措施策略 目标 Kubernetes 资源 变更后的结果(如果有)
[预览]: 无法编辑单个节点 节点 空值
Kubernetes 群集容器 CPU 和内存资源限制不得超过指定的限制 Pod 如果未设置 CPU 资源限制,则将其设置为 500m;如果不存在路径,则将内存限制设置为 500Mi
[预览]: 必须设置反相关性规则 部署、StatefulSet、ReplicationController、ReplicaSet 空值
[预览]: 无 AKS 特定标签 部署、StatefulSet、Replicaset 空值
Kubernetes 群集容器应只使用允许的映像 Pod 空值
[预览]: 保留的系统池污点 节点 如果未设置,则从用户节点池中删除 CriticalAddonsOnly 污点。 AKS 使用 CriticalAddonsOnly 污点让客户 Pod 远离系统池。 此配置可确保 AKS 组件与客户 Pod 之间的明确分离,并防止驱逐不能容忍 CriticalAddonsOnly 污点的客户 Pod。
确保群集容器已配置就绪情况或运行情况探测 Pod 空值
Kubernetes 群集应使用容器存储接口 (CSI) 驱动程序 StorageClass StorageClass 空值
[预览]: Kubernetes 群集容器应仅在存在映像拉取机密时拉取映像 Pod 空值
[预览版]:Kubernetes 群集应实现准确的 Pod 中断预算 部署、ReplicaSet、StatefulSet 将 PodDisruptionBudget 资源中的 maxUnavailable 设置为 1。
[预览版]:Kubernetes 群集服务应使用唯一的选择器 服务 空值
[预览]:Pod 规范中的 ReadOnlyRootFilesystem 设置为 true Pod 将 Pod 规范中的 readOnlyRootFilesystem 设置为 true(如果未设置)。 此配置可防止容器写入根文件系统。
[预览]:Pod 规范中的 RootfilesystemInitContainers 设置为 true Pod 将 Pod 规范中的 rootFilesystemInitContainers 设置为 true(如果未设置)。
[预览]:Kubernetes 群集容器映像不应包含最新的映像标记 部署、StatefulSet、ReplicationController、ReplicaSet 空值
[预览]:Kubernetes 群集容器映像必须包含 preStop 挂钩 部署、StatefulSet、ReplicationController、ReplicaSet 空值

如果想要提交有关部署安全措施的想法或请求,请在 AKS GitHub 存储库中提出问题,并将 [deployment safeguards request] 添加到标题开头。

启用部署安全措施

注意

如果首次启用 Azure Policy 以使用部署安全措施,可能需要等待最多 20 分钟,Azure Policy 才会生效。

使用部署安全措施 Enforcement 级别意味着你选择阻止和变更部署。 在启用 Enforcement 之前,请考虑这些策略如何与 AKS 群集配合使用。

在新群集上启用部署安全措施

使用带有 --safeguards-level--safeguards-version 标志的 az aks create 命令,在新群集上启用部署安全措施。

如果要接收不合规的警告,请将 --safeguards-level 设置为 Warning。 如果要拒绝或变更所有不合规的部署,请将其设置为 Enforcement。 若要接收警告,请将 --safeguards-level 设置为“警告”。 若要拒绝或变更所有不遵循部署安全措施的部署,请将 --safeguards-level 设置为“强制”。 若要设置部署安全措施版本,请使用 --safeguards-version 标志。 目前,V2.0.0 是最新版本的部署安全措施。

az aks create \
    --name myAKSCluster \
    --resource-group myResourceGroup \
    --enable-addons azure-policy \
    --safeguards-level Warning \
    --safeguards-version v2.0.0 \
    --generate-ssh-keys

在现有群集上启用部署安全措施

使用带有 --safeguards-level--safeguards-version 标志的 az aks update 命令,在启用了 Azure Policy 加载项的现有群集上启用部署安全措施。 如果要接收不合规的警告,请将 --safeguards-level 设置为 Warning。 如果要拒绝或变更所有不合规的部署,请将其设置为 Enforcement

az aks update --name myAKSCluster --resource-group myResourceGroup --safeguards-level Enforcement --safeguards-version v2.0.0

如果要更新现有群集的部署安全措施级别,请使用 az aks update 命令,并将 --safeguards-level 标志设置为 WarningEnforcement

az aks update --name myAKSCluster --resource-group myResourceGroup --safeguards-level Enforcement

排除命名空间

还可以从部署安全措施中排除某些命名空间。 排除命名空间后,该命名空间中的活动不受部署安全措施警告或强制措施的影响。

例如,若要排除命名空间 ns1ns2,请使用以逗号分隔的命名空间列表和 --safeguards-excluded-ns 标志,如以下示例所示:

az aks update --name myAKSCluster --resource-group myResourceGroup --safeguards-level Warning --safeguards-version v2.0.0 --safeguards-excluded-ns ns1,ns2 

更新部署安全措施版本

注意

v2.0.0 是最新版本的部署安全措施。

使用 az aks update 命令,并将 --safeguards-version 标志设置为新版本,以更新部署安全措施版本。 以下示例将现有群集更新为使用版本 2.0.0:

az aks update --name myAKSCluster --resource-group myResourceGroup --safeguards-version v2.0.0

验证群集之间的合规性

部署 Kubernetes 清单后,如果群集不符合部署安全措施,则会在 CLI 或终端中看到警告或潜在拒绝消息,如以下示例所示:

警告

$ kubectl apply -f pod.yml
Warning: [azurepolicy-k8sazurev2containerenforceprob-0e8a839bcd103e7b96a8] Container <my-container> in your Pod <my-pod> has no <livenessProbe>. Required probes: ["readinessProbe", "livenessProbe"]
Warning: [azurepolicy-k8sazurev2containerenforceprob-0e8a839bcd103e7b96a8] Container <my-container> in your Pod <my-pod> has no <readinessProbe>. Required probes: ["readinessProbe", "livenessProbe"]
Warning: [azurepolicy-k8sazurev1restrictedlabels-67c4210cc58f28acdfdb] Label <{"kubernetes.azure.com"}> is reserved for AKS use only
Warning: [azurepolicy-k8sazurev3containerlimits-a8754961dbd4c1d8b49d] container <my-container> has no resource limits
Warning: [azurepolicy-k8sazurev1containerrestrictedi-bde07e1776cbcc9aa8b8] my-pod in default does not have imagePullSecrets. Unauthenticated image pulls are not recommended.
pod/my-pod created

强制

通过部署安全措施变更,Enforcement 级别在适用时会变更 Kubernetes 资源。 但是,Kubernetes 资源仍需要通过所有安全措施才能成功部署。 如果任何安全措施策略失败,资源将被拒绝,不会进行部署。

$ kubectl apply -f pod.yml
Error from server (Forbidden): error when creating ".\pod.yml": admission webhook "validation.gatekeeper.sh" denied the request: [azurepolicy-k8sazurev2containerenforceprob-0e8a839bcd103e7b96a8] Container <my-container> in your Pod <my-pod> has no <livenessProbe>. Required probes: ["readinessProbe", "livenessProbe"]
[azurepolicy-k8sazurev2containerenforceprob-0e8a839bcd103e7b96a8] Container <my-container> in your Pod <my-pod> has no <readinessProbe>. Required probes: ["readinessProbe", "livenessProbe"]
[azurepolicy-k8sazurev2containerallowedimag-1ff6d14b2f8da22019d7] Container image my-image for container my-container has not been allowed.
[azurepolicy-k8sazurev1restrictedlabels-67c4210cc58f28acdfdb] Label <{"kubernetes.azure.com"}> is reserved for AKS use only
[azurepolicy-k8sazurev1containerrestrictedi-bde07e1776cbcc9aa8b8] my-pod in default does not have imagePullSecrets. Unauthenticated image pulls are not recommended.

如果 Kubernetes 资源符合适用的变更安全措施并满足所有其他安全措施要求,则会成功部署,如以下示例所示:

$ kubectl apply -f pod.yml
pod/my-pod created

使用 Azure Policy 仪表板验证群集之间的合规性

若要验证是否已应用部署安全措施并检查群集的合规性,请导航到群集的 Azure 门户页,然后选择“策略”,然后选择“转到 Azure Policy”

从策略和计划列表中,选择与部署安全措施关联的计划。 你会看到一个仪表板,其中显示了 AKS 群集中的合规性状态。

注意

若要正确评估 AKS 群集的合规性,Azure Policy 计划的范围必须限定为群集的资源组。

禁用部署安全措施

使用 az aks update 命令在群集上禁用部署安全措施,并将 --safeguards-level 设置为 Off

az aks update --name myAKSCluster --resource-group myResourceGroup --safeguards-level Off

--

常见问题解答

我首次使用 Azure Policy 启用了部署安全措施。 为什么看不到任何警告? 为什么我的 Pod 不会被拒绝?

首次启用 Azure Policy 后,最多可能需要 35 分钟才能与群集同步。

我刚刚从警告切换到强制。 这会立即生效吗?

切换部署保护级别时,最多可能需要等待 15 分钟才能使新级别生效。

我可以创建自己的变更吗?

否。 如果你有安全措施方面的想法,请在 AKS GitHub 存储库中提出问题,并将 [deployment safeguards request] 添加到标题开头。

启用“强制”后,我可以选择想要进行的变更吗?

否。 部署安全措施要么全部启用,要么全部禁用。 启用“警告”或“强制”后,所有安全措施都将处于活动状态。

为什么即使部署资源未遵循最佳做法,还是得到接纳?

部署安全措施通过 Azure Policy 控件强制实施最佳做法标准,并具有针对 Kubernetes 资源进行验证的策略。 为了评估和强制实施群集组件,Azure Policy 扩展 Gatekeeper。 Gatekeeper 强制目前也在 fail-open 模型中运行。 由于无法保证 Gatekeeper 将响应我们的网络调用,因此请确保在这种情况下,跳过验证,以免拒绝阻止部署。

若要了解详细信息,请参阅 Gatekeeper 中的工作负荷验证

后续步骤