练习 - 在 AKS 群集上为 Kubernetes 配置 Azure Policy

已完成

Azure Policy for Kubernetes 可帮助组织满足治理和法律要求,实施最佳做法,并为云环境建立组织约定。

公司中的开发团队将 Azure Kubernetes 服务(AKS)作为开发平台。 你意识到管理成本的最佳方式是强制实施定义工作负荷资源限制的业务规则。 你希望确保开发人员只能在 CPU 和内存分配的特定限制内部署工作负荷。 系统必须防止超出这些限制的工作负荷。

在本练习中,你将在群集上为 AKS 启用 Azure Policy,并添加 Kubernetes 群集容器 CPU 和内存资源限制不应超过指定的限制 策略。 然后,你将测试策略是否不允许安排超过策略资源参数的工作负荷。

启用 ContainerService 和 PolicyInsights 资源提供程序

  1. 使用 Azure 帐户登录到 Azure Cloud Shell。 选择 Cloud Shell 的 Bash 版本。

  2. 适用于 AKS 的 Azure Policy 要求群集版本为 1.14 或更高版本。 运行以下脚本来验证 AKS 群集版本:

    az aks list
    

    确保报告的群集版本为 1.14 或更高版本。

  3. 通过运行以下命令 az provider register 注册 Azure Kubernetes 服务提供程序:

    az provider register --namespace Microsoft.ContainerService
    
  4. 通过运行以下命令 az provider register 注册 Azure Policy 提供程序:

    az provider register --namespace Microsoft.PolicyInsights
    
  5. 通过运行以下命令 az feature register 启用加载项安装:

    az feature register --namespace Microsoft.ContainerService --name AKS-AzurePolicyAutoApprove
    
  6. 通过查询功能列表表检查注册是否成功。 az feature list使用命令运行查询。 该功能的注册可能需要几分钟才能完成,因此必须定期检查结果。

    az feature list -o table --query "[?contains(name, 'Microsoft.ContainerService/AKS-AzurePolicyAutoApprove')].   {Name:name,State:properties.state}"
    

    如果 Cloud Shell 会话超时,则可以使用 预览载入窗格通过 Azure 门户跟踪注册过程。

  7. 确认功能列表查询命令显示“已注册”后,运行 az provider register 命令以传播更新:

    az provider register -n Microsoft.ContainerService
    

在群集上启用 Azure Policy

  1. 运行 az aks enable-addons 命令,为群集启用 azure-policy 加载项:

    az aks enable-addons \
        --addons azure-policy \
        --name $AKS_CLUSTER_NAME \
        --resource-group $RESOURCE_GROUP
    
  2. 验证 azure-policy Pod 是否已安装在命名空间 kube-system 中,以及 gatekeeper Pod 是否已安装在命名空间 gatekeeper-system 中。 为此,请运行以下 kubectl get pods 命令:

    kubectl get pods -n kube-system
    

    输出应如下所示:

    NAME                                    READY   STATUS    RESTARTS   AGE
    azure-policy-78c8d74cd4-7fqn2           1/1     Running   0          12m
    azure-policy-webhook-545c898766-gsjrc   1/1     Running   0          12m
    ...
    
    kubectl get pods -n gatekeeper-system
    

    输出应如下所示:

    NAME                                            READY   STATUS    RESTARTS   AGE
    gatekeeper-controller-manager-d5cd87796-5tmhq   1/1     Running   0          15m
    ...
    
  3. 最后,通过运行 az aks show 命令验证是否已安装最新的加载项。 此命令检索群集的配置信息。

    az aks show \
     --resource-group $RESOURCE_GROUP\
     --name $AKS_CLUSTER_NAME \
     -o table --query "addonProfiles.azurepolicy"
    

    输出应如下所示:

    {
        "config": null,
        "enabled": true,
        "identity": null
    }
    

    现在,可以切换到 Azure 门户来配置名为 Kubernetes 群集容器 CPU 和内存资源限制的策略不应超过指定的限制

分配内置策略定义

