练习 - 在 AKS 群集上为 Kubernetes 配置 Azure Policy
Azure Policy for Kubernetes 可帮助组织满足治理和法律要求,实施最佳做法,并为云环境建立组织约定。
公司中的开发团队将 Azure Kubernetes 服务(AKS)作为开发平台。 你意识到管理成本的最佳方式是强制实施定义工作负荷资源限制的业务规则。 你希望确保开发人员只能在 CPU 和内存分配的特定限制内部署工作负荷。 系统必须防止超出这些限制的工作负荷。
在本练习中,你将在群集上为 AKS 启用 Azure Policy,并添加 Kubernetes 群集容器 CPU 和内存资源限制不应超过指定的限制 策略。 然后,你将测试策略是否不允许安排超过策略资源参数的工作负荷。
启用 ContainerService 和 PolicyInsights 资源提供程序
使用 Azure 帐户登录到 Azure Cloud Shell。 选择 Cloud Shell 的 Bash 版本。
适用于 AKS 的 Azure Policy 要求群集版本为 1.14 或更高版本。 运行以下脚本来验证 AKS 群集版本:
az aks list
确保报告的群集版本为 1.14 或更高版本。
通过运行以下命令
az provider register
注册 Azure Kubernetes 服务提供程序:az provider register --namespace Microsoft.ContainerService
通过运行以下命令
az provider register
注册 Azure Policy 提供程序:az provider register --namespace Microsoft.PolicyInsights
通过运行以下命令
az feature register
启用加载项安装:az feature register --namespace Microsoft.ContainerService --name AKS-AzurePolicyAutoApprove
通过查询功能列表表检查注册是否成功。
az feature list
使用命令运行查询。 该功能的注册可能需要几分钟才能完成,因此必须定期检查结果。az feature list -o table --query "[?contains(name, 'Microsoft.ContainerService/AKS-AzurePolicyAutoApprove')]. {Name:name,State:properties.state}"
如果 Cloud Shell 会话超时,则可以使用 预览载入窗格通过 Azure 门户跟踪注册过程。
确认功能列表查询命令显示“已注册”后,运行
az provider register
命令以传播更新:az provider register -n Microsoft.ContainerService
在群集上启用 Azure Policy
运行
az aks enable-addons
命令,为群集启用azure-policy
加载项:az aks enable-addons \ --addons azure-policy \ --name $AKS_CLUSTER_NAME \ --resource-group $RESOURCE_GROUP
验证 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 ...
最后,通过运行
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 服务。
登录到 Azure 门户。
在 Azure 门户中找到 策略 服务。 为此,请在门户顶部的搜索栏中搜索并选择 “策略”。
从服务列表中选择 策略 服务,如下所示:
此时会打开“策略”仪表板,其中概述了所有分配的策略、资源的状态以及策略如何影响它们。 如果尚未分配任何策略,仪表板为空。
在左侧菜单窗格中的 “创作”下,选择“ 工作分配:
回想一下我们之前的描述,你有两个选项可以创建一个策略分配:你可以分配一个方案或一个策略。 在顶部菜单栏中,选择 “分配策略”
此时会显示 “分配策略 ”窗格。
在“ 基本信息 ”选项卡上,为每个设置输入以下值来创建策略。
设置 价值 范围 范围 选择省略号按钮。 此时会显示 “作用域 ”窗格。 在 订阅下,选择包含您的资源组的订阅。 对于 资源组,选择 rg-akscostsaving,然后选择“选择”按钮。 排除事项 留空。 基础知识 策略定义 选择省略号按钮。 此时会显示 “可用定义 ”窗格。 在 “搜索 ”框中,输入 CPU 来筛选所选内容。 在“ 策略定义 ”选项卡上,选择 Kubernetes 群集容器 CPU 和内存资源限制不应超过指定的限制,然后选择“ 添加”。 版本 接受默认值。 分配名称 接受默认值。 DESCRIPTION 留空。 策略强制执行 确保此选项设置为 “已启用”。 下面是已完成的基本信息选项卡的示例:
选择“ 参数 ”选项卡以指定策略的参数。
为每个参数设置设置设置以下值:
设置 价值 允许的最大 CPU 单位数 将值设置为 200m。 策略将此值与工作负荷的清单文件中指定的工作负荷资源请求值和工作负荷限制值相匹配。 允许的最大内存字节数 将值设置为 256Mi。 策略将此值与工作负荷的清单文件中指定的工作负荷资源请求值和工作负荷限制值相匹配。 将所有其他值保留为默认值。 下面是已完成的参数选项卡的示例:
选择 “修正 ”选项卡。在此选项卡中,你将选择新策略如何影响已存在的资源。 默认情况下,新策略仅检查新创建的资源。 保留标准默认配置。
这里是已完成的补救选项卡的示例:
选择“ 审阅 + 创建 ”选项卡。查看所选的值,然后选择“ 创建”。
重要
如果使用现有的 AKS 群集,策略分配可能需要大约 15 分钟才能应用。
测试资源请求
最后一步是测试新策略。 部署其资源请求和限制违反了新策略的测试工作负载。 如果一切正常进行,则服务器将返回错误,指出已被策略拒绝。
打开 Azure Cloud Shell,并确保选择 Cloud Shell 的 Bash 版本。
在 Cloud Shell 窗口顶部,选择 “设置>转到经典版本”。
使用集成编辑器为 Kubernetes 部署创建清单文件。 调用文件
test-policy.yaml
:code test-policy.yaml
小窍门
Cloud Shell 包括 集成文件编辑器。 Cloud Shell 编辑器支持语言突出显示、命令面板和文件资源管理器等功能。 若要创建和编辑简单的文件,请在 Cloud Shell 终端中运行
code .
编辑器。 该操作会通过终端中设置的活动工作目录打开编辑器。 若要直接打开清单文件以便快速编辑,请运行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: 500m memory: 256Mi limits: cpu: 1000m memory: 500Mi
按 Ctrl+S 保存文件,然后按 Ctrl+Q 关闭编辑器。
运行
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 的请求。打开清单文件并修复资源请求:
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
按 Ctrl+S 保存文件,然后按 Ctrl+Q 关闭编辑器。
运行
kubectl apply
命令以应用配置,并在costsavings
命名空间中部署应用程序。kubectl apply \ --namespace costsavings \ -f test-policy.yaml
你将获得以下输出:
pod/nginx created
获取在
costsavings
命名空间中新建的 Pod 的 Pod。kubectl get pods --namespace costsavings
几秒钟内,Pod 将转换为
Running
状态。NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 50s
看到 Pod 运行后,按 Ctrl+C 停止监视。