若要配置新的 Azure Policy,请在 Azure 门户中使用 Policy 服务。

  1. 登录到 Azure 门户

  2. 在 Azure 门户中找到 策略 服务。 为此,请在门户顶部的搜索栏中搜索并选择 “策略”。

  3. 从服务列表中选择 策略 服务,如下所示:

    常规 Azure 门户搜索框的屏幕截图,其结果显示 Azure Policy 服务。

    此时会打开“策略”仪表板,其中概述了所有分配的策略、资源的状态以及策略如何影响它们。 如果尚未分配任何策略,仪表板为空。

  4. 在左侧菜单窗格中的 “创作”下,选择“ 工作分配

    策略服务导航面板的屏幕截图,其中显示了“分配”选项的位置。

  5. 回想一下我们之前的描述,你有两个选项可以创建一个策略分配:你可以分配一个方案或一个策略。 在顶部菜单栏中,选择 “分配策略

    显示新策略分配选项的屏幕截图。

    此时会显示 “分配策略 ”窗格。

  6. 在“ 基本信息 ”选项卡上,为每个设置输入以下值来创建策略。

    设置 价值
    范围
    范围 选择省略号按钮。 此时会显示 “作用域 ”窗格。 在 订阅下,选择包含您的资源组的订阅。 对于 资源组,选择 rg-akscostsaving,然后选择“选择”按钮。
    排除事项 留空。
    基础知识
    策略定义 选择省略号按钮。 此时会显示 “可用定义 ”窗格。 在 “搜索 ”框中,输入 CPU 来筛选所选内容。 在“ 策略定义 ”选项卡上,选择 Kubernetes 群集容器 CPU 和内存资源限制不应超过指定的限制,然后选择“ 添加”。
    版本 接受默认值。
    分配名称 接受默认值。
    DESCRIPTION 留空。
    策略强制执行 确保此选项设置为 “已启用”。

    下面是已完成的基本信息选项卡的示例:

    显示“基本信息”选项卡中捕获的信息的屏幕截图。

  7. 选择“ 参数 ”选项卡以指定策略的参数。

  8. 为每个参数设置设置设置以下值:

    设置 价值
    允许的最大 CPU 单位数 将值设置为 200m。 策略将此值与工作负荷的清单文件中指定的工作负荷资源请求值和工作负荷限制值相匹配。
    允许的最大内存字节数 将值设置为 256Mi。 策略将此值与工作负荷的清单文件中指定的工作负荷资源请求值和工作负荷限制值相匹配。

    将所有其他值保留为默认值。 下面是已完成的参数选项卡的示例:

    显示“参数”选项卡中捕获的信息的屏幕截图。

  9. 选择 “修正 ”选项卡。在此选项卡中,你将选择新策略如何影响已存在的资源。 默认情况下,新策略仅检查新创建的资源。 保留标准默认配置。

    这里是已完成的补救选项卡的示例:

    显示“修正”选项卡中捕获的信息的屏幕截图。

  10. 选择“ 审阅 + 创建 ”选项卡。查看所选的值,然后选择“ 创建”。

重要

如果使用现有的 AKS 群集,策略分配可能需要大约 15 分钟才能应用。

测试资源请求

最后一步是测试新策略。 部署其资源请求和限制违反了新策略的测试工作负载。 如果一切正常进行,则服务器将返回错误,指出已被策略拒绝。

  1. 打开 Azure Cloud Shell,并确保选择 Cloud Shell 的 Bash 版本。

  2. 在 Cloud Shell 窗口顶部,选择 “设置>转到经典版本”。

  3. 使用集成编辑器为 Kubernetes 部署创建清单文件。 调用文件 test-policy.yaml

    code test-policy.yaml
    

    小窍门

    Cloud Shell 包括 集成文件编辑器。 Cloud Shell 编辑器支持语言突出显示、命令面板和文件资源管理器等功能。 若要创建和编辑简单的文件,请在 Cloud Shell 终端中运行 code . 编辑器。 该操作会通过终端中设置的活动工作目录打开编辑器。 若要直接打开清单文件以便快速编辑,请运行 code test-policy.yaml。 此命令将打开没有文件资源管理器的编辑器。

  4. 将以下文本粘贴到文件中:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 500m
            memory: 256Mi
          limits:
            cpu: 1000m
            memory: 500Mi
    
  5. Ctrl+S 保存文件,然后按 Ctrl+Q 关闭编辑器。

  6. 运行kubectl apply命令以应用配置,并在costsavings命名空间中部署应用程序。

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    输出应如下所示:

    Error from server (
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>)
     : error when creating "test-deploy.yml"
     : admission webhook "validation.gatekeeper.sh" denied the request: 
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>
    

    请注意,准入 Webhook validation.gatekeeper.sh 拒绝了调度 Pod 的请求。

  7. 打开清单文件并修复资源请求:

    code test-policy.yaml
    

    将文本替换为以下文本:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 200m
            memory: 256Mi
          limits:
            cpu: 200m
            memory: 256Mi
    
  8. Ctrl+S 保存文件,然后按 Ctrl+Q 关闭编辑器。

  9. 运行kubectl apply命令以应用配置,并在costsavings命名空间中部署应用程序。

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    你将获得以下输出:

    pod/nginx created
    
  10. 获取在 costsavings 命名空间中新建的 Pod 的 Pod。

    kubectl get pods --namespace costsavings
    

    几秒钟内,Pod 将转换为 Running 状态。

    NAME    READY   STATUS    RESTARTS   AGE
    nginx   1/1     Running   0          50s
    
  11. 看到 Pod 运行后,按 Ctrl+C 停止监视。